提交响应后无法转发错误
问题描述:
浏览器显示HTTP状态500-内部服务器错误:
控制台提示:
Stacktrace:
java.lang.IllegalStateException: 提交响应后无法转发
监听器中权限判断代码:
package com.ptu.blog.filter;
import java.io.IOException;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class AccessFilter
*/
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST }
, urlPatterns = { "/dashboard/*","/us.do?back=back","/bs2.do?back=back" })
public class AccessFilter implements Filter {
/**
* Default constructor.
*/
public AccessFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("AccessFilter doFilter");
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
if(req.getSession().getAttribute("user")==null){
// 如果用户未登录 跳转至登录页面
//out.print(session.getAttribute("user"));
res.sendRedirect("../login.jsp");
//重定向以后 再进行转发有极大可能抛出异常 需要加return
return ;
}
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
原因分析:
初学者之间常见的误解是,他们认为forward()
, sendRedirect()
或sendError()
的调用会奇迹般地退出并“跳出”方法块,因此忽略了代码的剩余部分。 例如:
protected void doPost() { if (someCondition) { sendRedirect(); } forward();
// This is STILL invoked when someCondition is true! }
这实际上是不正确的。 当然,它们的行为与其他任何Java方法(当然期望System#exit()当然)不一样。 当上面例子中的someCondition为true在同一个请求/响应中的sendRedirect()
或sendError()
forward()
之后调用forward()
,将有机会得到exception:
java.lang.IllegalStateException:提交响应后无法转发
如果if语句调用forward()
,然后调用sendRedirect()
或sendError()
,则会抛出以下exception:
java.lang.IllegalStateException:在提交响应之后无法调用sendRedirect()
解决方案:
该文章中就是在权限监听器AccessFilter中res.sendRedirect("../login.jsp")
之后添加return
res.sendRedirect("../login.jsp");
//重定向以后 再进行转发有极大可能抛出异常 需要加return
return ;
其他解决方案分析
要解决这个问题,你需要添加一个return; 之后的声明
protected void doPost() { if (someCondition) { sendRedirect(); return; } forward(); }
…或者引入一个else块。
protected void doPost() { if (someCondition) { sendRedirect(); } else { forward(); } }
要在代码中find根本原因,只需search任何调用forward()
, sendRedirect()
或sendError()
而不退出方法块或跳过代码的剩余部分的行。 这可以在特定代码行之前的同一个servlet中,也可以在特定servlet之前被调用的任何servlet或filter中。
在sendError()
情况下,如果您的唯一目的是设置响应状态,请改用setStatus()
。
另一个可能的原因是servlet在调用forward()
时写入响应,或者以相同的方法调用。
protected void doPost() { out.write("some string"); // ... forward(); // Fail! }
响应缓冲区大小在大多数服务器中默认为2KB,所以如果写入超过2KB,它将被提交, forward()
将以同样的方式失败:
java.lang.IllegalStateException:提交响应后无法转发
解决scheme是显而易见的,只是不写入到servlet中的响应。 这是JSP的责任。 你只需像request.setAttribute("data", "some string")
那样设置一个request属性,然后在JSP中打印它,就像${data}
。 另请参阅我们的Servlet wiki页面 ,了解如何正确使用Servlet。
参考链接:https://www.dovov.com/java-lang-illegalstateexceptionredirectbuild.html
本文地址:https://blog.csdn.net/weixin_46069058/article/details/111938238
上一篇: 计算机网络知识点----2.物理层
下一篇: 看完包会的Vuejs基础
推荐阅读
-
Linux安装完mysql后提示错误无法登陆mysql怎么办?
-
一批安卓电视升级6.0系统后成功变砖:无法开机、电视突然无响应
-
MAC升级10.7.3后无法启动、应用反复崩溃及CUI错误
-
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
-
IIS卸载后重装时提示:安装程序无法复制一个或多个文件 特定错误码是 0xe0000233
-
Ajax提交数据后 回调函数不执行并且Spring mvc控制器 无法解析视图解决办法
-
【IIS】解决IIS无响应假死状态,asp突然无法访问重启后可以使用是什么原因
-
表单提交错误后返回内容消失问题的解决方法(PHP网站)
-
Mac更新catalina10.15.1后无法解决未响应进程问题,直接重装系统
-
提交响应后无法转发错误