http://wesee.iteye.com/blog/663876
在以servlet方式集成hessian时很容易获得客户端request,就不做过多介绍,在此介绍一下Hessian结合spring时如何获得客户端request。
在remoting-servlet.xml中配置服务接口
<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了,所有的客户端信息随你所用了,而且是线程安全的。