Cannot forward after response has been committed

矫情吗;* 2022-06-10 03:59 190阅读 0赞

之前在使用Servlet的时候,总是在 doGet()/doPost() 的最后一行才使用请求转发或者重定向。如果需要根据条件来判断进行不同的请求转发或者重定向,代码如下:

  1. @Override
  2. protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
  3. throws ServletException, IOException {
  4. if (req.getSession().getAttribute(AttrConsts.LOGIN_USER) == null) {
  5. req.getRequestDispatcher(PathConsts.PATH_PREFIX + PathConsts.LOGIN_PAGE).forward(req, resp);
  6. }
  7. req.getRequestDispatcher(PathConsts.PATH_PREFIX + PathConsts.MAIN_PAGE).forward(req, resp);
  8. }

上边的代码在执行后会报如下异常:

  1. java.lang.IllegalStateException: Cannot forward after response has been committe

报异常的原因是重复转发或者重定向了请求,如果有多个转发或者重定向,需要在每个转发或者重定向请求之后加上return语句(最后一个请求转发或者重定向不需要加return),如下:

  1. @Override
  2. protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
  3. throws ServletException, IOException {
  4. if (req.getSession().getAttribute(AttrConsts.LOGIN_USER) == null) {
  5. req.getRequestDispatcher(PathConsts.PATH_PREFIX + PathConsts.LOGIN_PAGE).forward(req, resp);
  6. return;
  7. }
  8. req.getRequestDispatcher(PathConsts.PATH_PREFIX + PathConsts.MAIN_PAGE).forward(req, resp);
  9. }

通过return语句确保在转发或者重定向请求之后返回,避免在执行上边的转发/重定向之后,接着继续往下执行转发/重定向请求,这样就不会再报这个异常了。

发表评论

表情:
评论列表 (有 0 条评论,190人围观)

还没有评论,来说两句吧...

相关阅读