<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
@CrossOrigin
可以新增到方法上,也可以新增到Controller
上
AbstractHandlerMethodMapping的內部類MappingRegistry的register:
public void register(T mapping, Object handler, Method method) { // Assert that the handler method is not a suspending one. if (KotlinDetector.isKotlinType(method.getDeclaringClass())) { Class<?>[] parameterTypes = method.getParameterTypes(); if ((parameterTypes.length > 0) && "kotlin.coroutines.Continuation".equals(parameterTypes[parameterTypes.length - 1].getName())) { throw new IllegalStateException("Unsupported suspending handler method detected: " + method); } } this.readWriteLock.writeLock().lock(); try { HandlerMethod handlerMethod = createHandlerMethod(handler, method); validateMethodMapping(handlerMethod, mapping); this.mappingLookup.put(mapping, handlerMethod); List<String> directUrls = getDirectUrls(mapping); for (String url : directUrls) { this.urlLookup.add(url, mapping); } String name = null; if (getNamingStrategy() != null) { name = getNamingStrategy().getName(handlerMethod, mapping); addMappingName(name, handlerMethod); } CorsConfiguration corsConfig = initCorsConfiguration(handler, method, mapping); if (corsConfig != null) { this.corsLookup.put(handlerMethod, corsConfig); } this.registry.put(mapping, new MappingRegistration<>(mapping, handlerMethod, directUrls, name)); } finally { this.readWriteLock.writeLock().unlock(); } }
@CrossOrigin
註解在AbstractHandlerMethodMapping
的內部類MappingRegistry
的register方法中完成解析,@CrossOrigin註解中的內容會被解析成一個設定物件CorsConfiguration@CrossOrigin
所標記的請求方法物件HandlerMethod
和CorsConfiguration
一一對應存入corsLookup的map集合中DispatcherServlet
的doDispatch方法之後,呼叫AbstractHandlerMapping
的getHandler方法獲取執行鏈HandlerExecutionChain時,會從map中獲取CorsConfiguration物件CorsConfiguration
物件構建一個CorsInterceptor攔截器CorsInterceptor
攔截器中觸發對CorsProcessor
的processRequest方法呼叫,跨域請求的校驗工作將在該方法中完成。@CrossOrigin
是新增在不同的Controller
中 全域性設定
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedMethods("*") .allowedOrigins("*") .allowedHeaders("*") .allowCredentials(false) .exposedHeaders("") .maxAge(3600); } }
全域性設定和@CrossOrigin
註解相同,都是在CorsInterceptor
攔截器中觸發對CorsProcessor的processRequest方法呼叫,最終在該方法中完成跨域請求的校驗工作
registry.addMapping(“/**”)
方法中設定了一個CorsRegistration物件,該物件中包含了一個路徑攔截規則,同時CorsRegistration還包含了一個CorsConfiguration設定物件,該物件用來儲存這裡跨域相關的設定。WebMvcConfigurationSupport
的requestMappingHandlerMapping
方法中觸發了addCorsMappings方法執行,將獲取到的CorsRegistration物件重新組裝成一個UrlBasedCorsConfigurationSource物件,該物件儲存了攔截規則和CorsConfiguration物件的對映關係。UrlBasedCorsConfigurationSource
物件賦值給AbstractHandlerMapping的corsConfigurationSource屬性@CrossOrigin
註解處理流程一樣,在AbstractHandlerMapping的getHandler方法處理,從corsConfigurationSource
中獲取CorsConfiguration設定物件,而@CrossOrigin從map中獲取CorsConfiguration物件。如果兩處都可以獲取到CorsConfiguration物件,則獲取到的物件屬性值進行合併。CorsConfiguration
物件構造CorsInterceptor攔截器CorsInterceptor
攔截器中觸發對CorsProcessor的processRequest方法呼叫,跨域請求的校驗工作將在該方法中完成。這裡的跨域校驗是通過DispatcherServlet中的方法觸發的,DispatcherServlet在Filter之後執行
@Configuration public class WebMvcConfig { @Bean FilterRegistrationBean<CorsFilter> corsFilter() { FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowedHeaders(Arrays.asList("*")); corsConfiguration.setAllowedMethods(Arrays.asList("*")); corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:8081")); corsConfiguration.setMaxAge(3600L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfiguration); registrationBean.setFilter(new CorsFilter(source)); registrationBean.setOrder(-1); return registrationBean; } }
CorsConfiguration
物件UrlBasedCorsConfigurationSource
物件,將過濾器的攔截規則和CorsConfiguration
物件之間的對映關係由UrlBasedCorsConfigurationSource
中的corsConfiguration
變數儲存起來。CorsFilter
設定優先順序CorsFilter的doFilterInternal方法:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { CorsConfiguration corsConfiguration = this.configSource.getCorsConfiguration(request); boolean isValid = this.processor.processRequest(corsConfiguration, request, response); if (isValid && !CorsUtils.isPreFlightRequest(request)) { filterChain.doFilter(request, response); } }
觸發對CorsProcessor
的processRequest
方法呼叫,跨域請求的校驗工作將在該方法中完成
到此這篇關於Spring的跨域的幾個方案的文章就介紹到這了,更多相關Spring的跨域方案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45