简体   繁体   English

java.lang.IllegalStateException:在servletfilter中提交响应后无法转发

[英]java.lang.IllegalStateException: Cannot forward after response has been committed in servletfilter

I am using a filter to determine whether or not a requested page has a valid session or not. 我正在使用过滤器来确定请求的页面是否具有有效的会话。

This is my code. 这是我的代码。 web.xml : web.xml

    <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>
        com.imagemanagementutility.filter.SessionFilter
    </filter-class>
    <init-param>
        <param-name>avoid-urls</param-name>
        <param-value>index.jsp</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Filter class: 过滤器类别:

    public class SessionFilter implements Filter {

    private ArrayList<String> urlList;

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String url = request.getServletPath();
        boolean allowedRequest = false;
        System.out.println(url.replace("/",""));
        if (urlList.contains(url)) {
            allowedRequest = true;
        }

        if (!allowedRequest) {
            HttpSession session = request.getSession(false);
            if (null == session) {
                System.out.println("redirect in servlet session filter");
                RequestDispatcher dispatcher = request
                        .getRequestDispatcher("//index.jsp");
                dispatcher.forward(request, response);
            }
        }

            chain.doFilter(req, res);

        System.out.println("end");
    }

    public void init(FilterConfig config) throws ServletException {
        String urls = config.getInitParameter("avoid-urls");
        StringTokenizer token = new StringTokenizer(urls, ",");

        urlList = new ArrayList<String>();

        while (token.hasMoreTokens()) {
            urlList.add(token.nextToken());

        }
    }
}

I have a login page which is used to check whether or not the user is valid. 我有一个登录页面,用于检查用户是否有效。 If the user is valid then control is transfer to this servlet. 如果用户有效,则将控制权转移到该servlet。

    public class MainService extends HttpServlet {
    private static final long serialVersionUID = 1L;
    static Logger log = Logger.getLogger(MainService.class.getName());

    /**
     * @see HttpServlet#HttpServlet()
     */
    public MainService() {
        super();
    }
/*
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(true);
        response.setContentType("text/html;charset=UTF-8");
        LogUtil.logInfo("i m here");
        List<Images> imageList = null;
        response.setContentType("text/html");
        try {
            UserDataService userDataService = new UserDataImpl();



            String userId = null;
            String username = null;
            String password = null;
            username = request.getParameter("user");
            password = request.getParameter("password");

            userId = userDataService.checkUser(username, password);

            if (userId!=null) {

            System.out.println(userId);
            session.setAttribute("userId", userId);

                imageList = userDataService.getImages(userId);
                session.setAttribute("imageList", imageList);


            /*response.sendRedirect("//showUserImages.jsp");*/

                RequestDispatcher dispatcher = request
                        .getRequestDispatcher("//showUserImages.jsp");
                dispatcher.forward(request, response);


            } else {

                /*response.sendRedirect("//index.jsp");*/

                RequestDispatcher dispatcher = request
                        .getRequestDispatcher("//index.jsp");
                dispatcher.forward(request, response);

            }
        } catch (ImageException e) {

            e.getMessage();
            e.printStackTrace();
        }
    }

}

This works without the filter, but with the filter shows an error when I forward control to "//showuserImages.jsp". 这在没有过滤器的情况下有效,但是当我将控件转发到“ //showuserImages.jsp”时,使用过滤器会显示错误。

Put the invocation of doFilter in an else block: doFilter的调用放在else块中:

if (!allowedRequest) {
    HttpSession session = request.getSession(false);
    if (null == session) {
        System.out.println("redirect in servlet session filter");
        RequestDispatcher dispatcher = request
                .getRequestDispatcher("//index.jsp");
        dispatcher.forward(request, response);
    }
}else{
    chain.doFilter(req, res);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.IllegalStateException:添加`return`后提交响应后无法转发 - java.lang.IllegalStateException: Cannot forward after response has been committed after add `return` java.lang.IllegalStateException:在404上提交响应后无法转发 - java.lang.IllegalStateException: Cannot forward after response has been committed on 404 随机java.lang.IllegalStateException:提交响应后无法转发 - Random java.lang.IllegalStateException: Cannot forward after response has been committed java.lang.IllegalStateException:在提交响应后无法转发 - java.lang.IllegalStateException: Cannot forward after response has been committed java.lang.IllegalStateException:PWC1227:提交响应后无法转发……为什么要发送? - java.lang.IllegalStateException: PWC1227: Cannot forward after response has been committed…why it was comming? java.lang.IllegalStateException:提交响应后无法转发,位于com.java.QTD.QuestionOfTheDay.doGet() - java.lang.IllegalStateException: Cannot forward after response has been committed, at at com.java.QTD.QuestionOfTheDay.doGet() Spring java.lang.IllegalStateException:在提交响应后无法创建会话 - Spring java.lang.IllegalStateException: Cannot create a session after the response has been committed java.lang.IllegalStateException - 在提交响应后无法创建会话 - java.lang.IllegalStateException - Cannot create a session after the response has been committed Hibernate和Jackson(java.lang.IllegalStateException:提交响应后无法调用sendError()) - Hibernate and Jackson (java.lang.IllegalStateException: Cannot call sendError() after the response has been committed) java.lang.IllegalStateException:在提交响应后无法调用sendRedirect() - java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM