过滤器:客户端和服务器端重定向

时间:2012-07-11 07:14:21

标签: java servlets servlet-filters

这是我的过滤器:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws java.io.IOException, javax.servlet.ServletException
{
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    String currentURL = request.getRequestURI();
    MaintenanceService maintenanceMode = new MaintenanceService();

    if (maintenanceMode.getMaintenanceMode())
    {
        String urlNew = currentURL.concat("maintenance.jsp");
        response.sendRedirect(urlNew);

    }
    filterChain.doFilter(servletRequest, servletResponse);
}

“在”maintenanceMode.getMaintenanceMode()下,我有变量getter:

boolean maintenanceMode = Boolean.getBoolean("maintenance");

使用转发(服务器端重定向),当我尝试客户端重定向时,它可以正常工作:

response.sendRedirect(urlNew);

我发生了无限次的维护.jsp连接:

http://localhost:8080/maintenance.jspmaintenance.jspmaintenance.jspmaintenance.jspmaintenance.jsp

为什么它没有重定向到一个事件,比如服务器端重定向:

http://localhost:8080/maintenance.jsp

Web.xml过滤器映射:

<filter-mapping>
    <filter-name>maintenanceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您正在重定向所有网址,包括maintenance.jsp。它导致无限重定向。

仅当当前网址不是maintenance.jsp时修改了重定向条件才能重定向。

以下是我的更改后代码的显示方式:

public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,
      FilterChain filterChain)
    throws java.io.IOException, javax.servlet.ServletException
{
   HttpServletRequest request = (HttpServletRequest) servletRequest;
   HttpServletResponse response = (HttpServletResponse) servletResponse;
   String currentURL = request.getRequestURI();
   MaintenanceService maintenanceMode = new MaintenanceService();
   if (!currentURL.equals("/maintenance.jsp") 
            && maintenanceMode.getMaintenanceMode())
   {
    String urlNew = currentURL.concat("maintenance.jsp");
    response.sendRedirect(urlNew);
   }
   filterChain.doFilter(servletRequest, servletResponse);
}

我不明白为什么你为每个网址做String urlNew = currentURL.concat("maintenance.jsp"); 。你有关于每个网址的maintenance.jsp页面吗?我认为你应该有一个/maintenance.jsp页面。在这种情况下,无论您正在访问哪个页面,都必须始终重定向到response.sendRedirect(/maintenance.jsp)

答案 1 :(得分:0)

<filter-mapping>
<filter-name>maintenanceFilter</filter-name>
<url-pattern>/*</url-pattern>

在过滤器映射中,您的所有请求(它们在被重定向时是新请求)都符合此条件filter这就是为什么在每个请求上无限次调用过滤器的原因。

您可以通过一种方式为特定url-pattern

调用此过滤器