`

解决tomcat中反序列化找不到class

 
阅读更多
tomcat反序列化的过程中一直报ClassNotFoundException,这个是什么原因呢

很明显是classloader找不到这个class,为什么呢,我的应用代码中明明就有啊。
实际上java反序列化的时候,我们一般用的是ObjectInputStream,他默认会去找sun.misc.VM.latestUserDefinedLoader(),这个就是系统默认的appClassloader。


重点来了,我们的tomcat中应用代码的类不是appClassloader,而是webAppClassloader,是tomcat自己搞的一个classLoader。

解决方法:写个类继续ObjectInputStream,覆盖他的resolveClass方法。使用当前线程的classloader,也就是webAppClassloader
具体代码:
package com.vip.marmot.mirror.agent.dataHandler;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.util.HashMap;
 
/**
 * Created by cloud.huang on 17/5/18.
 */
public class YunbinObjectInputStream extends ObjectInputStream {
    public YunbinObjectInputStream(InputStream in) throws IOException {
        super(in);
    }
 
    protected YunbinObjectInputStream() throws IOException, SecurityException {
    }
 
    /**
     * table mapping primitive type names to corresponding class objects
     */
    private static final HashMap<String, Class<?>> primClasses
            = new HashMap<>(8, 1.0F);
 
    static {
        primClasses.put("boolean", boolean.class);
        primClasses.put("byte", byte.class);
        primClasses.put("char", char.class);
        primClasses.put("short", short.class);
        primClasses.put("int", int.class);
        primClasses.put("long", long.class);
        primClasses.put("float", float.class);
        primClasses.put("double", double.class);
        primClasses.put("void", void.class);
    }
 
    @Override
    protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
        String name = desc.getName();
        try {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            return Class.forName(name, false, loader);
        } catch (ClassNotFoundException ex) {
            Class cl = (Class) primClasses.get(name);
            if (cl != null) {
                return cl;
            } else {
                throw ex;
            }
        }
    }
}

0
0
分享到:
评论

相关推荐

    struts2重要知识点原理

    它的设计目标是简化开发过程,提供强大的验证和国际化功能,以及灵活的插件架构。Struts2的核心是基于拦截器的Action体系,这使得它能够处理用户的请求并调用相应的业务逻辑。 **核心控制器:FilterDispatcher** ...

    tomcat session redis支持

    这个插件允许Tomcat将session序列化并存储在Redis中,然后在需要时反序列化回session对象。 实现步骤如下: 1. **安装Redis**:首先需要在服务器上安装并配置Redis实例。确保其运行稳定,并且可以通过网络访问。 ...

    用Redis存储Tomcat集群的Session

    每个Tomcat实例在处理请求时,不再在本地存储Session,而是将Session对象序列化后存储到Redis中,键通常是用户的Session ID。这样,无论用户请求哪个Tomcat实例,都能从Redis中获取正确的Session。 5. **集成步骤**...

    websocket+tomcat+java环境部署和实现.doc

    在实际开发中,你可能需要处理更多复杂的逻辑,例如错误处理、用户认证、数据序列化和反序列化等。记得在部署应用到生产环境时,考虑安全性、性能优化以及负载均衡等因素。WebSocket的使用大大提升了实时通信的能力...

    tomcat7 jedis session 同步

    5. **处理Session数据序列化**:由于Session数据是Java对象,需要进行序列化才能存储到Redis。可以自定义`SerializationStrategy`,或者使用已有的序列化库如Google的Protobuf或Jackson。 6. **测试和优化**:部署...

    jenkins+svn+tomcat+ansible发到tomcat-重启.docx

    根据提供的文档内容,本文将详细解析如何通过Jenkins结合Subversion (SVN)、Tomcat以及Ansible实现自动化部署Web应用程序。此方案适用于希望提高软件发布效率与可靠性的团队。 ### Jenkins + SVN + Tomcat + ...

    apach tomcat 不同session负载均衡配置

    3. 使用应用层解决方案:例如在应用代码中,可以检测请求的session是否已存在,如果不存在则创建新的session,以确保所有请求都发送到同一台服务器。 三、挑战与优化 尽管session复制和粘滞session提供了高可用性和...

    tomcat7实现memcached session共享所需jar包

    - `tangosol-coherence.jar`(仅限于`spymemcached`):这个库用于序列化和反序列化session对象,因为Memcached只处理二进制数据。 4. **配置步骤** a. 将以上提到的jar包放入Tomcat的`lib`目录下。 b. 修改...

    项目中遇到的异常

    #### 资源找不到 此问题通常发生在方法名拼写错误、子控制器配置缺少`parameter`属性或formbean路径配置不准确的情况下。检查方法名是否与实际定义的一致,确保子控制器的`parameter`属性正确配置,以及formbean的...

    flex和java整合常见问题分析

    - **原因**:数据格式不匹配或序列化/反序列化过程出现问题。 - **解决方法**: - 使用Flex的` ArrayCollection`或`Object[]`等类型来封装数据,确保两端的数据格式一致。 - 调整BlazeDS中的配置,确保数据能够...

    jsontools-core-1.7.jar的Maven使用

    - 使用JSON时,注意数据类型的一致性,避免在序列化和反序列化过程中出现类型转换错误。 总结,`jsontools-core-1.7.jar`是一个方便的Java JSON处理库,结合Maven的管理,可以轻松地在项目中使用。通过理解并实践...

    用WebService传递POJO和对象数组的例子.doc

    这通常是由于服务端和客户端之间数据序列化和反序列化的不匹配导致的。AXIS2在处理POJO时会自动进行对象的序列化和反序列化,如果这个过程出现问题,就会导致对象未能正确初始化。 解决这个问题的关键在于确保...

    JavaBean知识准备

    - JavaBean一般实现 `java.io.Serializable` 接口,便于序列化和反序列化操作。 5. **反射** - JavaBean的设计考虑了Java反射机制的支持,以便于框架可以自动发现并使用Bean的功能。 6. **标准化** - 为了...

    Hessian例子.doc

    - 服务端接收到请求后,由`HessianServlet`解析二进制流,反序列化成方法调用和参数,并执行对应的`HessianImpl`方法。 - 执行结果再通过相同的过程反序列化并返回给客户端。 总结起来,这个例子展示了如何使用...

    java制作的聊天工具服务端源码

    4. **数据序列化与反序列化**:可能使用JSON或XML格式来交换数据,需要使用如Jackson或Gson等库进行序列化和反序列化操作。 5. **API设计原则**:RESTful API设计可能是遵循的标准,通过HTTP方法(GET、POST、PUT、...

    axis部署WebServices 和 JAXB的使用

    JAXB(Java Architecture for XML Binding)是Java平台的标准部分,用于将XML文档与Java对象之间进行绑定,以便于数据的序列化和反序列化。在这个"axis部署WebServices 和 JAXB的使用"主题中,我们将深入探讨这两个...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】Java序列化与反序列化 27 为什么需要序列化与反序列化 28 如何实现Java序列化与反序列化 28 【基础】String s = new String("xyz");创建了几个字符串对象 30 【基础】接口是否可继承(extends)接口?抽象类...

    java面试题

    65.1. java序列化、反序列化 48 65.2. 对象的序列化主要有两种用途: 48 65.3. 对象序列化包括如下步骤: 49 65.4. 对象反序列化的步骤如下: 49 66. 反射机制 49 66.1.1. 传统的类型转换。 49 66.1.2. 通过Class...

    Android开发项目怎样快速开发框架

    Hessian是一种二进制Web服务协议,它能高效地处理Java对象的序列化和反序列化。在Android开发中,Hessian用于客户端和服务端之间的通信,可以减少数据传输的开销,提高网络通信的效率。通过Hessian,Android应用可以...

    ajax框架swato官方文档

    3. **数据序列化**:采用JSON格式对服务器端POJO(Plain Old Java Object)对象的数据进行序列化处理,使得开发者能够在任何JavaScript环境中轻松访问远程数据,既可以通过硬编码实现,也可以与其他成熟的JavaScript...

Global site tag (gtag.js) - Google Analytics