很久没写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;
}
}