-1

我想通过登录页面授权用户。我创建了一个登录页面,login.jsp它有登录表单。当我提交表单时,它的值被重定向到检查 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();
      }
    }
4

1 回答 1

0

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

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

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

于 2012-08-31T16:35:12.087 回答