Question

J'espère donc utiliser UrlRewriteFilter de Tuckey pour rediriger les utilisateurs qui tentent d'accéder aux anciennes versions d'un produit de service Web. Des trucs simples comme rediriger www.blah.com/oldversion/blah/blah vers www.blah.com/newversion/blah/blah

J'ai passé un peu de temps à essayer de configurer correctement cela selon les instructions quelque peu vagues sur site Web mais j'ai des difficultés.

J'ai les fichiers aux bons emplacements. urlrewrite.xml se trouve dans le dossier WEB-INF du package webapp, adjacent à web.xml. Le fichier urlrewrite-3.2.0.jar se trouve dans le dossier lib de WEB-INF.

Voici mon web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

<filter>
   <filter-name>UrlRewriteFilter</filter-name>
   <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>UrlRewriteFilter</filter-name>
   <url-pattern>/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>
    <filter-name>Jersey Web Application</filter-name>
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
    </init-param>
    <!--
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
    </init-param>
    -->
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>project's.security.filter</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>project's.base.package</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Jersey Web Application</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<ejb-local-ref>
    REFERENCED EJB
</ejb-local-ref>

<ejb-local-ref>
    REFERENCED EJB
</ejb-local-ref>
</web-app>

Voici mon urlrewrite.xml:

<?xml version="1.0" encoding="utf-8"?>
<!--
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
    "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">-->


<!--

Configuration file for UrlRewriteFilter
http://tuckey.org/urlrewrite/

-->
<urlrewrite>

<rule>
    <from>^/2.0/rest/$</from>
    <to type="redirect">/3.2-SNAPSHOT/rest/$1</to>
</rule>
<rule>
    <note>
        The rule means that requests to /test/status/ will be redirected to /rewrite-status
        the url will be rewritten.
    </note>
    <from>/test/status/</from>
    <to type="redirect">%{context-path}/rewrite-status</to>
</rule>


<outbound-rule>
    <note>
        The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
        the url /rewrite-status will be rewritten to /test/status/.

        The above rule and this outbound-rule means that end users should never see the
        url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
        in your pages.
    </note>
    <from>/rewrite-status</from>
    <to>/test/status/</to>
</outbound-rule>

</urlrewrite>

Lorsque je construis et déploie le projet, ces lignes relatives à UrlRewriteFilter sont imprimées dans le journal du serveur:

[#|2011-12-06T10:28:56.924-0500|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=24;_ThreadName=Thread-2;|PWC1412: WebModule[null] ServletContext.log():org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: destroy called|#]
...
[#|2011-12-06T10:29:04.069-0500|INFO|glassfish3.1.1|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=24;_ThreadName=Thread-2;|PWC1412: WebModule[null] ServletContext.log():org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: loaded (conf ok)|#]

Quand j'essaye d'accéder à une URL à 2.0, il devrait me rediriger vers 3.2-SNAPSHOT. Au lieu de cela, je reçois une erreur 404. Rien n'apparaît dans le server.log, et dans mes journaux d'erreur java, je vois que le package UrlRewriteFilter n'est jamais touché. Je pense donc qu'il doit y avoir quelque chose d'incorrect dans ma configuration.

Faites-moi savoir si vous avez besoin de plus d'informations, et merci pour votre temps et votre aide.

Était-ce utile?

La solution

Le problème a fini par être lié au pom.xml de mon paquet d'oreille.En cela, la racine de contexte de l'application a été définie sur inclure la partie de l'URI que j'essayais de changer.Étant donné que l'application ne serait accessible que lorsque la racine du contexte correspondait, tuckey ne pouvait bien sûr pas être utilisé.

ex: l'utilisateur entre l'URL www.blank.com/2.0/etc et je voulais rediriger vers www.blank.com/3.0/etc

Extrait de pompon d'oreille incorrect:

<webModule>
    <groupId>com.etc</groupId>
    <artifactId>webservice-rest-webapp</artifactId>
    <contextRoot>/3.0/</contextRoot>
</webModule>

extrait de pompon d'oreille correct:

<webModule>
    <groupId>com.etc</groupId>
    <artifactId>webservice-rest-webapp</artifactId>
    <contextRoot>/</contextRoot>
</webModule>

Comme je n'ai plus cette racine de contexte spécifiée, je dois bien sûr modifier les paramètres de chemin pour mes différents URI dans tout le programme pour inclure le numéro de version.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top