Cannot forward after response has been committed 错误原因与解析

Cannot forward after response has been committed 错误原因与解析

我所遇到的问题是在使用过滤器对发送到servlet的请求进行拦截并处理时产生的。
以下是产生问题的代码:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse response=(HttpServletResponse)resp;
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        userServiceImpl userService=new userServiceImpl();
        boolean login = userService.login(username, password);
        if (!login) {
            request.setAttribute("message", "密码不正确请重试。");
            request.getRequestDispatcher("index.jsp").forward(request, response); 
            }
        chain.doFilter(req, resp);
    }

产生问题后,基于程序语言面向百度编程的认识,果断想百度进行求助。但是得到的答案大部分都是说加 return; 进行解决。(实际上我也试了,可能是和我情况不一致,依然无法解决问题)
实际上稍加分析这个问题后,会发现这并不是个特别难的问题。
因为,我也只是一个初学者,不敢断言,只能说是猜测:
servlet过滤器,本身是拦截客户端向服务器上的某个servlet程序发送的请求,并先于servlet程序执行,过滤器执行到chain.doFilter(req, resp);时,过滤器会将拦截释放,请求也会随着原有的访问地址发送给servlet程序

而出现问题的原因主要是因为:
在Filter程序中设置了请求的转向,但是设置了转向后的Filter程序依然会继续执行,而当Filter程序执行到chain.doFilter(req, resp);时,因为拦截释放,请求又被发送给原有的访问地址

此时就会产生Cannot forward after response has been committed错误。
知道原因后,解决起来也会很轻松:
只要确保过滤器只会执行一个转向或者释放拦截就行
针对上面代码的问题只需要将chain.doFilter(req, resp);放在else内就行。具体如下:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest request=(HttpServletRequest)req;
    HttpServletResponse response=(HttpServletResponse)resp;
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    userServiceImpl userService=new userServiceImpl();
    boolean login = userService.login(username, password);
    if (!login) {
        request.setAttribute("message", "密码不正确请重试。");
        request.getRequestDispatcher("index.jsp").forward(request, response);
        }else {
    chain.doFilter(req, resp);
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值