ajax发送原理,ajax先发送一个OPTIONS(预请求,如果往回写相关消息告知与请求成功,预请求获取不到参数)预请求发送成功后,则才会将之后的真正请求发送过来.
而浏览器出于安全考虑,限制了JS发起跨站请求,使用XHR对象发起请求必须遵循同源策略(SOP:Same Origin Policy),跨站请求服务器返回的数据会在浏览器被拦截.
所以在拦截器需要做跨域允许设置,response.setHeader("Access-Control-Allow-Origin", "*"),response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");设置允许的的方法。
如果是特殊的请求头必须设置允许的请求头,否则当真正请求发送过来会发现浏览器报错了,
request header field xxxxxx is not allowed by Access-Control-Allow-Header【chrome】,
所以当需要设置特殊请求头时必须设置response.setHeader("Access-Control-Allow-Headers", "Cpp_Authorization,Cpp_Reuqest_***");
使用场景需要获取特殊头信息及参数做校验,校验成功则进入接口,否则拦截,设置服务器允许的域,允许的头信息,判断是否是预请求如果为预请求设置202状态并回写,之后ajax发送正真请求获取到您需要的参数,做相关拦截处理.
废话不说上代码:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("进入拦截器");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=utf-8");
String method = request.getMethod();
response.setHeader("Access-Control-Allow-Origin", "*");//解决跨域问题
response.setHeader("Access-Control-Allow-Headers", "Cpp_Authorization,Cpp_Reuqest_***"); // 特殊的header需要定义,Content-Type等常用请求头不需要设置加入
response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
if(method.equals("OPTIONS")){
log.info("进入options方法");
try{
//预请求需要往回写 让ajax预请求知道预请求是成功的
response.setStatus(202);
response.getWriter().write(1);
return false;
}catch (Exception e){
log.info(e);
return false;
}
}else{
String header = request.getHeader("someHeader");//你需要的header
//判断是否成功 比如做验证之类的
if(dosomething(map,header))){
return true;
}
}
//如果没有成功则进行拦截
return false;
}
}