2013-08-20 66 views
0

我有一个受保护的页面,应该在未登录时重定向到登录屏幕。问题是,当我尝试查看该页面而不是重定向登录时,它与IllegalStateException错误崩溃。推手是,如果我手动访问它加载的登录页面,然后我尝试再次访问保护页面,它将按预期重新定向。它必须是某种会话缓存问题,因为除非我重新启动浏览器,否则问题不会再发生。浏览器重新启动后,问题将会持续,直到我再次手动访问登录页面。当然,错误报告是超级含糊,什么问题实际上是第一次访问Struts2 IllegalStateException

Aug 20, 2013 4:36:40 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet default threw exception 
java.lang.IllegalStateException 
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407) 
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:852) 
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:534) 
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
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.StandardContextValve.invoke(StandardContextValve.java) 
at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:127) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) 
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:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:662) 

我的拦截器,我使用验证,如果他们在登录和重定向时neccessary。第一个return BaseAction.Login就像它应该做的那样,而且当我启用日志时,struts2记录器显示重定向到viewLogin将会发生,但事实并非如此。我只是崩溃,而不是:

public String intercept(ActionInvocation invocation) throws Exception { 
    BaseAction action = (BaseAction)invocation.getAction(); 
LoginManager loginManager = (LoginManager)action.getSession().get("loginManager"); 
Boolean loggedIn = false; 

    final ActionContext context = invocation.getInvocationContext(); 
    ActionMapping mapping = (ActionMapping)context.get(ServletActionContext.ACTION_MAPPING); 


     if(loginManager == null && action.isLoginRequired()) { 
      //user is not logged in and login required, redirect them to login module 
      return BaseAction.LOGIN; 
     } else if(loginManager != null && action.isLoginRequired()) { 
      //logged in, make sure they are accessing a valid resource 
      String loginKey = action.getSessionLoginVarable(mapping); 
      if(loginManager.getLoginPaths().containsKey(loginKey)) { 
       return invocation.invoke(); 
      } else { 
       //return to login which will redirect them to appropriate path 
       return BaseAction.LOGIN; 
      } 
     } else { 
      //public access to continue with action 
      return invocation.invoke(); 
     } 
} 

的struts-config文件

<package name="student" namespace="/student" extends="struts-default-custom"> 
    <default-action-ref name="viewLogin" /> 
    <global-results> 
     <result name="login" type="redirectAction">viewLogin</result> 
    </global-results> 

    <action name="*Login" method="{1}" class="controller.shared.StudentLogin"> 
     <interceptor-ref name="noLoginStack"/> 

     <result type="redirectAction">viewSearchAdvisors</result> 
     <result name="input">/student/student-login.jsp</result> 
     <result name="error" type="redirectAction">viewLogin</result> 
    </action> 

所以只是summaraize。首次在浏览器启动时访问此受保护页面时,它会崩溃而不是重定向到登录。我手动访问登录页面,然后尝试访问受保护的页面不会崩溃,并重新导航回到登录状态。它会继续正常工作,直到我重新启动浏览器。

任何想法??

+1

你确定这是_only_堆栈跟踪吗?你发布的代码表明你的代码甚至没有被调用。 –

+0

是的,这是我的IDE控制台以及Tomcat 500错误页面上出现的唯一栈跟踪。尽管调试器和我的代码正在运行,但我已经追踪了它。这个异常出现在我的Intercepter和'return BaseAction.LOGIN'后面。 –

+0

检查catalina.out以查看是否还有其他东西。这个堆栈跟踪并没有告诉我们这个问题到底是什么。另外,什么使LoginManager进入会话,为什么会话呢? –

回答