gpt4 book ai didi

java - spring-session是否用HttpSession保存bean?

转载 作者:行者123 更新时间:2023-12-02 01:33:18 24 4
gpt4 key购买 nike

我正在使用 Redis 在 JEE 项目中实现 spring-session。 HttpSession 正在我的 Redis 服务器上保存和更新,我可以在节点故障转移时使用它。

问题是,我的 session 作用域 bean 没有与 Redis 中的 session 一起保存,因此我无法在集群上使用,因为用户需要存储在 bean 上的信息来使用很多功能(有策略的)。

我错过了什么吗?我找不到很多关于这方面的信息,而且由于我是 Spring 的新手,所以它变得令人困惑。 bean 是否(或者可以)与 session 一起存储在 Redis 中吗?这是我的实现:

web.xml:

<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>bootstrap</param-value>
</context-param>

<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>

<session-config>
<session-timeout>30</session-timeout>
</session-config>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>

<context-param>
<param-name>
javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE
</param-name>
<param-value>true</param-value>
</context-param>

<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>

<welcome-file-list>
<welcome-file>login.faces</welcome-file>
</welcome-file-list>

<error-page>
<exception-type>com.exception.InvalidPasswordException</exception-type>
<location>/ErroServlet</location>
</error-page>
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/login.faces</location>
</error-page>
<error-page>
<!-- Missing login -->
<error-code>401</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<!-- Forbidden directory listing -->
<error-code>403</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<error-page>
<!-- Uncaught exception -->
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<!-- Unsupported servlet method -->
<error-code>503</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/*.xml
</param-value>
</context-param>
<listener>

<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<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>

<filter>
<filter-name>UserCheckFilter</filter-name>
<filter-class>com.servlet.UserCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserCheckFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
<url-pattern>/dashboard/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>UserLogCheckFilter</filter-name>
<filter-class>com.servlet.UserLogCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserLogCheckFilter</filter-name>
<url-pattern>/login.faces</url-pattern>
</filter-mapping>


<filter>
<filter-name>AWSXRayServletFilter</filter-name>
<filter-class>com.amazonaws.xray.javax.servlet.AWSXRayServletFilter</filter-class>
<init-param>
<param-name>fixedName</param-name>
<param-value>app</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AWSXRayServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

session.xml:

<context:annotation-config/>

<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />

<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="127.0.0.1" p:port="6379" />

pom.xml:

    <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3.3.RELEASE</version>
<type>pom</type>
</dependency>

Controller :(抽象 Controller 实现Serialized)

...

@Named
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Controller extends AbstractController {

// EJB to access database using JPA
@EJB(mappedName = "java:global/app/app-ejb/ControllerService!com.service.ControllerService")
ControllerService controllerService;

// A class with my JPA Entity used in the form and some other properties
private FormFields formFields;

...

最佳答案

如果你想从请求中获取session,你应该在springSessionRepositoryFilter之后添加这个过滤器

<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>

此外,我没有在您的 web.xml 中看到此配置,这对于在集群中使用很重要

<context-param>
<param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
<param-value>false</param-value>
</context-param>

因此,当您将 USE_ENCRYPTION 设置为 false 时,集群中的节点可以检索 session 中的数据。

附注使用https://stackoverflow.com/a/35626681/4431053很重要当您使用客户端状态保存而不是禁用加密时。感谢@Kukeltje。

对于 Myfaces,您还可以使用以下配置进行加密:

 <context-param>
<param-name>org.apache.myfaces.ALGORITHM</param-name>
<param-value>AES</param-value>
</context-param>
<!-- Defines the secret (Base64 encoded) used to initialize the secret key
for encryption algorithm. The size of it depends on the algorithm used for encryption -->
<context-param>
<param-name>org.apache.myfaces.SECRET</param-name>
<param-value>MoH3NzQ1Njc4OTAxMjM0NTY3ODkwMTIz</param-value>
</context-param>
<!-- Define the initialization code (Bas64 encoded) that are used to initialize the secret key used
on the Message Authentication Code algorithm. The size of it depends on the algorithm used for mac calculation -->
<context-param>
<param-name>org.apache.myfaces.MAC_SECRET</param-name>
<param-value>SaEiDiEyMzQ=</param-value>
</context-param>

关于java - spring-session是否用HttpSession保存bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52285153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com