2013-03-26 3 views
1

Я пытаюсь переписать URL из:сервлет фильтр переписать URL

  • localhost:8080/sendEmail/newEmail.pdf?request_id=23456&emailAddress=

To:

  • localhost:8080/sendEmail/newEmail.pdf?request_id=23456

Класс фильтра кода и отображения ниже. Как я могу выполнить эту задачу? (Ответ на пример будет высоко оценен).

фильтр отображения:

<filter> 
    <filter-name>RequestFilter</filter-name> 
    <filter-class>com.abc.ms.email.filter.RequestFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>RequestFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

фильтр код:

public class RequestFilter implements Filter { 
    private static final Pattern REWRITE_PATTERN = Pattern.compile("(^[1-9]\\d*)$"); 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException { 
     HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper((HttpServletRequest)req); 
     String url = wrapper.getRequestURL().toString(); 
     String number = url.substring(url.lastIndexOf("/")).replace("/", ""); 
     Matcher m = REWRITE_PATTERN.matcher(number); 
     if (m.find()) { 
      RequestDispatcher dispatcher = wrapper.getRequestDispatcher("request?id=" + m.group(1)); 
      dispatcher.forward(req, res); 
     } else { 
      fc.doFilter(wrapper, res); 
     } 
    } 
} 

ответ

1

Я бы рекомендовал использовать существующую реализацию, а не писать это самостоятельно.

Реализация переписывания URL-адресов Java, которая является URL-адресом URL-адреса Tuckey's URLrewriteFilter.

См: http://tuckey.org/urlrewrite/

Это должно делать то, что вы хотите, и многое другое.

В качестве альтернативы, если вы используете apache перед своим веб-контейнером, вы можете посмотреть в mod_rewrite, что делает то же самое на apache.

http://httpd.apache.org/docs/current/mod/mod_rewrite.html

+0

Я понимаю reluctancy изобретать колесо, но я не может поверить, что кто-то подумает, что добавление Apache перед контейнером сервлета просто для перезаписи URL-адреса лучше, чем создание простого фильтра с несколькими строками кода. – stepanian

+0

@ stepanian да, это было бы излишним, поэтому я предложил Java-решение первым и сказал, что если у вас уже есть apache впереди (по каким-либо причинам), mod_rewrite может быть альтернативным подходом. – marc82ch

1

Если все, что вам действительно нужно, это один простой URL очистки затем с помощью регулярных выражений или модулей перезаписи URL может быть слишком много.

Совершенно простая реализация может пойти что-то вроде этого:

public class RequestFilter implements Filter { 

    private static final String LOOK_FOR = "sendEmail/newEmail.pdf"; 

    private static final String REMOVE = "&emailAddress="; 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException, ServletException { 
     HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper((HttpServletRequest)req); 
     String original = wrapper.getRequestURL().toString(); 
     if(original.contains(LOOK_FOR)) { 
      String filtered = StringUtils.substringBeforeLast(original, REMOVE); 
      RequestDispatcher dispatcher = wrapper.getRequestDispatcher(filtered); 
      dispatcher.forward(req, res); 
     } else { 
      fc.doFilter(wrapper, res); 
     } 
    } 
} 

Это легко устройство тестировалось с помощью org.springframework.mock.web.* классов:

public class RequestFilterTest { 

    private RequestFilter filter; 

    @Before 
    public void setUp() { 
     filter = new RequestFilter(); 
    } 

    @Test 
    public void testRedirect() throws IOException, ServletException { 
     MockHttpServletRequest request = new MockHttpServletRequest("GET", 
       "/sendEmail/newEmail.pdf?request_id=23456&emailAddress="); 
     MockHttpServletResponse response = new MockHttpServletResponse(); 
     MockFilterChain fc = new MockFilterChain(); 

     filter.doFilter(request , response, fc); 

     Assert.assertEquals("http://localhost:80/sendEmail/newEmail.pdf?request_id=23456", response.getForwardedUrl()); 
    } 
} 
Смежные вопросы