当向其他人重定向(带拦截器)动作时,Struts2动作无法执行

我向ActLand发送请求,然后intercept() ,如果没有登录,则重定向到Login.jsp

struts.xml

           /login.jsp   /index.jsp   /index.jsp /login.jsp    

拦截器:

 public class LoginInterceptor extends AbstractInterceptor { @Override public String intercept(final ActionInvocation invocation) throws Exception { Map session = ActionContext.getContext().getSession(); int userId = -1; if (session.get("userId") != null) { userId = Integer.parseInt(session.get("userId").toString()); } Object action = invocation.getAction(); if (userId < 0) { return "loginRedirect"; } else if (!(action instanceof ActLogin)) { return "loginRedirect"; } return invocation.invoke(); } 

错误:

 SEVERE: Could not execute action: /ActLand java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:473) at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) at org.apache.struts2.dispatcher.ServletRedirectResult.sendRedirect(ServletRedirectResult.java:217) at org.apache.struts2.dispatcher.ServletRedirectResult.doExecute(ServletRedirectResult.java:197) at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:362) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:266) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.components.ActionComponent.executeAction(ActionComponent.java:289) at org.apache.struts2.components.ActionComponent.end(ActionComponent.java:172) at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42) at org.apache.jsp.index_jsp._jspx_meth_s_005faction_005f0(index_jsp.java:152) at org.apache.jsp.index_jsp._jspx_meth_s_005fif_005f0(index_jsp.java:120) at org.apache.jsp.index_jsp._jspService(index_jsp.java:83) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 

对不起,我相信我做了我所指示的所有事情,但事情很复杂……

login拦截器之后将loginStack 。 它不仅有助于解决重定向结果的问题。

我是多么愚蠢…在拦截器中只是错误的逻辑。 一切都很好!!

  public String intercept(final ActionInvocation invocation) throws Exception { Map session = ActionContext.getContext().getSession(); int userId = -1; if (session.get("userId") != null) { userId = Integer.parseInt(session.get("userId").toString()); } Object action = invocation.getAction(); //If Act Login, then let through if ((action instanceof ActLogin)) { return invocation.invoke(); } //Else, if not login, nor not Actlogin, then redirect if (userId < 0) { System.out.println("check id session " + userId); return "loginRedirect"; } //Else Logined, let through return invocation.invoke(); } 

在原始代码中:

  if (userId < 0) { return "loginRedirect"; } else if (!(action instanceof ActLogin)) { return "loginRedirect"; } 

这导致无限循环,因为我没有进入,然后userId总是<0然后总是重定向,永远不会通过ActLogin登录