2014-01-17 1 views
4

나는 webapp의 세션 관리 (현재 Catalina/Tomcat에서 처리)를 shiro 네이티브 세션 관리로 바꾸려고합니다.SessionListener의 Shiro HttpSession?

시로 웹 사이트에 의해 adverted 될 때 이것은 상당히 쉬운 일이 있어야한다

:

투명 HttpSession을 지원 - 당신이 시로의 기본 세션을 사용하는 경우, 우리가 구현 한 HTTP 세션 API와 서블릿 2.5 API 이므로 기존 웹 코드를 변경하여 Shiro를 사용할 필요가 없습니다.

그래서 로컬 세션 관리자를 Shiro의 DefaultWebSessionManager으로 교체하면 모든 것이 정상적으로 작동합니다.

특정 javax.servlet.http.HttpSessionListener을 제외하고 내 webapp의 경우도 마찬가지입니다. 이 Listener는 Shiro의 세션 관리를 사용한 이후 더 이상 이벤트를 가져 오지 않습니다.

걱정할 필요가 없습니다. Shiro는 자체의 org.apache.shiro.session.SessionListener 인터페이스를 제공하며 세션 관리자에 연결할 수 있습니다.

그러나이 인터페이스는 javax.servlet.http.HttpSessionListener과 많이 다릅니다. HttpSession 오브젝트가 더 이상 전달되지 않고 Shiro 리스너가 이벤트와 함께 자신의 org.apache.shiro.session.Session 오브젝트를 전달합니다.

내 기존 구현은 물론 HttpSession 개체로 작동합니다. 나는 시로 SessionHttpSession로 변환 될 수 있다는 것을 발견 :

// HttpServletRequest currentRequest; 
// ServletContext servletContext; 
// Session session; 
HttpSession httpSession = new ShiroHttpSession(session, currentRequest, servletContext); 

는 그러나 시로 SessionListener에서 HttpServletRequest의와의 servletContext을 액세서 할 수있는 방법이 없습니다.

모든 아이디어가이 문제를 해결하는 방법입니다 (예 : 이 두 가지 질문 중 하나에 대답 할 수 있습니까?

  1. 왜 더 이상 이전 javax.servlet.http.HttpSessionListener라는입니까?
  2. Shiro Session 개체를 HttpSession shiro SessionListener에있는 개체로 변환하려면 어떻게해야합니까?

답변

3

왜 이전 javax.servlet.http.HttpSessionListener 더 이상 는이라고?

설명했듯이 이제 세션 관리는 서블릿 컨테이너가 아닌 Shiro를 통해 처리됩니다. 따라서 HttpSessionListener이 등록되어 있어도 서블릿 컨테이너는 HttpSession 개체를 만들지 않으므로 HttpSessionListener 콜백을 사용하지 않습니다.

은 어떻게 시로 SessionListenerHttpSession 객체에 시로 Session 객체를 변환합니까?

당신은 그렇게하지 않아야합니다.

HttpSession으로 원하는 것을 설명하면 대안을 찾을 수 있습니다.

+0

Simpy 넣어, 내 이전 SessionListener의 모든 코드는 HttpSessions 함께 작동하도록 작성되었습니다. Shiro Session 객체를 모두 리팩터링하지 않고도이 코드를 재사용 할 수 있습니까? 이것은 꽤 많은 일이 될 것입니다. –

+0

@KarstenDaemen 어떤 HttpSession 메소드를 사용하고 있습니까? Shiro의'Session'은 속성 setter와 getter를 가지고 있지만 분명 JSP와 그 밖의 것들에는 사용할 수 없습니다. –