3

那是我的过滤器:

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);

我得到了一个无限出现的maintenance.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>
4

2 回答 2

2

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

将重定向条件修改为仅当当前 url 不是时才重定向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"); 为每个 url 做。您是否有maintenance.jsp与每个网址相关的页面。我认为你应该只有一个/maintenance.jsp页面。response.sendRedirect(/maintenance.jsp)在这种情况下,无论您访问的页面如何,都必须始终重定向到。

于 2012-07-11T07:37:23.090 回答
0
<filter-mapping>
<filter-name>maintenanceFilter</filter-name>
<url-pattern>/*</url-pattern>

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

一种方法是您可以将此过滤器称为特定的url-pattern

于 2012-07-11T07:28:13.603 回答