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