提交 7d8aa05c 编写于 作者: J Juergen Hoeller

added "acceptProxyClasses" flag to RemoteInvocationSerializingExporter

上级 2c199cf1
/* /*
* Copyright 2002-2008 the original author or authors. * Copyright 2002-2011 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -57,7 +57,7 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea ...@@ -57,7 +57,7 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea
/** /**
* Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase. * Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
* @param in the InputStream to read from * @param in the InputStream to read from
* @param codebaseUrl the codebase URL to load classes from if not found locally * @param codebaseUrl the codebase URL to load classes from if not found locally
* (can consist of multiple URLs, separated by spaces) * (can consist of multiple URLs, separated by spaces)
* @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream) * @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream)
...@@ -68,7 +68,7 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea ...@@ -68,7 +68,7 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea
/** /**
* Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase. * Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
* @param in the InputStream to read from * @param in the InputStream to read from
* @param classLoader the ClassLoader to use for loading local classes * @param classLoader the ClassLoader to use for loading local classes
* (may be <code>null</code> to indicate RMI's default ClassLoader) * (may be <code>null</code> to indicate RMI's default ClassLoader)
* @param codebaseUrl the codebase URL to load classes from if not found locally * @param codebaseUrl the codebase URL to load classes from if not found locally
...@@ -82,6 +82,22 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea ...@@ -82,6 +82,22 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea
this.codebaseUrl = codebaseUrl; this.codebaseUrl = codebaseUrl;
} }
/**
* Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
* @param in the InputStream to read from
* @param classLoader the ClassLoader to use for loading local classes
* (may be <code>null</code> to indicate RMI's default ClassLoader)
* @param acceptProxyClasses whether to accept deserialization of proxy classes
* (may be deactivated as a security measure)
* @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream)
*/
public CodebaseAwareObjectInputStream(
InputStream in, ClassLoader classLoader, boolean acceptProxyClasses) throws IOException {
super(in, classLoader, acceptProxyClasses);
this.codebaseUrl = null;
}
@Override @Override
protected Class resolveFallbackIfPossible(String className, ClassNotFoundException ex) protected Class resolveFallbackIfPossible(String className, ClassNotFoundException ex)
......
/* /*
* Copyright 2002-2008 the original author or authors. * Copyright 2002-2011 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -57,6 +57,8 @@ public abstract class RemoteInvocationSerializingExporter extends RemoteInvocati ...@@ -57,6 +57,8 @@ public abstract class RemoteInvocationSerializingExporter extends RemoteInvocati
private String contentType = CONTENT_TYPE_SERIALIZED_OBJECT; private String contentType = CONTENT_TYPE_SERIALIZED_OBJECT;
private boolean acceptProxyClasses = true;
private Object proxy; private Object proxy;
...@@ -70,12 +72,27 @@ public abstract class RemoteInvocationSerializingExporter extends RemoteInvocati ...@@ -70,12 +72,27 @@ public abstract class RemoteInvocationSerializingExporter extends RemoteInvocati
} }
/** /**
* Return the content type to use for sending remote invocation responses. * Return the content type to use for sending remote invocation responses.
*/ */
public String getContentType() { public String getContentType() {
return this.contentType; return this.contentType;
} }
/**
* Set whether to accept deserialization of proxy classes.
* <p>Default is "true". May be deactivated as a security measure.
*/
public void setAcceptProxyClasses(boolean acceptProxyClasses) {
this.acceptProxyClasses = acceptProxyClasses;
}
/**
* Return whether to accept deserialization of proxy classes.
*/
public boolean isAcceptProxyClasses() {
return this.acceptProxyClasses;
}
public void afterPropertiesSet() { public void afterPropertiesSet() {
prepare(); prepare();
...@@ -102,7 +119,7 @@ public abstract class RemoteInvocationSerializingExporter extends RemoteInvocati ...@@ -102,7 +119,7 @@ public abstract class RemoteInvocationSerializingExporter extends RemoteInvocati
* @throws java.io.IOException if creation of the ObjectInputStream failed * @throws java.io.IOException if creation of the ObjectInputStream failed
*/ */
protected ObjectInputStream createObjectInputStream(InputStream is) throws IOException { protected ObjectInputStream createObjectInputStream(InputStream is) throws IOException {
return new CodebaseAwareObjectInputStream(is, getBeanClassLoader(), null); return new CodebaseAwareObjectInputStream(is, getBeanClassLoader(), isAcceptProxyClasses());
} }
/** /**
......
/* /*
* Copyright 2002-2008 the original author or authors. * Copyright 2002-2011 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -18,6 +18,7 @@ package org.springframework.core; ...@@ -18,6 +18,7 @@ package org.springframework.core;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.NotSerializableException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.ObjectStreamClass; import java.io.ObjectStreamClass;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
...@@ -36,16 +37,33 @@ public class ConfigurableObjectInputStream extends ObjectInputStream { ...@@ -36,16 +37,33 @@ public class ConfigurableObjectInputStream extends ObjectInputStream {
private final ClassLoader classLoader; private final ClassLoader classLoader;
private final boolean acceptProxyClasses;
/** /**
* Create a new ConfigurableObjectInputStream for the given InputStream and ClassLoader. * Create a new ConfigurableObjectInputStream for the given InputStream and ClassLoader.
* @param in the InputStream to read from * @param in the InputStream to read from
* @param classLoader the ClassLoader to use for loading local classes * @param classLoader the ClassLoader to use for loading local classes
* @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream) * @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream)
*/ */
public ConfigurableObjectInputStream(InputStream in, ClassLoader classLoader) throws IOException { public ConfigurableObjectInputStream(InputStream in, ClassLoader classLoader) throws IOException {
this(in, classLoader, true);
}
/**
* Create a new ConfigurableObjectInputStream for the given InputStream and ClassLoader.
* @param in the InputStream to read from
* @param classLoader the ClassLoader to use for loading local classes
* @param acceptProxyClasses whether to accept deserialization of proxy classes
* (may be deactivated as a security measure)
* @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream)
*/
public ConfigurableObjectInputStream(
InputStream in, ClassLoader classLoader, boolean acceptProxyClasses) throws IOException {
super(in); super(in);
this.classLoader = classLoader; this.classLoader = classLoader;
this.acceptProxyClasses = acceptProxyClasses;
} }
...@@ -68,6 +86,9 @@ public class ConfigurableObjectInputStream extends ObjectInputStream { ...@@ -68,6 +86,9 @@ public class ConfigurableObjectInputStream extends ObjectInputStream {
@Override @Override
protected Class resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException { protected Class resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
if (!this.acceptProxyClasses) {
throw new NotSerializableException("Not allowed to accept serialized proxy classes");
}
if (this.classLoader != null) { if (this.classLoader != null) {
// Use the specified ClassLoader to resolve local proxy classes. // Use the specified ClassLoader to resolve local proxy classes.
Class[] resolvedInterfaces = new Class[interfaces.length]; Class[] resolvedInterfaces = new Class[interfaces.length];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册