java.lang.IllegalStateException: Cannot forward after response has been committed

本文解决了在使用Servlet过滤器时遇到的“Cannot forward after response has been committed”异常。通过在filterChain调用及请求转发后添加return语句来避免多次处理导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久没写servletFilter 出现了一个错误,找了很久,记录下:
异常:
严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:312)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at com.egoonet.security.LoginFilter.doFilter(LoginFilter.java:41)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)



发生异常的部分:

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain filterChain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("LoginFilter  doFilter()");
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		HttpSession session = request.getSession();
		System.out.println("user:"+session.getAttribute("user")+"####################URI:"+request.getRequestURI());
		if(session.getAttribute("user")!= null){
			filterChain.doFilter(servletRequest, servletResponse);     
			
		}
		if(request.getRequestURI().contains("/EgoonetReport/images/") ||request.getRequestURI().contains("/EgoonetReport/tab/images/") || request.getRequestURI().contains("/EgoonetReport/dwr/")
				|| request.getRequestURI().contains("/EgoonetReport/dwr/interface/") ){
			System.out.println("going  next  ");
			filterChain.doFilter(servletRequest, servletResponse);
			
		}
	
		else{
		request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
//			response.sendRedirect("login.jsp");
		
		}
	}

在网上查找资料说在

request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
加一句 return;
但是,在项目中没有起作用。

解决:

在  每句 filterChain.doFilter(servletRequest, servletResponse);加return;

request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
加一句 return;


如下:

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain filterChain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("LoginFilter  doFilter()");
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		HttpSession session = request.getSession();
		System.out.println("user:"+session.getAttribute("user")+"####################URI:"+request.getRequestURI());
		if(session.getAttribute("user")!= null){
			filterChain.doFilter(servletRequest, servletResponse);     
			return;
		}
		if(request.getRequestURI().contains("/EgoonetReport/images/") ||request.getRequestURI().contains("/EgoonetReport/tab/images/") || request.getRequestURI().contains("/EgoonetReport/dwr/")
				|| request.getRequestURI().contains("/EgoonetReport/dwr/interface/") ){
			System.out.println("going  next  ");
			filterChain.doFilter(servletRequest, servletResponse);
			return;
		}
	
		else{
		request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
//			response.sendRedirect("login.jsp");
		return;
		}
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值