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

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

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

【问题讨论】:

    标签: spring rest httpsession spring-session json-web-token


    【解决方案1】:

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

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

    所以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()方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多