jersey参数拦截注入
来源:互联网 发布:网络歌曲大赛 编辑:程序博客网 时间:2024/06/14 05:35
一、get请求时,用对象接受基本类型的参数
基本思路:
定义一个基本类作为标识,让所有的参数对象来继承这个基本类;
jersey可以在服务请求后,resource方法调用之前进入到拦截代码块;
在拦截代码块中可以判断resource方法的参数对象是否继承了标识类;
如果是,则利用反射将get提交的参数值set进参数对象;
1、 定义标识类
public class Pagination extends BaseObject{
protected Integer pageSize=20;
protected Integer pageNo=-1; // -1 means don't paging
@JsonIgnore
protected Integer beginNo = 0;
protected Integer total = 0; }
2、关键的一步,需要提供一个provider类继承com.sun.jersey.spi.inject.InjectableProvider
@Provider
public class PaginationProvider implements InjectableProvider<QueryParam,Parameter> {
@Context
private HttpContext hc;
@Context
protected HttpServletRequest request;
public PaginationProvider(@Context HttpContext hc, @Context HttpServletRequest request) {
this.hc = hc;
this.request = request;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public Injectable getInjectable(ComponentContext ic, QueryParam a,
Parameter c) {
final Class clazz = c.getParameterClass(); // 获取参数对象
if (!Pagination.class.isAssignableFrom(clazz)) { // 判断是否继承标识类
return null;
}
return new Injectable<Object>() {
public Object getValue() {
Object parameterBean=null;
try {
parameterBean = clazz.newInstance();
MultivaluedMap<String, String> params = hc.getUriInfo().getQueryParameters();//获取get提交的参数值
Class clz = clazz;
for (;!clz.equals(Object.class);clz=clz.getSuperclass()) {
Field[] fields = clz.getDeclaredFields();
for (Field field:fields) {
Object value = params.get(field.getName());
if (value == null) {
continue;
}
try {
BeanUtils.setProperty(parameterBean, field.getName(), value); //属性拷贝
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
//对象参数已经注入了所提交的参数值
// 设置上下文 //这里还可以做其他工作
if (ContextPagination.class.isAssignableFrom(clazz)) {
User user = (User)request.getAttribute(CacheBase.USERINFO);
ContextPagination context = (ContextPagination)parameterBean;
context.setCurrUserId(user.getUserId());
context.setCurrFeedId(user.getFeedId());
context.setNetworkId(user.getNetworkId());
context.setOrgId(user.getOrgId());
context.setCurrUserName(user.getUsername());
}
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
return parameterBean;
}
};
}
}
二、url访问服务之前可以将参数进行拦截,比如对参数进行权限检查,
但post参数只能使用一次,当权限检查使用之后,
resource服务里面就不能获取该参数;
基本思路:将参数取出之后,在设置一遍,听起来很简答,但jersey将设置的方法隐藏的很深,找了好久才找到了
private List getValFromRequest(ContainerRequest request , String[] targets) throws JSONException{
- jersey参数拦截注入
- Jersey拦截器
- JAVA拦截器拦截SQL注入(所有参数)
- Struts2中自定义拦截器导致Action注入参数丢失
- Struts2中自定义拦截器导致Action注入参数丢失
- Spring 解析httpServletRequest注入参数到Bean的拦截包装
- struts项目,拦截器注入action参数失败的原因
- Struts2使用自定义拦截器导致Action注入参数丢失、url参数
- jersey 1.x 拦截器配置
- Jersey实现对方法进行过滤拦截
- jersey + spring 参数接收解析
- 参数注入
- jersey client 发送Post请求 【带参数】
- 解决 Jersey 客户端提交中文参数乱码
- jersey client 发送Post请求 【带参数】
- jersey接收对象参数到服务器
- jersey获取各个参数的总结
- jersey中@QueryParam和@PathParam参数说明
- android仅创建一个硬盘逻辑盘
- linux常用的makefile模版编写
- HDU 2874 Connections between cities 在森林里面求最小距离
- C# 提取字体点阵字模数据
- grunt-contrib-watch 结合 connect-livereload 实现修改文件后,理解刷新页面
- jersey参数拦截注入
- Spring AOP与动态代理
- JBossESB教程(四)——如何监测一个文件夹下(本地)
- 函数局部变量所需存储空间分配
- 随笔
- /etc/ld.so.conf 文件介绍
- vs2012调试的时候各种一闪而过
- mysql安装后初始密码的设置
- 网络子系统67_路由表处理设备事件