springmvc拦截器针对ajax()请求的带特殊请求头的处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luoluo01/article/details/69829191

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;
        }
    }



猜你喜欢

转载自blog.csdn.net/luoluo01/article/details/69829191