导读:创作本文目的是给使用jersey使用者修改request参数做一定参考的。filter 获值后,修改参数后,接口接受数据为空。出现的原因是jersey框架内的安全机制造成的。可以自己浏览 jersey的API文档。
分享我的工作经历:
request取值我用了三种方式,但是设值后,然并卵,jersey后台取值都不成功:(只要取参数调用了一次,getParamMap()再设值进去就取不到)
我需要过滤取值的正真原因是,因为前台用的angularjs封装调用API时URL,将 ‘%’ 和 ‘&’ 转换成了转义字符,‘bfb;’ ‘^amp;’
var str = json.toString().replace(/&/g, “^amp;”);
var str = str.replace(/%/g, “bfb;”);
,存数据库时,保存的值是 ‘bfb;’ ‘^amp;’,数据回显就不对。我也是郁闷了很久。后来公司的一个大牛看到这个问题。果断把底层的封装改了
var str = json.toString().replace(/&/g, “%26”);
var str = str.replace(/%/g, “%25”);
完美carry,原来压根就不需要修改参数。顿时大悟,大神就是大神。以后还有更多的东西要学。
下面付下取值方法:
获取参数方式1–直接取再设值
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//这里直接获取
Enumeration<String> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
String paraName=(String)enumeration.nextElement();
System.out.println(paraName+": "+request.getParameter(paraName));
}
//设置值...
filterChain.doFilter(request, response);
}
获取参数方式2–extends HttpServletRequestWrapper
public void editParameter(String name , Object value) {
if(value != null) {
paramMap.setlock(false);
paramMap.getParamsValues(name).replace('^amp;','&');
paramMap.getParamsValues(name).replace('bfb;','%');
paramMap.setlock(true);
}
}
获取参数方式3–反射
Method method=requestParams.getClass().getMethod("setLocked",new Class[]{boolean.class});
method.invoke(requestParams,new Object[]{new Boolean(false)});
总结
当遇到问题时,要换个角度思考问题。可以向公司其他同事问问意见什么的。少走弯路。充分利用时间,提高效率。不加班。