复杂跨域之CorsFilter源码分析

    1.上篇文章讲到,当处理复杂请求时,需要在pom文件引入如下依赖,需在web.xml配置一个过滤器org.apache.catalina.filters.CorsFilter,那么这个过滤器为我们做了哪些工作呢?,下面对源码进行分析解读.

<!--支持跨域-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>7.0.78</version>
<scope>provided</scope>
</dependency>

    2.首先看doFilter中的初始化代码,即我们可以在web.xml中初始化我们的数据.如果我们没有设置,默认允许什么的来源


public void init(FilterConfig filterConfig) throws ServletException {    this.parseAndStore("*", "GET,POST,HEAD,OPTIONS", "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers", "", "true", "1800", "true");  默认的设置 //参数1: 表示允许所有的请求源       参数2: 表示允许的http请求方式  参数3:表示允许携带的请求头,    if(filterConfig != null) {        String configAllowedOrigins = filterConfig.getInitParameter("cors.allowed.origins");//支持请求的来源        String configAllowedHttpMethods = filterConfig.getInitParameter("cors.allowed.methods");//支持的方法        String configAllowedHttpHeaders = filterConfig.getInitParameter("cors.allowed.headers");//支持的头信息        String configExposedHeaders = filterConfig.getInitParameter("cors.exposed.headers");        String configSupportsCredentials = filterConfig.getInitParameter("cors.support.credentials");        String configPreflightMaxAge = filterConfig.getInitParameter("cors.preflight.maxage");        String configDecorateRequest = filterConfig.getInitParameter("cors.request.decorate");        this.parseAndStore(configAllowedOrigins, configAllowedHttpMethods, configAllowedHttpHeaders, configExposedHeaders, configSupportsCredentials, configPreflightMaxAge, configDecorateRequest);    }

}
 

3.doFilter方法,可以看出标红部分是判断请求的类型的关键,根据不同的访问类型,将做不同的处理方式,checkRequestType(request)方法根据请求所携带的信息判断访问的类型是那种,返回的结果有1:NOT_CORS不是跨域请求 2.INVALID_CORS无效的跨域 3.ACTUAL 4.SIMPLE,5.PRE_FLIGHT预请求类型

a.当处理SIMPLE和ACTUAL请求时,调用handleSimpleCORS()方法,此方法会根据用户设置或者默认设置添加head信息如默认情况("Access-Control-Allow-Origin", "*");即允许所有的跨域源,添加完头信息,放行进入下个过滤器.

  b.当处理PRE_FLIGHT请求时,调用handlePreflightCORS()方法,添加头部信息,放回浏览器

  c.当处理NOT_CORS请求时,直接放行

  d.当处理INVALID_CORS请求时,response.setStatus(403);返回浏览器

  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if(servletRequest instanceof HttpServletRequest && servletResponse instanceof HttpServletResponse) {
            HttpServletRequest request = (HttpServletRequest)servletRequest;
            HttpServletResponse response = (HttpServletResponse)servletResponse;
            CorsFilter.CORSRequestType requestType = this.checkRequestType(request);//关键,判断访问的类型
            if(this.decorateRequest) {
                decorateCORSProperties(request, requestType);
            }

            switch(CorsFilter.SyntheticClass_1.$SwitchMap$org$apache$catalina$filters$CorsFilter$CORSRequestType[requestType.ordinal()]) {
            case 1:
                this.handleSimpleCORS(request, response, filterChain);
                break;
            case 2:
                this.handleSimpleCORS(request, response, filterChain);
                break;
            case 3:
                this.handlePreflightCORS(request, response, filterChain);
                break;
            case 4:
                this.handleNonCORS(request, response, filterChain);
                break;
            default:
                this.handleInvalidCORS(request, response, filterChain);
            }

        } else {
            throw new ServletException(sm.getString("corsFilter.onlyHttp"));
        }
    }
时间: 2024-08-27 10:26:32

复杂跨域之CorsFilter源码分析的相关文章

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

Backbone.js源码分析(珍藏版)

源码分析珍藏,方便下次阅读! // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely distributed under the MIT license. // For all details and documentation: // http://backbonejs.org (function () { // 创建一个全局对象, 在浏览器中表示为w

jQuery源码分析系列(36) : Ajax - 类型转化器

什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的响应只有 responseText与responseXML 二种 所以现在我要定义dataType为jsonp,那么所得的最终数据是一个json的键值对,所以jQuery内部就会默认帮你完成这个转化工作 jQuery为了处理这种执行后数据的转化,就引入了类型转化器,如果没有指定类型就依据响应头Con

jQuery-1.9.1源码分析系列(十六)ajax——响应数据处理和api整理

ajax在得到请求响应后主要会做两个处理:获取响应数据和使用类型转化器转化数据 a.获取响应数据 获取响应数据是调用ajaxHandleResponses函数来处理. ajaxHandleResponses的功能有: - 为jqXHR设置所有responseXXX字段(值便是响应数据) - 找到正确的dataType (在content-type和预期的dataType两者中的一个) - 返回正确的响应数据 我们看一个响应数据的格式: responses = { text: "{"co

jQuery源码分析系列(34) : Ajax - 预处理jsonp

上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处理的类型取决于由更加接近默认的Content-Type响应,但可以明确使用dataType选项进行设置.如果提供了dataType选项, 响应的Content-Type头信息将被忽略. 有效的数据类型是text, html, xml, json,jsonp,和 script. dataType:预期

Backbone.js 0.9.2 源码分析收藏

Backbone 为复杂Javascript应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视图可以声明事件处理函数,并通过RESRful JSON接口连接到应用程序. 源码分析转之网上它人的备注,特收藏一下,以免方便阅读. // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Ba

jQuery源码分析系列(35) : Ajax - jsonp的实现与原理

ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本 json核心就是:允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了. jquery ext dojo这类库的实现手段其实大同小异 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.s

jQuery源码分析系列(37) : Ajax 总结

综合前面的分析,我们总结如下3大块: jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求 前置过滤器 jQuery. ajaxPrefilter 请求分发器 jQuery. ajaxTransport 类型转换器 ajaxConvert 为了整体性与扩展性考虑,把整个结构通过Deferred实现异步链式模型,Promise对象可以轻易的绑定成功.失败.进行中三种状态的回调函数,然后通过在状态码在来回调不同的函数就行了 出于同源策略考虑,存在跨域问题,所以ajax内部

Docker源码分析(五):Docker Server的创建

1.Docker Server简介 Docker架构中,Docker Server是Docker Daemon的重要组成部分.Docker Server最主要的功能是:接受用户通过Docker Client发送的请求,并按照相应的路由规则实现路由分发. 同时,Docker Server具备十分优秀的用户友好性,多种通信协议的支持大大降低Docker用户使用Docker的门槛.除此之外,Docker Server设计实现了详尽清晰的API接口,以供Docker用户选择使用.通信安全方面,Docke