`
wesee
  • 浏览: 23753 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Hessian获取客户端IP等信息

阅读更多
在以servlet方式集成hessian时很容易获得客户端request,就不做过多介绍,在此介绍一下Hessian结合spring时如何获得客户端request。

在remoting-servlet.xml中配置服务接口
<bean name="/userService" class="org.springframework.remoting.caucho.HessianServiceExporter">
    <property name="service" ref="user"/>
    <property name="serviceInterface" value="com.company.IUser"/>
 </bean> 
</beans>


我们查看HessianServiceExporter原代码发现:
public void handleRequest(HttpServletRequest request, 
                          HttpServletResponse response) 
                          throws ServletException, IOException 

在该方法中可以获得客户端request,那我们就会有很多种方法得到此request;Aop方式或重写方法,下面针对重写方法做了一个简单的显示。


Hessian Service 线程上下文,用以线程安全地保存客户端 request:
public class HessianContext {

    private ServletRequest _request;
    private static final ThreadLocal<HessianContext> _localContext 
                                  = new ThreadLocal<HessianContext>() {
        @Override
        public HessianContext initialValue() {
            return new HessianContext();
        }
    };

    private HessianContext() {
    }

    public static void setRequest(ServletRequest request) {
        _localContext.get()._request = request;
    }

    public static ServletRequest getRequest() {
        return _localContext.get()._request;
    }

    public static void clear() {
        _localContext.get()._request = null;
    }
}


我们自定义类:

public class OurServiceExporter extends HessianExporter implements HttpRequestHandler {

    private static final Logger logger = LoggerFactory.getLogger(OurServiceExporter.class);

    @Override
    public void handleRequest(HttpServletRequest request, 
                              HttpServletResponse response) 
                              throws ServletException, IOException {
        if (!"POST".equals(request.getMethod())) {
            throw new HttpRequestMethodNotSupportedException(
                      request.getMethod(),
                      new String[]{"POST"}, 
                     "HessianServiceExporter only supports POST requests");
        }

        response.setContentType(CONTENT_TYPE_HESSIAN);
        try {
            HessianContext.setRequest(request); //保存Request到Hessian线程上下文
            invoke(request.getInputStream(), response.getOutputStream());
        }
        catch (Throwable ex) {
            logger.error("Hessian skeleton invocation failed");
            throw new NestedServletException("Hessian skeleton invocation failed", ex);
        }
        finally {
            HessianContext.clear();
        }
    }
}


在remoting-servlet.xml中配置服务接口
<bean name="/userService" class="com.mycompany.test.OurServiceExporter">
    <property name="service" ref="user"/>
    <property name="serviceInterface" value="com.company.IUser"/>
 </bean> 
</beans>


Service开发中就可以直接使用 HessianContext.getRequest(); 来获得客户端的request了,所有的客户端信息随你所用了,而且是线程安全的。
分享到:
评论
4 楼 fangzhangsc2006 2012-09-13  
很好,采纳了!
3 楼 zhglzh 2012-01-04  
不错~
3ks
2 楼 sunney2010 2010-09-28  
试用了一下,很不错。呵呵
1 楼 sunney2010 2010-09-28  
楼主:response.setContentType(CONTENT_TYPE_HESSIAN);  中的
CONTENT_TYPE_HESSIAN 这个是哪来的

相关推荐

    Hessian实战应用之获取客户端请求URL和重新转发客户端请求

    例如,`HttpServletRequest`对象提供了`getRemoteAddr()`方法来获取客户端的IP地址,`getQueryString()`获取请求参数,而`getRequestURL()`则返回不带查询字符串的完整URL。如果需要包括查询字符串,可以使用`...

    Hessian源码分析和Hack.doc

    总结,Hessian作为高效的RPC框架,虽然没有内置获取客户端信息的功能,但通过分析其源码并适当扩展,我们能够实现这一需求。需要注意的是,直接修改开源库的源码可能带来维护上的困扰,因此在可行的情况下,推荐使用...

    java 的面试试题

    - **getRemoteAddr()**:获取客户端的IP地址。 - **getRemoteHost()**:获取客户端的主机名。 - **getSession()**:获取与当前请求关联的HttpSession对象。 - **getServerName()**:获取服务器的主机名。 - **...

    dubbo介绍和使用

    2. **配置文件**:通过配置文件指定服务提供者和服务消费者的地址、端口等信息。 3. **启动服务**:服务提供者启动时,会向注册中心注册服务;服务消费者启动时,则会从注册中心获取服务列表并建立连接。 #### 五、...

    rpc远程调用使用说明&源码

    客户端与服务器端之间的通信通常基于TCP/IP协议,使得进程间的交互变得透明,就像调用本地方法一样简单。 **RPC框架的主要组成部分:** 1. **客户端(Client)**:发起RPC调用的程序,它封装了远程方法的参数,并...

    XXL-RPC_XXL-RPC解析_

    - 序列化是RPC框架中的重要环节,XXL-RPC支持Fastjson、Hessian、Java自带的序列化等多种序列化方式,选择合适的序列化方式可以影响性能和兼容性。 4. **线程池管理**: - 为了处理并发请求,XXL-RPC内部使用了...

    抠脚的RPC实现

    在Java中,RPC框架如Hessian、Dubbo、gRPC等广泛应用于微服务架构中,以实现服务间的高效通信。本文将探讨在Java环境下,如何通过代理和反射来实现一个基础的RPC框架。 1. **代理模式**: 在RPC实现中,代理模式起...

    java-rpc远程过程调用

    学习这个简单的Java-RPC实现,你可以了解到RPC的基本原理,这对于理解和使用更复杂的RPC框架,如Dubbo、gRPC或Hessian等,是非常有帮助的。同时,它还能加深你对Java网络编程、多线程、并发控制以及对象序列化的理解...

    自定义的RPC的Java实现

    在自定义RPC框架中,可以使用如Zookeeper、Eureka等服务注册与发现组件,确保客户端能动态找到服务提供者。服务提供者在启动时会将自己的地址注册到服务中心,而客户端则通过服务中心获取服务地址。 此外,负载均衡...

    第六课:Dubbo协议模块源码解析1

    1. **地址**:服务提供者的网络地址,通常包含IP和主机名,如果未填写,系统会自动获取。 2. **端口**:服务监听的端口号,填-1表示系统自动选择。 3. **报文编码**:分为请求头和请求体,用于包装调用信息和参数。 ...

    rpc.zip_java_remote

    Java中常见的序列化库有Hessian、Protobuf、JSON等,这些库能将对象转换为字节流以便在网络上传输。 3. **服务注册与发现**:服务提供者需要将自己的服务注册到服务注册中心,服务消费者则通过服务注册中心查找并...

    rpc远程调用

    2. **请求封装**:客户端将调用信息(包括方法名、参数等)打包成特定格式的请求。 3. **请求发送**:客户端通过网络将请求发送给服务端。 4. **请求处理**:服务端接收到请求后,解码请求,找到对应的方法进行...

    RPC模式

    RPC(Remote Procedure Call)模式是一...天气服务是一个常见的应用场景,可能涉及多个城市天气信息的获取、查询和更新。通过分析这个项目,我们可以深入理解RPC如何在实际业务中工作,以及如何设计和优化分布式服务。

    dubbo——rpc简介1

    2. **网络连接(Network Connection)**:客户端和服务器之间的通信通常基于TCP/IP协议建立Socket连接。这种连接允许数据在网络中传输,是RPC的基础。 3. **服务端(Server)**:服务端提供了实际的服务实现,接收...

    java rpc_demo

    1. **请求构造**:客户端生成一个调用远程方法的请求,包括方法名、参数等信息。 2. **序列化**:请求被转换为网络可传输的格式,通常是字节流或XML、JSON等数据格式。 3. **网络传输**:序列化后的请求通过网络发送...

    dubbo-server-client.zip

    而数据传输通常采用Hessian或FastJson等序列化工具,将对象转换为字节流,以便在网络上传输。选择合适的序列化工具对性能和兼容性都有重要影响。 6. **负载均衡与容错策略** Dubbo支持多种负载均衡策略,如轮询、...

    分布式JAVA应用 基础与实践

    2. 容错与故障恢复:使用心跳检测、超时重试、幂等性设计等手段保证系统的高可用性。 3. 性能优化:通过缓存、异步处理、批量操作等方式提高分布式系统性能。 六、实战案例分析 本教程还将包含实际项目中的分布式...

    RPC设计思路图

    4. **序列化/反序列化**:选择合适的序列化方式,如protobuf,JSON,Hessian等。 5. **负载均衡策略**:设计并实现负载均衡算法,如轮询、权重分配等。 6. **异常处理和重试机制**:确保在网络异常或服务失败时,...

    RPC分布部署demo

    5. **服务调用协议**:RPC框架通常有自己的服务调用协议,如Hessian、Thrift、gRPC等。这些协议定义了请求和响应的格式,以及如何进行序列化和反序列化。 6. **容错机制**:在分布式系统中,故障是常态。RPC框架...

    java源码:brap(Java远程调用框架 BRAP).rar

    1. **服务注册与发现**:BRAP框架使用中心化的服务注册表,服务提供者在启动时会将自己的服务注册到注册表,服务消费者通过查询注册表来获取服务提供者的地址信息,实现动态的服务发现。 2. **服务版本管理**:BRAP...

Global site tag (gtag.js) - Google Analytics