【问题标题】:Filters: client and server side redirecting过滤器:客户端和服务器端重定向
【发布时间】:2012-07-11 07:14:20
【问题描述】:

这是我的过滤器:

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

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

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

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

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>

【问题讨论】:

  • 能否请您在 web.xml 中发布您的过滤器映射

标签: java servlets servlet-filters


【解决方案1】:

发生这种情况是因为您正在重定向所有 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"); 。你有maintenance.jsp 相对于每个网址的页面吗?我认为你应该有一个 /maintenance.jsp 页面。在这种情况下,无论您访问的页面如何,都必须始终重定向到 response.sendRedirect(/maintenance.jsp)

【讨论】:

  • 是的,我有一页要维护: if (!currentURL.equals("/maintenance.jsp") && maintenanceMode.getMaintenanceMode()) { response.sendRedirect("/maintenance.jsp") ; }
  • 是的,这就是我批准你的回答的原因:) 无论如何谢谢你!
【解决方案2】:
<filter-mapping>
<filter-name>maintenanceFilter</filter-name>
<url-pattern>/*</url-pattern>

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

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

【讨论】:

  • 你的意思是脏编码之类的:localhost:8080/*?此外,我正在考虑从 web.xml 迁移到 spring bean
  • 脏编码是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多