这种是由于条件判断有误,程序不断的重定向到一个页面,而造成的死循环的情况
下面列举一个常出现的场景之一
1、使用过滤器实现登录验证错误处理
解释:当用户访问login.jsp进行登录的时候,这个时候请求会被Filter捕获,Filter通过session获取用户登录成功之后的信息,但是此时用户并没有登录,程序又会重定向到login.jsp。
这个时候就会出现程序进入Filter后返回重定向到login.jsp.
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("=============loginFilter=============");
//进来之后我需要判断当前用户有没有登录,如果登录放行,否则去登录页
//1、获取当前的请求地址
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
HttpSession session=request.getSession();
UserInfo user=(UserInfo)session.getAttribute("userinfo");
if(user==null){
response.sendRedirect("login.jsp");
return ;
}
//FilterChain过滤链,进行放行
filterChain.doFilter(servletRequest, servletResponse);
}
2、正确的Filter的写法
这个时候我们需要获取当前用户的请求地址,当请求地址URL中包含login等登录字样的时候,直接放行,让用户去登录,而不是拦截。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("=============loginFilter=============");
//进来之后我需要判断当前用户有没有登录,如果登录放行,否则去登录页
//1、获取当前的请求地址
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
String url=request.getRequestURI();
System.out.println("==url=="+url);
//如果请求的地址中包含了login字样,说明用户正在登录,放行。
//indexOf判断login在url字符串中首次出现的索引的位置
if(url.indexOf("login")>=0 || url.indexOf("userinfo.do")>=0){
//用户在登录中,放行
filterChain.doFilter(servletRequest, servletResponse);
return ;
}
HttpSession session=request.getSession();
UserInfo user=(UserInfo)session.getAttribute("userinfo");
System.out.println("==user==filter==="+user);
if(user==null){
response.sendRedirect("login.jsp");
return ;
}
//FilterChain过滤链,进行放行
filterChain.doFilter(servletRequest, servletResponse);
}