2013-08-20 3 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으로의 리다이렉트가 일어날 것임을 나타냅니다. 그러나 그렇지 않습니다. 난 그냥 대신 충돌 :

<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하는

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(); 
     } 
} 

스트럿츠-config 파일. 브라우저 시작시이 보호 된 페이지를 처음 방문하면 로그인으로 리디렉션되는 대신 충돌이 발생합니다. 수동으로 로그인 페이지를 방문한 다음 보호 된 페이지를 방문하려고 시도하지 않고 크래시를 방문하려고 시도하고 다시 로그인하도록 리디렉션합니다. 브라우저를 다시 시작할 때까지 계속 작동합니다.

어떤 아이디어 ??

+1

_only_ 스택 추적입니까? 게시 한 것은 코드가 호출되지 않고 있음을 나타냅니다. –

+0

Yes는 내 IDE 콘솔과 Tomcat 500 오류 페이지에 나타나는 유일한 스택 추적입니다. 디버거와 코드가 실행되고 있지만 추적했습니다. 이 예외는 Interceptor를 통과하고'return BaseAction.LOGIN'을 한 후에 나타납니다. –

+0

catalina.out을 검사하여 다른 것이 있는지 확인하십시오. 스택 추적은 문제가 무엇인지 전혀 알려주지 않습니다. 또한 LoginManager를 세션에 넣는 이유는 무엇이며 세션에서 LoginManager를 사용하는 이유는 무엇입니까? –

답변

3

이 문제는 해결되었습니다. 나는 전혀 생각이 이유를 가지고,하지만 난 내 스트럿을 변경할 때 xml 파일 대신 문제가 멀리 갔다

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

의이 DTD 파일

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

을 사용합니다. 나는 모든 구성 파일을 체크하는 짚에서 다른 애플 리케이션의 설정 파일을 쥐고 있었는데 문제없이 동일한 프로세스를 사용했다. 나는 도대체 무엇을 결정하고 변화를 만들었고 ... 작동합니다.