JDK反序列化时修改类的全限定性名解析

 更新时间:2017年12月20日 16:47:01   作者:司青  
这篇文章主要介绍了JDK反序列化时修改类的全限定性名解析,具有一定借鉴价值,需要的朋友可以参考下。

应用场景

SpringSecurityOAuth2有一个奇葩的设计,那就是它将与access_token相关的所有属于都封装到OAuth2AccessToken中,然后保存时会直接将该对象序列化成字节写入数据库。我们在资源服务器中想要直接读数据库来取出access_token来验证令牌的有效性,然而又不想引入SpringSecurity的相关依赖污染jar包。这时可以将SpringSecurity中OAuth2AccessToken的唯一实现类DefaultOAuth2AccessToken的源码copy到我们的项目中,然后通过JDBC读取byte[],通过JDK自带的反序列化机制来还原DefaultOAuth2AccessToken对象。这时就会遇到问题,即原来的OAuth2AccessToken所在包是以org.springframework.security开头的,而我们copy过来源码后,包名是以我们自己定义的包cn.com.XXXX开头的,这样在反序列化时,即使两个类的字段完全一样,但由于字节流中存储的类信息的全限定性名不同,也会导致反序列化失败。

解决方案

我们可以定义子类继承JDK的ObjectInputStream,然后重写readClassDescriptor()方法:

@Override
    protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
	ObjectStreamClass read = super.readClassDescriptor();
	if (read.getName().startsWith("原包名")) {
		Class type = Class.forName(read.getName().replace("新包名"));
		return ObjectStreamClass.lookup(type);
	}
	return read;
}

这样在反序列化时就不会报错了。原理并不复杂,其实就是在解析字节流时,将解析后应为org.springframework.security.oauth2.common.DefautOAuthToken的class,替换成了我们自己copy过来源码的cn.com.XXXXXX.DefaultOAuthToken从而达到”欺骗”的目的。在该场景下,我们就可以做到在资源提供方不引入SpringSecurity框架而只使用SpringSecurityOAuth2的授权服务。资源提供方直接读数据库来验证令牌的有效性,而不是向授权服务查询。

总结

以上就是本文关于JDK反序列化时修改类的全限定性名解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其它相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • 全面解读Java NIO(看这篇就够了)

    全面解读Java NIO(看这篇就够了)

    Java NIO是Java1.4之后推出来的一套IO接口,NIO提供了一种完全不同的操作方式, NIO支持面向缓冲区的、基于通道的IO操作,这篇文章主要介绍了Java NIO详解(看这篇就够了),需要的朋友可以参考下
    2023-05-05
  • JAVA中的 map,list,set

    JAVA中的 map,list,set

    这篇文章主要介绍了JAVA中的 map、list、set这三个集合,下面文章围绕JAVA中的三大集合 map、list、set详情讲解,需要的朋友可以参考一下
    2021-11-11
  • SpringBoot整合WebSocket的客户端和服务端的实现代码

    SpringBoot整合WebSocket的客户端和服务端的实现代码

    这篇文章主要介绍了SpringBoot整合WebSocket的客户端和服务端的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • SpringMVC前后端传值的几种实现方式

    SpringMVC前后端传值的几种实现方式

    本文主要介绍了SpringMVC前后端传值的方式实现,包括使用HttpServletRequest、HttpSession、Model和ModelAndView等方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • 关于@GetMapping和@GetMapping(value=““)的区别

    关于@GetMapping和@GetMapping(value=““)的区别

    这篇文章主要介绍了关于@GetMapping和@GetMapping(value=““)的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • java实现  微博登录、微信登录、qq登录实现代码

    java实现 微博登录、微信登录、qq登录实现代码

    这篇文章主要介绍了java实现 微博登录、微信登录、qq登录实现代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • SpringSecurity中内置过滤器的使用小结

    SpringSecurity中内置过滤器的使用小结

    SpringSecurity通过其复杂的过滤器链机制,为Java应用提供了全面的安全防护,本文主要介绍了SpringSecurity中内置过滤器的使用小结,感性的可以了解一下
    2025-03-03
  • java实现字符串排列组合问题

    java实现字符串排列组合问题

    这篇文章主要为大家详细介绍了java实现字符串排列组合问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 详解使用Spring Boot的AOP处理自定义注解

    详解使用Spring Boot的AOP处理自定义注解

    本篇文章主要介绍了详解使用Spring Boot的AOP处理自定义注解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Spring AI源码分析流式回答(最新推荐)

    Spring AI源码分析流式回答(最新推荐)

    本文我们将重点讲解流式响应的概念与实现,毕竟,AI的流式回答功能与其交互体验密切相关,是提升用户满意度的重要组成部分,我们将通过代码示例来展示这一过程,帮助您更清晰地理解如何在实际应用中进行操作,感兴趣的朋友一起看看吧
    2024-11-11

最新评论