`

Hessian 权限认证

阅读更多
Hessian 权限认证
Hessian的一些基本简介已经在上一节已经全部介绍了,上一节还介绍了Hessian是把对象序列化为二进制流的形式在http信道中传输,那么对于安全性高的应用不应该采用hessian(比如网上支付等)、可以加一些权限验证,比如在服务器端加用户名,密码验证,然后在客户端提供用户名和密码,可如此一来用户名密码也会被捕获,毕竟用户名密码都在Http请求中,如果安全级别特别高的可以加Token,也就是加一层发送前的预备,如下图:

这样的话,既使请求被拦截,他们得到的也只不过是一个过期的Token,无法再一次发送到服务端,当然哪个程序都一样,安全级别一高就会添加很多的操作,就像开着防火墙网速会受一定的影响.下面我来介绍简单的权限认证,后续再结合实践优化程序.
修改服务端程序如下:
public class YclHessianServiceExporter extends HessianServiceExporter { 
	public static final String AUTH = "ycl";
	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String auth = request.getHeader("auth");
		if(auth == null || !auth.equalsIgnoreCase(AUTH)){ 
			//记录异常日志
			return ;
		}
		super.handleRequest(request, response);
	}

}


服务器配置修改如下:
<bean name="/PersonManager" 
		class="org.springframework.remoting.caucho.YclHessianServiceExporter">
		
		<!--  需要导出的目标bean--> 
        <property name="service" >
        	<ref bean="personManager" />
        </property> 
        <!--  Hessian服务的接口--> 
        <property name="serviceInterface" value="com.module.PersonManager"/>  
	</bean>


修改客户端程序如下(这是一个代理工厂,每一次客户端通过代码连接服务器时都会先通过URL来得到服务器端的连接)
public class YclHessianProxyFactory extends HessianProxyFactory{

	@Override
	protected URLConnection openConnection(URL url) throws IOException {
		URLConnection conn = super.openConnection(url);
        conn.setRequestProperty("AUTH", "ycl");
        return conn; 
	}

}

客户端配置如下:
<!-- PersonManager服务 -->
	<bean id="personManagerClient"
		class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
		<property name="serviceUrl">
			<value>
				http://localhost/Hessian/remoting/PersonManager
			</value>
		</property>
		<property name="serviceInterface">
			<value>com.module.PersonManager</value>
		</property>
		  <property name="proxyFactory">
            <bean class="com.caucho.hessian.client.YclHessianProxyFactory"/> 
       </property> 
	</bean>

如此一来,在服务器启动的时候接收信息时,就会添加验证,如果Auth验证不通过,那么就不会再继续执行以下的程序.这种方式是能够解决权限验证方式,但是如何添加Token,使用这种方式如果请求被拦截,服务还是可以被窃取,这将在下一节学习,这一节要结合上一节.
  • 大小: 18.1 KB
分享到:
评论
3 楼 kadlly 2015-09-24  

public static final Logger logger = LoggerFactory.getLogger(HSExporter.class);

private static Set<String> authSet = new HashSet<String>();

static {
authSet.add("Basic dGVzdDp0ZXN0");
}

public static void addAuth(String auth) {
authSet.add(auth);
}

public static void clear() {
authSet.clear();
}

@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String auth = request.getHeader("Authorization");
if (!authSet.isEmpty()) {// 记录异常日志
if (auth == null || !authSet.contains(auth)) {
logger.error(request.getRemoteAddr() + " not auth");
return;
}
}
super.handleRequest(request, response);
}

public static String base64(String value) {
StringBuffer cb = new StringBuffer();

int i = 0;
for (i = 0; i + 2 < value.length(); i += 3) {
long chunk = value.charAt(i);
chunk = (chunk << + value.charAt(i + 1);
chunk = (chunk << + value.charAt(i + 2);

cb.append(encode(chunk >> 18));
cb.append(encode(chunk >> 12));
cb.append(encode(chunk >> 6));
cb.append(encode(chunk));
}

if (i + 1 < value.length()) {
long chunk = value.charAt(i);
chunk = (chunk << + value.charAt(i + 1);
chunk <<= 8;

cb.append(encode(chunk >> 18));
cb.append(encode(chunk >> 12));
cb.append(encode(chunk >> 6));
cb.append('=');
} else if (i < value.length()) {
long chunk = value.charAt(i);
chunk <<= 16;

cb.append(encode(chunk >> 18));
cb.append(encode(chunk >> 12));
cb.append('=');
cb.append('=');
}

return cb.toString();
}

private static char encode(long d) {
d &= 63L;
if (d < 26L)
return (char) (int) (d + 65L);
if (d < 52L)
return (char) (int) (d + 97L - 26L);
if (d < 62L)
return (char) (int) (d + 48L - 52L);
if (d == 62L) {
return '+';
}
return '/';
}

public static void main(String[] args) {
System.out.println("Basic " + HSExporter.base64(new StringBuilder().append("test").append(":").append("test").toString()));
}

使用该方法,就可以使用原生的代理用户名和密码,
2 楼 a123159521 2011-03-14  
zb7503 写道
spring3  的 HessianProxyFactory中没有函数 openConnection,有没有其它办法实现 在header 中设置参数??


HessianProxyFactory是Hessian3包中的类啊,和Spring3没有关系
1 楼 zb7503 2011-01-17  
spring3  的 HessianProxyFactory中没有函数 openConnection,有没有其它办法实现 在header 中设置参数??

相关推荐

    java开源包1

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包11

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包2

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包3

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包6

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包5

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包10

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包4

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包8

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包7

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包9

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包101

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    Java资源包01

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

Global site tag (gtag.js) - Google Analytics