这是我的过滤器:
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>
答案 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