当前位置: 首页 > 知识库问答 >
问题:

在Spring会话JDBC中使用JSON格式

敖永丰
2023-03-14

当您使用spring-sesion-jdbc时,会话在DB中以字节的形式序列化,这意味着每次将Spring升级到具有不兼容的Session.serialVersionUUID的版本时,您都必须删除所有会话。

我想用JSON格式存储会话,但在谷歌上搜索了一下之后,似乎没有人这样做过。

当您认为使用JSON在Redis中存储会话是常见的做法时,这很奇怪。

为什么没有一种标准的方法以JSON格式在JDBC中存储会话?这是如何实现的?

共有1个答案

谷梁玺
2023-03-14

JSON的主要问题是对象类型:您可以轻松地将对象序列化为JSON,但在反序列化方面——您永远无法知道JSON代表的对象类型。

我也遇到过同样的问题。但对我来说,只解析JSON数据的一部分就足够了,这部分数据来自外部源。我的解决方案是创建两个新的org实现。springframework。果心转换转换器。转换器接口-一个用于序列化(对象字节【】),另一个用于反序列化(字节【】对象),然后将其注册为Spring的转换器。该转换器由组织使用。springframework。一场jdbc。JdbcOperationsSessionRepository存储/读取会话属性字节。您可以这样创建实现(使用Jackson库处理JSON):

JsonSerializingConverter

@Component
public class JsonSerializingConverter implements Converter<Object, byte[]> {
    @Override
    public byte[] convert(Object source) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.writeValueAsBytes(source);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

JsonDeserializingConverter

@Component
public class JsonDeserializingConverter implements Converter<byte[], Object> {
    @Override
    public Object convert(byte[] source) {
       ObjectMapper objectMapper = new ObjectMapper();
       try {
         return objectMapper.readValue(source, Object.class);
       } catch (IOException e) {
         e.printStackTrace();
       }
       return null;
    }
}

接下来,您应该注册它们:

@Configuration
public class ConversionServiceConfiguration
{
    @Bean
    public ConversionServiceFactoryBean conversionService()
    {
        ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
        bean.setConverters(getConverters());

        return bean;
    }

    private Set<Converter> getConverters()
    {
        Set<Converter> converters = new HashSet<>();
        converters.add(new JsonDeserializingConverter());
        converters.add(new JsonSerializingConverter());

        return converters;
    }
}

除非您不需要将JSON数据与对象绑定(例如,CsrfToken)。在这种情况下,您可能可以在序列化步骤中使用目标类型注释JSON字符串,并在反序列化步骤中反序列化为该类型。希望这能有所帮助。

 类似资料:
  • 我需要在代码中实现JDBC会话。为此,我按照https://www.baeldung.com/spring-session-jdbc. 我导入了maven依赖项并添加了spring。一场应用程序中的存储类型=jdbc。属性文件。然后我运行程序,它抛出了一系列错误。我不能确切地理解它在尖叫什么。如果有人能帮助我,我真的很感激。 这是我得到的错误:

  • 我使用Spring Boot和Spring会话来控制一个使用ReactJS作为前端的应用程序。我的问题很简单,我尝试了几种方法来处理,但都没有成功。 React部分使用AJAX在登录后调用Spring REST服务(我也使用Spring Security),这至少需要30分钟。之后,会话停止,所有调用都会收到一个302,并以登录页面作为响应。这是意料之中的。 但我的问题是:有什么更好的方法来延长后

  • 问题内容: 我有一个spring / jdbc / oracle 10g应用程序。Oracle服务器数据库时区设置为GMT + 2 JVM时区设置为GMT + 2(即使对于我而言这无关紧要)。 我有一个执行某些日期操作的存储过程。问题是,即使我未在代码/配置中明确设置会话时区,会话时区也不同于数据库时区(GMT)。 据我所知,会话时区默认情况下等于数据库时区。知道为什么会话时区与数据库时区不同,或

  • 为了将会话保存在数据库中,我在这里使用这个示例实现了Spring会话JDBC。我在使用@Autow的会话范围时遇到问题:我JavaClass如下: 然后我在会话\u范围内注册这个bean,如下所示: 在控制器中,我正在对其进行布线并尝试使用: 当我尝试运行时,出现以下错误:

  • 问题内容: 我将JSF 2用于视图,将Spring用于业务逻辑。我正在尝试使用注解(@Scope(“ session”))将会话范围设置为我的一个Spring bean,但是却遇到了这个异常: 我知道RequestContextListener。在我的web.xml中。我还添加了RequestContextFilter: 似乎没有任何作用。我究竟做错了什么?谢谢! 问题答案: 尝试使用aop:sc

  • 我的应用程序使用SpringWebMVC框架运行,没有Spring Boot。现在,我想使用spring会话JDBC将会话存储到应用程序使用的数据库中。我在网上找到的所有示例都使用spring boot,如果没有使用spring boot,那么他们使用的数据源配置是嵌入式数据库,如下所示: 我有使用HikariCP的数据源配置,我希望spring会话使用此数据源配置。 如何使用当前配置与sprin