“响应已经提交”错误 - chain.doFilter()

时间:2012-08-30 17:31:04

标签: java jsp servlets redirect servlet-filters

我想授权用户使用登录页面。我创建了一个登录页面login.jsp,它有登录表单。当我提交表单时,它的值被重定向到一个check servlet,如果用户有效,servlet会设置会话UserName。

我通过过滤器截取此请求,并希望在chain.doFilter之后重定向页面,但我收到一条错误消息,表明响应已提交。有什么问题?

HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse res=(HttpServletResponse) response;

if(req.getRequestURI().contains("/ShowHome"))  {

  chain.doFilter(req, res);

  if(req instanceof HttpServletRequest) {

      boolean authorized=false;

      HttpSession session= req.getSession(false);

      if(session!=null) {
        if(session.getAttribute("UserName")!=null) {
          authorized=true;
        }
      } else {
        authorized=false;
      }

    if(authorized) {
      System.out.println("You are authorized user ");
      res.sendRedirect("/FilterAuth/welcome.jsp");
    } else {
      System.out.println("authentication failed ! ");

      try {
        //response.flushBuffer();

        RequestDispatcher disp= request.getRequestDispatcher("/index.jsp");
        disp.forward(request, response);
        return;
      } catch(Exception e) {
          e.printStackTrace();
      }
    }

1 个答案:

答案 0 :(得分:0)

理想情况下,在servlet执行授权之前调用servlet过滤器。一旦成功,应通过chain.doFilter(req,res)传递调用。

不应在servlet过滤器中调用res.sendRedirect()。这只是表明响应已经提交。

web.xml中的正确映射可确保在调用servlet之前调用所需的过滤器。稍后在servlet中如果需要任何重定向,那么就可以实现。