可能出现的情况
绕过登录访问某一个资源的时候,filter正常工作,但是绕过登录访问某一个servlet的时候,Servlet实际会被执行,但是无法跳转到指定页面。会出现如下报错
java.lang.IllegalStateException: 提交响应后无法转发
情况分析
这是我的错误状态时的Filter
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String user_session = (String) req.getSession().getAttribute("USER_SESSION");
if (user_session==null){
resp.sendRedirect(req.getContextPath()+"/Login.jsp");
}
filterChain.doFilter(servletRequest,servletResponse);
}
请求资源的时候,filter可以通过sendRedirect 把请求支开,做到无法访问指定请求
但是请求Servlet的时候,filter只是暂时Redirect了访问的请求,但是依旧会执行doFilter这一行指令,进而执行Servlet;
当Servlet进行访问页面(重定向或请求转发)时,Filter会再次起作用,导致虽然用户无法访问到指定界面,但Servlet实际已经被执行
解决方法
在Filter的重定向之后,加上return 打断请求,使之不能进行doFilter,就不能继续Servlet了
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String user_session = (String) req.getSession().getAttribute("USER_SESSION");
if (user_session==null){
resp.sendRedirect(req.getContextPath()+"/Login.jsp");
return;
}
filterChain.doFilter(servletRequest,servletResponse);
}
版权声明:本文为qq_29157223原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。