这期内容当中小编将会给大家带来有关如何在springMVC中利用歌珥实现跨域,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
名词解释:跨域资源共享(跨源资源共享)
简单说就是只要协议,IP, http方法任意一个不同就是跨域。
4.2 spring MVC自开始添加了跨域的支持。
跨域具体的定义请移步mozilla查看
<强>使用案例强>
& lt; filter> & lt; filter-name> cors & lt; filter-class> org.springframework.web.filter.CorsFilter & lt;/filter> & lt; filter-mapping> & lt; filter-name> cors & lt; url-pattern>/* & lt;/url-pattern> & lt;/filter-mapping>
//简单配置,未配置的均使用默认值,就是全面放的开 & lt; mvc: cors> & lt; mvc:=映射路径“/* *”;/比; & lt;/mvc: cors>//这是一个全量配置 & lt; mvc: cors> & lt; mvc:=映射路径“/api/* *”; allowed-origins=? http://domain1.com, http://domain2.com" PUT" allowed-methods=暗玫? allowed-headers=癶eader1, header2 header3" exposed-headers=癶eader1 header2"allow-credentials=癴alse" 信息=?23”;/比; & lt; mvc:=映射路径“/资源/* *”; allowed-origins=癶ttp://domain1.com"/比; & lt;/mvc: cors>
@CrossOrigin (maxAge=3600) @RestController @RequestMapping (“/account") 公开课AccountController { @CrossOrigin (“http://domain2.com") @RequestMapping (“/{id}“) 公共帐户检索(@PathVariable长id) {//? } }
<强>涉及概念强>
- <李> CorsConfiguration具体封装跨域配置信息的pojo李> <>李CorsConfigurationSource请求与跨域配置信息映射的容器李> <李> CorsProcessor具体进行跨域操作的类李> <李>诺干跨域配置信息初始化类李> <李>诺干跨域使用的适配器李>
<强>涉及的java类:强>
CorsConfiguration
CorsConfigurationSource, UrlBasedCorsConfigurationSource
CorsProcessor, DefaultCorsProcessor
CorsFilter
AbstractHandlerMapping,包括内部类PreFlightHandler, CorsInterceptor
AbstractHandlerMethodMapping, RequestMappingHandlerMapping
CorsBeanDefinitionParser
MvcNamespaceUtils
<强>调试分析强>
要看懂代码我们需要先了解下封装跨域信息的pojo, CorsConfiguration
这边是一个非常简单的pojo,除了跨域对应的几个属性,就只有结合,checkOrigin, checkHttpMethod checkHeaders。
属性都是多值组合使用的。
//CorsConfiguration 公共静态最终字符串所有=?”;//允许的请求源 私人ListallowedOrigins;//允许的http方法 私人List allowedMethods;//允许的请求头 私人List allowedHeaders;//返回的响应头 私人List exposedHeaders;//是否允许携带饼干 私人布尔allowCredentials;//预请求的存活有效期 私人长maxAge;
结合是将跨域信息进行合并
3个检查方法分别是核中对请求的信息是否包含在允许范围内
在系统启动时通过CorsBeanDefinitionParser解析配置文件;
加载RequestMappingHandlerMapping时,通过InitializingBean的afterProperties的钩子调用initCorsConfiguration初始化注解信息;
在CorsBeanDefinitionParser类的解析方法中打一个断点。
CorsBeanDefinitionParser的调用栈
通过代码可以看到这边解析
跨域信息的配置可以以路径为单位定义多个映射关系。
解析时如果没有定义则使用默认设置
//CorsBeanDefinitionParser 如果(mappings.isEmpty ()) {//最简配置时的默认设置 CorsConfiguration配置=new CorsConfiguration (); config.setAllowedOrigins (DEFAULT_ALLOWED_ORIGINS); config.setAllowedMethods (DEFAULT_ALLOWED_METHODS); config.setAllowedHeaders (DEFAULT_ALLOWED_HEADERS); config.setAllowCredentials (DEFAULT_ALLOW_CREDENTIALS); config.setMaxAge (DEFAULT_MAX_AGE); corsConfigurations.put(“/* *”,配置); 其他}{//单个映射的处理 (元素映射:映射){ CorsConfiguration配置=new CorsConfiguration (); 如果(mapping.hasAttribute (“allowed-origins")) { String [] allowedOrigins=StringUtils.tokenizeToStringArray (mapping.getAttribute (“allowed-origins")“,“); config.setAllowedOrigins (arrays . aslist (allowedOrigins)); }//? }如何在springMVC中利用歌珥实现跨域