关与过滤器中的重定向问题
问题来源:学习B站狂神说java-web课程。
局部项目结构如下
过滤器注册:
<filter>
<filter-name>sys</filter-name>
<filter-class>com.goo.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sys</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
错误代码:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if(request.getSession().getAttribute(USER_SESSION)==null){
response.sendRedirect(request.getContextPath()+"/jsp/error.jsp");
}else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
经过资料分析:问题在于,过滤器过滤了jsp目录下的所有jsp文件,那么,退出登陆以后,重定向到error.jsp,同样经过过滤器,这就出现了死循环,导致重定向次数过多。
解决方法:
-
改重定向为转发:
response.sendRedirect(request.getContextPath()+"/jsp/error.jsp"); 改为 request.getRequestDispatcher(request.getContextPath()+"/jsp/error.jsp").forward(servletRequest, servletResponse);
-
把error.jsp这个文件,从jsp这个目录下拿出来,放到webapp这个目录下,并且把重定向语句改为
response.sendRedirect(request.getContextPath()+"/error.jsp");
这两种写法,可以解决重定向次数过多的问题,是否存在隐患,尚且不清楚。