如何在一个应用程序中配置 spring-session 以支持 HeaderHttpSessionStrategy 和 CookieHttpSessionStrategy?

Posted

技术标签:

【中文标题】如何在一个应用程序中配置 spring-session 以支持 HeaderHttpSessionStrategy 和 CookieHttpSessionStrategy?【英文标题】:How to config spring-session to support HeaderHttpSessionStrategy and CookieHttpSessionStrategy in one application? 【发布时间】:2015-07-16 22:22:37 【问题描述】:

我有一个项目想要支持 android,ios,pc web。我尝试使用https://github.com/spring-projects/spring-session,是否可以只在应用程序中配置以支持HttpSession和rest token?

如果可以,我该如何配置?

【问题讨论】:

【参考方案1】:

对我有用的一件事是使用来自 Cookie 和 Header 实现的代码重新实现 ***HttpSessionStrategy

你可以在这里看到这些类的具体实现:

https://github.com/spring-projects/spring-session/blob/master/spring-session/src/main/java/org/springframework/session/web/http/HeaderHttpSessionStrategy.java https://raw.githubusercontent.com/spring-projects/spring-session/master/spring-session/src/main/java/org/springframework/session/web/http/CookieHttpSessionStrategy.java

所以getRequestedSessionId 变为:

public String getRequestedSessionId(HttpServletRequest request) 
        // header part
        String sessionId = request.getHeader(headerName);
        if(sessionId != null && !sessionId.isEmpty())
            return sessionId;

        // cookie part
        Map<String,String> sessionIds = getSessionIds(request);
        String sessionAlias = getCurrentSessionAlias(request);
        return sessionIds.get(sessionAlias);
    

onInvalidateSession 变为:

public void onInvalidateSession(HttpServletRequest request, HttpServletResponse response) 
    // header part
    response.setHeader(headerName, "");

    // cookie part
    Map<String,String> sessionIds = getSessionIds(request);
    String requestedAlias = getCurrentSessionAlias(request);
    sessionIds.remove(requestedAlias);

    Cookie sessionCookie = createSessionCookie(request, sessionIds);
    response.addCookie(sessionCookie);

onNewSession 变为:

public void onNewSession(Session session, HttpServletRequest request, HttpServletResponse response) 
        // header part
        response.setHeader(headerName, session.getId());

        // cookie part
        Set<String> sessionIdsWritten = getSessionIdsWritten(request);
        if(sessionIdsWritten.contains(session.getId())) 
            return;
        
        sessionIdsWritten.add(session.getId());

        Map<String,String> sessionIds = getSessionIds(request);
        String sessionAlias = getCurrentSessionAlias(request);
        sessionIds.put(sessionAlias, session.getId());
        Cookie sessionCookie = createSessionCookie(request, sessionIds);
        response.addCookie(sessionCookie);
    

我在生产环境中将它用于浏览器/移动 REST API,它满足了我的所有需求。

【讨论】:

鉴于 github 链接已损坏。还有其他链接可以参考吗?【参考方案2】:

你可以利用spring的BeanFactoryPostProcessor,覆盖postProcessAfterInitialization()来配置SessionRepositoryFilter的httpSessionStrategy,在spring初始化后调用它的setHttpSessionStrategy()方法。

【讨论】:

以上是关于如何在一个应用程序中配置 spring-session 以支持 HeaderHttpSessionStrategy 和 CookieHttpSessionStrategy?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HikariCP 在 Jboss 中配置 JNDI 数据源?

如何在 Rider 中支持多个应用程序配置

如何更新已过期的配置文件(在 testflight 中)

如何在多个应用程序中共享日志配置

如何在一个应用程序中配置 spring-session 以支持 HeaderHttpSessionStrategy 和 CookieHttpSessionStrategy?

如何在 Quarkus 中覆盖一个单元测试的配置属性