2014-04-21 3 views
2

컨트롤러에 사용자 빈을 @SessionAttributes({"UserBean"})으로 저장했습니다.세션이 만료되면 스프링 MVC가 로그인 페이지로 리디렉션합니다.

내 목표는 세션이 만료되면 로그인/오류 페이지로 리디렉션하는 것입니다. 다음은 내 코드입니다

@RequestMapping(value = "searchOpportunity.htm", method = RequestMethod.GET) 
     public ModelAndView searchOpportunity(@ModelAttribute("UserBean") UserBean userBean) { 
      functionName = "searchOpportunity"; 
      logger.info("HERE !!! In "+className+" - "+functionName+" "); 
      System.out.println("HERE !!! In "+className+" - "+functionName+" "); 

      try 
      { 

      if(userBean==null) 
      { 
       System.out.println(userBean); 
       return new ModelAndView("userLogout", "command", null); 
      } 
      } 


      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
      return new ModelAndView("opportunity/opportunitySearch", "command", new SearchOpportunityBean()); 

     } 

그러나 세션이 만료되면 다음 오류가 발생합니다.

org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet mintDispatcher threw exception 
org.springframework.web.HttpSessionRequiredException: Session attribute 'UserBean' required - not found in session 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseSessionRequiredException(AnnotationMethodHandlerAdapter.java:761) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:758) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:356) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    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:128) 
    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:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 
    at java.lang.Thread.run(Unknown Source) 

userbean이 만료 된 경우 컨트롤러 코드는 실행되지 않습니다. 그 이유는 무엇입니까? 해결책이 무엇이 될 수 있습니까?

+0

확인이 http://stackoverflow.com/a/5841795/2182351 – Mani

답변

2

스프링 보안으로 이것을 시도해보십시오.

<sec:session-management invalid-session-url="/login"> 
     <sec:concurrency-control expired-url="/login" /> 
</sec:session-management> 

사용자 세션이 만료되었거나 유효하지 않을 때/login 페이지로 리디렉션됩니다.

심판 : http://docs.spring.io/spring-security/site/docs/3.0.x/reference/springsecurity.html

+0

을 나는 봄 보안에 익숙하지 않다. 제게 좋은 참고 사항을주세요. 문서를 이해하는 데 어려움을 겪고 있습니다. –

+0

다음 예제를 확인하십시오 : https://blog.trifork.com/2014/02/28/session-timeout-and-concurrent-session-control - with-spring-security-and-spring-mvc / – Pantelis

0

당신은 HandlerInterceptorAdapter의 도움으로 그것을 할 수 있습니다. preHandle() 메소드는 실행 체인이 다음 인터셉터 나 핸들러 (컨트롤러)와 함께 진행해야하는 경우 true를 반환해야합니다. 그렇지 않으면 DispatcherServlet은이 인터셉터가 이미 응답 자체를 처리했다고 가정합니다.

public class YourInterceptor extends HandlerInterceptorAdapter { 
     public boolean preHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler) throws Exception { 
      UserBean userBean = (UserBean) WebUtils.getSessionAttribute(request, "UserBean"); 
      if(userBean == null){ 
       //whatever you want to do 
       return throw new ModelAndViewDefiningException(new ModelAndView("userLogout", "command", null)); 
      }else{ 
       return true; 
      } 
     } 
    } 

하고 핸들러 매핑 정의에서이 인터셉터 지정

<bean id="yourInterceptor" class="package.YourInterceptor"/> 
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
      <property name="order" value="1" /> 
      <property name="interceptors"> 
       <list> 
        <ref bean="yourInterceptor" /> 
       </list> 
      </property> 
      <property name="mappings"> 
       <props> 
        <prop key="/searchOpportunity.htm">YourController</prop>  
       </props> 
      </property> 
     </bean> 
관련 문제