如何从grails应用程序中的sessionId获取HttpSession

时间:2016-05-26 12:57:29

标签: grails spring-security sessionid httpsession

我有grails应用程序,使用sessionRegistry我可以获得sessionId。

现在,如何从该sessionId获取HttpSession。

2 个答案:

答案 0 :(得分:0)

如果你想要HttpSession那么这个怎么样:

import org.springframework.beans.BeansException
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
import org.springframework.stereotype.Component
import org.springframework.web.context.WebApplicationContext

import javax.servlet.http.HttpSession
import javax.servlet.http.HttpSessionEvent
import javax.servlet.http.HttpSessionListener
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentMap

@Component
class SessionTracker implements HttpSessionListener, ApplicationContextAware {

    private static final ConcurrentMap<String, HttpSession> sessions = new ConcurrentHashMap<String, HttpSession>();

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        def servletContext = ((WebApplicationContext) applicationContext).getServletContext()
        servletContext.addListener(this);
    }

    void sessionCreated(HttpSessionEvent httpSessionEvent) {
        sessions.putAt(httpSessionEvent.session.id, httpSessionEvent.session)
    }

    void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        sessions.remove(httpSessionEvent.session.id)
    }

    HttpSession getSessionById(id) {
        sessions.get(id)
    }
}

一旦你把它放到src / groovy中,它应该在你的Spring上下文中自动可用。注入控制器或服务后,您可以像这样使用它。

sessionTracker.getSessionById('sessionId')

答案 1 :(得分:-1)

试试这个:

def sessions = ContextListener.instance().getSessions()
def sessionToInvalidate = sessions.find{it.id == sessionId}

更新: 正如Burt Beckwith所说,ContextListener不是标准类。但是,它很容易实现。您可以在应用信息grails插件 here

中查看其实现方式