2013-08-20 2 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) 

Моего перехватчик, что я использую, чтобы проверить, если они вошли в системе и перенаправлять при необходимом. самый первый 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-файл конфигурации

<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_ stack? Тот, который вы опубликовали, указывает, что ваш код даже не вызывается. –

+0

Да, это единственная стек, которая появляется на моей консоли IDE, а также на странице ошибок Tomcat 500. Я проследил его, хотя отладчик и мой код запускаются. Это исключение появляется ПОСЛЕ прохождения через мой Intercepter и 'return BaseAction.LOGIN' –

+0

Проверьте, не обнаружено ли что-нибудь еще. Эта трассировка стека не говорит нам, что проблема вообще. Кроме того, что помещает LoginManager в сеанс и почему это происходит в сеансе? –

ответ

3

Эта проблема разрешена. Я абсолютно не знаю, почему, но когда я изменил мои распорки XML-файлы, чтобы использовать этот файл DTD

http://struts.apache.org/dtds/struts-2.3.dtd

вместо

http://struts.apache.org/dtds/struts-2.1.dtd

проблема ушла. Я хватался за соломинку, проверяя каждый файл конфигурации на файлы конфигурации других приложений, которые у меня есть, которые используют один и тот же процесс без проблем и видели это. Я решил, что, черт возьми, сделал изменения ... и это работает.

Смежные вопросы