解决Filter 无法过滤Servlet的Bug

解决Filter 无法过滤Servlet的Bug

可能出现的情况

绕过登录访问某一个资源的时候,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版权协议,转载请附上原文出处链接和本声明。