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

Posted

技术标签:

【中文标题】如何从 grails 应用程序中的 sessionId 获取 HttpSession【英文标题】:How to get HttpSession from sessionId in grails application 【发布时间】:2016-09-24 11:59:09 【问题描述】:

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

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

【问题讨论】:

“sessionFactory”是指Hibernate SessionFactory?这与 HTTP 会话无关,只是巧合地相似。 “会话”概念用于各种地方,例如JMS 等。它们不相关且不共享 ID。 【参考方案1】:

如果你想要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')

【讨论】:

【参考方案2】:

试试这个:

def sessions = ContextListener.instance().getSessions()
def sessionToInvalidate = sessions.findit.id == sessionId

更新: 正如 Burt Beckwith 提到的,ContextListener 不是标准类。但是,它很容易实现。您可以在 App info grails plugin here

中查看它是如何实现的

【讨论】:

ContextListener 不是标准类,它必须是您在 web.xml 中注册为监听器以跟踪会话的应用程序中使用的东西。没有那个类源,这个答案根本没有用。

以上是关于如何从 grails 应用程序中的 sessionId 获取 HttpSession的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Grails 中的 Spring Security 获取普通密码或解密密码?

如何从 grails 3.1.8 中的外部文件加载数据源配置?

如何使用 JOSSO 和 Spring Security 从 Grails 应用程序中的 LDAP 获取自定义属性?

如何从grails 3.1.8中的外部文件加载数据源配置?

在grails中远程调用action

Grails 中的控制器