Domanda

Quindi spero di utente UrlRewriteFilter di Tuckey per reindirizzare gli utenti che tentano di accedere alle versioni precedenti di un prodotto Web-Service. Cose semplici come reindirizzare www.blah.com/oldversion/blah/blah a www.blah.com/newversion/blah/blah

Ho trascorso un po 'di tempo a cercare di impostare correttamente questo secondo le istruzioni un po' vaghe su Tuckey sito web Ma ho alcune difficoltà.

Ho i file nelle posizioni corrette. Urlrewrite.xml è nella cartella Web-INF del pacchetto WebApp, adiacente a Web.xml. Urlrewrite-3.2.0.jar è nella cartella Lib del Web-INF.

Ecco il mio 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>

Ecco il mio 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>

Quando costruisco e distribuisco il progetto, queste linee relative a UrlRewriteFilter sono stampate nel registro del server:

[#|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)|#]

Quando provo ad accedere a un URL a 2.0, dovrebbe reindirizzarmi a 3.2-Snapshot. Invece, ricevo un errore 404. Nulla viene visualizzato nel server.log e nei miei registri di errore Java vedo che il pacchetto UrlRewriteFilter non viene mai toccato. Quindi penso che ci debba essere qualcosa di errato nella mia configurazione.

Fammi sapere se hai bisogno di ulteriori informazioni e grazie per il tuo tempo e assistenza.

È stato utile?

Soluzione

Il problema è finito per essere correlato al POM.xml del mio pacchetto auricolare. In questo, la radice di contesto dell'applicazione è stata impostata sull'inclusione del pezzo dell'URI in cui stavo tentando di cambiare. Poiché l'applicazione sarebbe accessibile solo quando la radice del contesto è stata abbinata, Tuckey potrebbe ovviamente non essere utilizzato.

Ex: l'utente inserisce l'URL www.blank.com/2.0/etc e volevo reindirizzare su www.blank.com/3.0/etc

Snippet Earrect Ear Pom:

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

Snippet corretto dell'orecchio POM:

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

Poiché non ho più questo root di contesto specificato, ovviamente devo modificare i parametri del percorso per i miei vari URI in tutto il programma per includere il numero di versione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top