【问题标题】:Migrating ServletRequestListener after adopting spring-sessions采用 spring-sessions 后迁移 ServletRequestListener
【发布时间】:2021-05-13 21:01:44
【问题描述】:

我们最近开始在我们的项目中集成 spring-session。这是一个基于 SOA 的应用程序,有一些逻辑实现来管理会话。

  1. HttpSessionListener 用于在超时情况下注销会话并通过 sessionDestroyed(HttpSessionEvent httpSessionEvent) 进行监控。
  2. 我们用来管理 HTTP 会话失效的 ServletRequestListener。这是在 requestDestroyed(ServletRequestEvent servletRequestEvent) 方法中实现的。

对于#1,我找到了一篇文章here,描述了Spring Session支持的SessionEventHttpSessionListenerAdapter的使用。并在我的 session.xml 中添加此配置。

<context:annotation-config/>
<bean class="org.springframework.session.hazelcast.config.annotation.web.http.HazelcastHttpSessionConfiguration"/>

<bean class="org.springframework.session.web.http.SessionEventHttpSessionListenerAdapter">
    <constructor-arg>
        <list>
            <bean class="xxx.xxx.xxx.xxx.xxx.xxx.MyHttpSessionListener"/>
        </list>
    </constructor-arg>
</bean>

还在我的部署描述符中添加以下配置(例如 web.xml)

<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

经过一些调试,我注意到我的HttpSessionListener正在使用spring session提供的会话。

但是,对于第 2 项,使用 ServletRequestListener 实现,我找不到将其迁移到 Spring 会话的方法。它仍在使用容器提供的会话。

是否有用于 ServletRequestListener 的相应适配器,例如 SessionEventHttpSessionListenerAdapter? Spring Session 支持吗?为了让我们的功能与 Spring session 一起工作,我还有哪些其他选择?

【问题讨论】:

    标签: spring-session servlet-listeners


    【解决方案1】:

    我最终使用自定义过滤器来管理 HTTP 会话失效。依次使用以下条目修改 web.xml:

    (a) 注册springSessionRepositoryFilter

    <filter>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    (b) 添加 requestContextFilter

    <filter>
        <filter-name>requestContextFilter</filter-name>
        <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    (c) 添加自定义过滤器

    <filter>
        <filter-name>myCustomServletRequestFilter</filter-name>
        <filter-class>com.xxx.xxx.xxx.servlet.filter.MyCustomServletRequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myCustomServletRequestFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    (d) 加载 spring 会话上下文

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:application-context.xml</param-value>
    </context-param>
    

    所有 HTTP 请求现在都使用 spring session。

    【讨论】:

    • 在后续请求中遇到了另一个问题。它被重定向到登录页面。检查一些资源,它可能与 CORS 设置有关,因为我看到了这些新的请求标头值:Sec-Fetch-SiteSec-Fetch-ModeSec-Fetch-Destsec-ch-uasec-ch-ua-mobile。在 Spring 会话集成之前未返回/包含这些标头。如果有人遇到同样的问题,请告知您是如何解决的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2017-01-09
    • 2023-02-22
    • 2018-08-11
    相关资源
    最近更新 更多