现在的位置: 首页 > 综合 > 正文

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

2013年12月02日 ⁄ 综合 ⁄ 共 4059字 ⁄ 字号 评论关闭
很久没写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;
		}
	}

抱歉!评论已关闭.