在使用过滤器进行登录认证时,一般会有两个步骤:对白名单放行,登录状态认证。

需要注意的是,在进行第一步白名单放行时,放行后务必记得加个return语句终止下面的代码执行,因为如果在白名单内了,就说明是不需要进行认证登录状态的页面。

如果不加return的话,在访问白名单的页面时会进行第二步登录状态认证。当登录状态是假的情况下,一般使用request对象请求转发或者response对象重定向返回登录页面。但是,在前面第一步的时候request对象和response对象已经被放行过了,就不能再调用了,如果调用就会出现下面这种情况。

也就是说,过滤器中的请求和响应对象方法不能在放行后调用,否则会产生异常。

完整代码如下:

@WebFilter("/*")
public class AuthFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //转一下类型
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //白名单放开
        String requestURI = request.getRequestURI();
        if(requestURI.endsWith("index.jsp") || requestURI.endsWith("login.jsp")){
            chain.doFilter(req,resp);
            return;     //如果是不需要登录认证的 没必要进行下面的操作
        }
        //认证登录状态
        if(request.getSession().getAttribute("username") != null){
            chain.doFilter(req,resp);
        }else {
            //重定向:Cannot call sendRedirect() after the response has been committed
            //response.sendRedirect("login.jsp");

            //转发:Cannot forward after response has been committed
            request.setAttribute("info","请登录后访问。");
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }

    }

    public void init(FilterConfig config) throws ServletException {

    }

}
©著作权归作者所有

发表评论

正在加载 Emoji