dubbox ExceptionMapper Filter request response 数据获取 数据传递
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 数据获取 数据传递的更多相关文章
- vue教程3-05 vue组件数据传递、父子组件数据获取,slot,router路由
vue教程3-05 vue组件数据传递 一.vue默认情况下,子组件也没法访问父组件数据 <!DOCTYPE html> <html lang="en"> ...
- 修改Request 中的数据
拦截器修改参数 今天一位网友开发中遇到一个需求,他需要在Request中修改传递过来的数据.开始的时候他在拦截器中修改,在拦截器中可以获取到从前台request中 传递过来的数据.他写法大致如下:自定 ...
- Struts2:request & response
整理自网上: 1. 获取Request和Response的方法 1.1. ServletActionContext的静态方法 HttpServletRequest request = ...
- request \response 总结
request&response request 1.获得信息的方法 1> 获得请求首行信息的方法 *getMethod *getContextP ...
- Liferay7 BPM门户开发之40: Form表单的Action到Render的数据传递
在Form提交后的变量,很多情况是要展现在jsp页面中,这时Action到Render的变量传递就非常有用. 例如,您在数据库中添加了学生的详细信息. 为了实现这一需求,先创建Form表单(学生的细节 ...
- chain.doFilter(request,response)含义
过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...
- 详细介绍ASP.NET页面间数据传递的使用方法
源码:http://www.jinhusns.com/Products/Download/?type=xcj 在ASP.NET中,页面间数据传递的方法有很多.下面为大家总结一下,页面间数据传递的方法. ...
- ASP.NET页面间数据传递的方法<转>
ASP.NET页面间数据传递的方法 作者: 灰色的天空2 来源: 博客园 发布时间: 2010-10-28 11:06 阅读: 822 次 推荐: 0 原文链接 [收藏] 摘要:本 ...
- ASP.NET中实现页面间数据传递的方法
说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是向Session中添加的东西太多会增加服务器的压力,页面间数据传递,数据的作用范围越小越好. ASP.NET页面间数据传递 ...
随机推荐
- UVA11374_Airport Express
给一个无向图,有的边是特殊边,最多可以取一条特殊边,求最短路,并且输出路径. 这样考虑,加入所有非特殊边,求出每个点到起点和终点的最短路.然后加入特殊边的时候,如果取当前这条特殊边,那么答案会是两点预 ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- BZOJ3635谈笑风生
一些闲话 这题方法好多啊QAQ,离线有BIT.长链剖分,在线有线段树合并,主席树等. 要我出题绝对不可能放离线过... 题面链接 权限题诶 洛谷 题意简述 简单的看一下题意,就是给定\(a\),求任何 ...
- 【agc023E】Inversions(线段树,动态规划)
[agc023E]Inversions(线段树,动态规划) 题面 AT 给定\(a_i\),求所有满足\(p_i\le a_i\)的排列\(p\)的逆序对数之和. 题解 首先如何计算排列\(p\)的个 ...
- Mininet 系列实验(二)
实验内容 分别通过命令行创建.Python脚本编写以及交互式界面创建来熟悉Mininet的基本功能. 参考 Mininet命令延伸实验扩展 实验环境 虚拟机:Oracle VM VirtualBox ...
- 命令行Scp的使用----远程拷贝文件
1.用CRT分别连上两台需要传输文件的linux系统服务器,并检查防火墙是否关闭. 查看防火墙状态: /etc/init.d/iptables status 若防火墙启用,暂时关闭防火墙: /etc/ ...
- Android应用自动更新功能的实现!
Android应用自动更新功能的实现!http://blog.csdn.net/android_tutor/article/details/7015986 private static final i ...
- 解题:BZOJ 4644 经典砂比题(雾
题面 初见线段树分治 (对我来说可不是什么经典题=.=) 把时间轴建出来一棵线段树,然后在对应的区间上打标记,最后把整棵树DFS一遍,到叶节点输出答案即可 (把最终答案开成全局的了调了半天 #incl ...
- 【最大流/二分图匹配】【网络流24题】【P3254】 圆桌问题
Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...
- 【Asp.net入门3-03】jQuery-选择元素
练习:使用jQuery实现一个可以给table增加.删除行的页面 HTML代码: <body> <input type="button" value=" ...