码迷,mamicode.com
首页 > 编程语言 > 详细

SpringCloud+ZUUL跨域请求中的OPTIONS请求处理

时间:2018-07-19 10:51:48      阅读:592      评论:0      收藏:0      [点我收藏+]

标签:没有   类型   结构   ext   div   method   包含   解决   搜索   

    目前项目结构是VUE做前端,后端采用微服务架构,在开发时前端需要跨域请求数据,通过CorsConfig配置解决了简单跨域请求需要。但当需要在请求的header中增加token信息时,出现了请求失败的情况,浏览器和后台均出现OPTIONS类型请求相关提示。

    搜索资料后发现,在设置了header之后,浏览器在发送正式请求前,会先发送一个OPTIONS请求,(据资料)发送OPTIONS请求是为了验证正式请求的有效性,检查服务端是否支持正式请求类型(POST、GET 等),但不清楚服务端底层框架在默认情况下时怎么响应该请求的。而OPTIONS请求中不包含任何用户参数,导致ZUUL中的过滤类型为 pre 的过滤器中的用户校验失败,从而返回用户提示信息,就无法继续执行正式请求了。

   有资料说需要服务端返回一个状态是200的响应,但测试直接返回status为200的响应并没有产生作用,浏览器端仍然会显示请求失败,并不会执行正式请求。

   最终:

   通过对过滤器过滤规则进行修改,在是否需要过滤方法体中,增加 如果请求类型为OPTIONS ,则不进行用户校验,直接跳过该过滤,由框架本身去响应该请求。代码如下:
  

@Component
public class AuthFilter extends ZuulFilter {

   ...

    /**
     * pre:路由之前
     * routing:路由之时
     * post: 路由之后
     * error:发送错误调用
     *
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }
    
    ....
     
    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        if (request.getMethod().equals("OPTIONS")) {
            return false;
        }
        return true;
    }

    ...

}

 

SpringCloud+ZUUL跨域请求中的OPTIONS请求处理

标签:没有   类型   结构   ext   div   method   包含   解决   搜索   

原文地址:https://www.cnblogs.com/justbeginning/p/9334109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!