当使用Jquery的ajax提交数据时,后台filter需要拦截其中的参数做处理,但是,使用request.getParameterMap()或request.getQueryString()是获取不到参数的,测试了一下,只有使用form表单提交的参数才能用这两种方式获取到值。
那么,当使用jquery的ajax提交数据时,要想在filter中获取到参数,需要从request的原生流中获取,代码如下:
public void getVal(){
String requestType =(String)request.getHeader("X-Requested-With");
String queryUrl = "";
Map<String,String[]> params = new HashMap<String, String[]>();
Map<String,String[]> params = new HashMap<String, String[]>();
/**判断是否是ajax提交方式*/
if (requestType != null && requestType.equals("XMLHttpRequest")) {
//获取request中的原生流
queryUrl = getRequestPayload(request);
}else{
queryUrl = request.getQueryString();
params = request.getParameterMap();
}
}
//获取request原生流方法
private String getRequestPayload(HttpServletRequest req) {
StringBuilder sb = new StringBuilder();
try{
BufferedReader reader = req.getReader();
String line;
while((line = reader.readLine()) != null) {
sb.append(line);
}
reader.close();
}catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
在这里需要注意的一点是,可能每次请求会涉及到多次读取request流,但是流是不可以重复读取的,所以,实现这个功能之前,我们需要封装一下request,将它变成可以供多次读取的值,详见:http://blog.youkuaiyun.com/hui_blank/article/details/52870133