如何从 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 中的外部文件加载数据源配置?