dubbx虽然是基于jboss的resteasy实现restfull,但是对resteasy原生的配置却不支持(可能是考虑到dubbo本事的设计模式及实现难度,但是和大部分framework的设计风格背道而驰),ExceptionMapper , Filter 和 Interceptor  需要配置在  <dubbo:protocol  extension="x,x"/> ,参考 http://dangdangdotcom.github.io/dubbox/rest.html

一.Filter

Filter主要用于访问和设置HTTP请求和响应的参数、URI等等。例如,设置HTTP响应的cache header

1.ContainerRequestFilter 服务器端请求处理之前,一般用于取请求参数做一些处理,比如记录access log,流量控制,权限校验 等。

常用的几个点:

使用 @Context 获取 HttpServletRequest 等servlet内置对象。

和标准的web filter一样,Spring @Autowired 无法使用,必须通过 WebApplicationContext 获取Spring管理的bean。

数据传递使用 SecurityContext (本人能力有限,没找到更好的方式)。

直接返回结果 requestContext.abortWith(response);特别注意,调用此方法后,如果继续有其他code,下边的code一样会执行的。(java语言本身的限制)。

 

package com.leon.filter;

import java.io.IOException;
import java.util.Date; import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext; import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils; @Component
public class SecurityFilter implements ContainerRequestFilter{ @Context
private transient HttpServletRequest servletRequest; private SellerSecurityService sellerSecurityService; private AccessLogService accessLogService; private SellerPvService sellerPvService; @Override
public void filter(ContainerRequestContext requestContext)
throws IOException { Date now=new Date(); String appKey=HttpUtil.getParameterString(servletRequest,"appkey"); if(StringUtil.isEmpty(appKey)){
Response response=bulidUnauthResponse(Constant.missAppKeyResponse);
requestContext.abortWith(response);
return;
} getService(); AccessLog accessLog=new AccessLog(); accessLogService.log(accessLog); SecurityContext securityContext=bulidSecurityContext("test");
requestContext.setSecurityContext(securityContext); } public static SecurityContext bulidSecurityContext(final String value){
return new SecurityContext() {
@Override
public boolean isUserInRole(String role) {
return false;
}
@Override
public boolean isSecure() {
return false;
}
@Override
public Principal getUserPrincipal() {
return null;
}
@Override
public String getAuthenticationScheme() {
return value;
}
};
} private Response bulidUnauthResponse(String context){
return Response.ok().status(Constant.unAuthCode).entity(context).build();
} public void getService() {
if(sellerSecurityService!=null){
return;
}
WebApplicationContext wac=WebApplicationContextUtils.getWebApplicationContext(servletRequest.getServletContext());
sellerSecurityService=wac.getBean(SellerSecurityService.class);
accessLogService=wac.getBean(AccessLogService.class);
sellerPvService=wac.getBean(SellerPvService.class);
} }

2.ContainerResponseFilter 请求处理完之后调用,通常用作装入公共信息到 response

public class CacheControlFilter implements ContainerResponseFilter {

    public void filter(ContainerRequestContext req, ContainerResponseContext res) {
if (req.getMethod().equals("GET")) {
res.getHeaders().add("Cache-Control", "someValue");
}
}
}

二.Interceptor

Interceptor主要用于访问和修改输入与输出字节流,例如,手动添加GZIP压缩:

1.ReaderInterceptor 拦截 MessageBodyReader.readFrom 可以用来实现校验

2.WriterInterceptor  拦截 MessageBodyWriter.writeTo 可以用来实现数据压缩

public class GZIPWriterInterceptor implements WriterInterceptor {

    @Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
OutputStream outputStream = context.getOutputStream();
context.setOutputStream(new GZIPOutputStream(outputStream));
context.proceed();
}
}

三.ExceptionMapper

用来自定义Exception的处理方式。必须继承 ExceptionMapper<E extends Throwable>,泛型为处理的异常类型

package com.leon.exception;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import org.apache.log4j.Logger; public class ExceptionMapperSupport implements ExceptionMapper<Exception> {
private static final Logger LOGGER = Logger
.getLogger(ExceptionMapperSupport.class); /**
* 异常处理
*
* @param exception
* @return 异常处理后的Response对象
*/
@Override
public Response toResponse(Exception exception){
String response;
int code;
if(exception instanceof MyException){
MyException myException=(MyException)exception;
response="{\"resp_code\":\""+myException.getRespCode()+"\",\"resp_info\":\""+myException.getRespInfo()+"\"}";
code=Constant.successCode;
}else{
response=Constant.errorResponse;
LOGGER.error(exception.getMessage(), exception);
code=Constant.errorCode;
}
return Response.ok(response, MediaType.APPLICATION_JSON).status(code)
.build();
}
}

dubbox ExceptionMapper Filter request response 数据获取 数据传递的更多相关文章

  1. vue教程3-05 vue组件数据传递、父子组件数据获取,slot,router路由

    vue教程3-05 vue组件数据传递 一.vue默认情况下,子组件也没法访问父组件数据 <!DOCTYPE html> <html lang="en"> ...

  2. 修改Request 中的数据

    拦截器修改参数 今天一位网友开发中遇到一个需求,他需要在Request中修改传递过来的数据.开始的时候他在拦截器中修改,在拦截器中可以获取到从前台request中 传递过来的数据.他写法大致如下:自定 ...

  3. Struts2:request & response

    整理自网上:  1.   获取Request和Response的方法  1.1. ServletActionContext的静态方法      HttpServletRequest request = ...

  4. request \response 总结

    request&response request 1.获得信息的方法     1> 获得请求首行信息的方法         *getMethod         *getContextP ...

  5. Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递

    在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节 ...

  6. chain.doFilter(request,response)含义

    过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...

  7. 详细介绍ASP.NET页面间数据传递的使用方法

    源码:http://www.jinhusns.com/Products/Download/?type=xcj 在ASP.NET中,页面间数据传递的方法有很多.下面为大家总结一下,页面间数据传递的方法. ...

  8. ASP.NET页面间数据传递的方法<转>

    ASP.NET页面间数据传递的方法 作者: 灰色的天空2  来源: 博客园  发布时间: 2010-10-28 11:06  阅读: 822 次  推荐: 0   原文链接   [收藏]   摘要:本 ...

  9. ASP.NET中实现页面间数据传递的方法

    说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是向Session中添加的东西太多会增加服务器的压力,页面间数据传递,数据的作用范围越小越好.   ASP.NET页面间数据传递 ...

随机推荐

  1. P4433 [COCI2009-2010#1] ALADIN

    题目描述 给你 n 个盒子,有 q 个操作,操作有两种: 第一种操作输入格式为"1 L R A B",表示将编号为L到R的盒子里的石头数量变为(X−L+1)×A mod B,其中 ...

  2. IbatisNet连接oracle 报错

    提示什么 connect oracle   1.5.0.xxxx 将你本机的oracle 客户端版本重装换成32位即可

  3. 主机 & 虚拟机 & 开发板 三者的恩爱情仇

    # 主机 & 虚拟机 & 开发板 > 三者网络连通性,使用ping命令检测 @ Bridge 模式 ## 主机 & 虚拟机 主机与虚拟机相当于一个网络里的两台主机,都有各 ...

  4. 3Sum - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 3Sum - LeetCode 注意点 和two sum那道题不一样的是这题返回的是具体的数字,不是下标 解法 解法一:将每个数字都作为target,剩下 ...

  5. BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】

    题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...

  6. 【bzoj4520】 Cqoi2016—K远点对

    http://www.lydsy.com/JudgeOnline/problem.php?id=4520 (题目链接) 题意 求平面内第K远点对的距离. Solution 左转题解:jump 细节 刚 ...

  7. 20135306 2.4 ELF文件格式分析

    2.4   ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...

  8. Java EE之JSTL(下)

    3.使用国际化和格式化标签库(FMT命名空间) 如果你希望创建部署在Web上,并面向庞大的国际化用户的企业级Java应用程序,那么你最终需要为世界的特定区域进行应用程序本地化.这将通过国际化实现(通常 ...

  9. Andorid APK反逆向

    Andorid APK反逆向解决方案---梆梆加固原理探寻http://blog.csdn.net/androidsecurity/article/details/8892635 Android AP ...

  10. luoguP2123 皇后游戏——微扰法的应用与排序传递性的证明

    题目背景 还记得 NOIP 2012 提高组 Day1 的国王游戏吗?时光飞逝,光阴荏苒,两年 过去了.国王游戏早已过时,如今已被皇后游戏取代,请你来解决类似于国王游 戏的另一个问题. 题目描述 皇后 ...