日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot配置跨域访问策略

發(fā)布時間:2023/12/9 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot配置跨域访问策略 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

From: https://blog.csdn.net/garyond/article/details/80192760

1. 引言

我們在開發(fā)過程中通常因為不同應(yīng)用之間的接口調(diào)用或者應(yīng)用之間接口集成時經(jīng)常會遇到跨域問題, 導(dǎo)致無法正常獲取接口數(shù)據(jù),那么什么是跨域? 跨域的解決辦法是什么? 下面結(jié)合Spring Boot相關(guān)的項目應(yīng)用實戰(zhàn), 詳解說明跨域的解決方案。
1.1 什么是跨域(CORS)

跨域(CORS)是指不同域名之間相互訪問。跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略所造成的,是瀏覽器對于JavaScript所定義的安全限制策略。

也就是如果在A網(wǎng)站中,我們希望使用Ajax來獲得B網(wǎng)站中的特定內(nèi)容,如果A網(wǎng)站與B網(wǎng)站不在同一個域中,那么就出現(xiàn)了跨域訪問問題。

跨域訪問

??? 同域:
??? - 同一協(xié)議, 如http或https
??? - 同一IP地址, 如192.168.1.2
??? - 同一端口, 如8080
??? 以上三個條件中有一個條件不同就會產(chǎn)生 跨域問題。

1.2 跨域的解決方案

前端解決方案

??? 使用JSONP方式實現(xiàn)跨域調(diào)用;
??? 使用NodeJS服務(wù)器做為服務(wù)代理,前端發(fā)起請求到NodeJS服務(wù)器, NodeJS服務(wù)器代理轉(zhuǎn)發(fā)請求到后端服務(wù)器;
??? 設(shè)置瀏覽器允許跨域訪問,如Chrome瀏覽器設(shè)置--disable-web-security屬性, 該方案僅適用于開發(fā)環(huán)境 下的開發(fā)調(diào)試。

后端解決方案

??? 服務(wù)端設(shè)置Response Header(響應(yīng)頭部)的Access-Control-Allow-Origin(Java開發(fā)中可以使用Filter進行設(shè)置);
??? 在需要跨域訪問的類和方法中設(shè)置允許跨域訪問(如Spring中使用@CrossOrigin注解);
??? 繼承使用Spring Web的CorsFilter(適用于Spring MVC、Spring Boot)
??? 實現(xiàn)WebMvcConfigurer接口(適用于Spring Boot)

??? 說明: 除此之外還有其他的跨域解決方案, 在這里我只是介紹了幾種在實際工作中的解決方案。

下面, 我將結(jié)合在實際Spring Boot項目實戰(zhàn)中遇到的進行總結(jié)和記錄。
2. Spring Boot跨域配置

1. 使用Filter方式進行設(shè)置

使用Filter過濾器來過濾服務(wù)請求,向請求端設(shè)置Response Header(響應(yīng)頭部)的Access-Control-Allow-Origin屬性聲明允許跨域訪問。

@WebFilter
public class CorsFilter implements Filter { ?
??? // 日志對象
??? private static Logger logger = LoggerFactory.getLogger(CorsFilter.class); ?

??? @Override
??? public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { ?
??????? HttpServletResponse response = (HttpServletResponse) res; ?
??????? response.setHeader("Access-Control-Allow-Origin", "*"); ?
??????? response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); ?
??????? response.setHeader("Access-Control-Max-Age", "3600"); ?
??????? response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); ?
??????? chain.doFilter(req, res); ?
??? } ?

??? public void init(FilterConfig filterConfig) {
??????? // something init
??? } ?

??? public void destroy() {
???????? // destroy something
??? } ?
} ?

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15
??? 16
??? 17
??? 18
??? 19
??? 20
??? 21
??? 22
??? 23

2. 使用@CrossOrigin注解

使用@CrossOrigin注解聲明類和方法允許跨域訪問。

@RequestMapping(value = "/v1/users")
@RestController
@CrossOrigin
public class UserController extends BaseController {

??? @Autowired
??? private UserService userService;

??? @RequestMapping(method = RequestMethod.POST)
??? @CrossOrigin
??? @RequestBody
??? public User create(@Validated User user) {
??????? return userService.save(user);
??? }
}

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15

3. 繼承使用Spring Web中的CorsFilter

package com.garyond.hurricane.config;

import org.springframework.stereotype.Component;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Arrays;

/**
?*? 跨域訪問配置
?*
?*? @author Garyond
?*/
@Component
public class CustomCorsFilter extends CorsFilter {

??? public CustomCorsFilter() {
??????? super(configurationSource());
??? }

??? private static UrlBasedCorsConfigurationSource configurationSource() {
??????? CorsConfiguration config = new CorsConfiguration();
??????? config.setAllowCredentials(true);
??????? config.addAllowedOrigin("*");
??????? config.addAllowedHeader("*");
??????? config.setMaxAge(36000L);
??????? config.setAllowedMethods(Arrays.asList("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"));
??????? UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
??????? source.registerCorsConfiguration("/v1/**", config);
??????? return source;
??? }
}

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15
??? 16
??? 17
??? 18
??? 19
??? 20
??? 21
??? 22
??? 23
??? 24
??? 25
??? 26
??? 27
??? 28
??? 29
??? 30
??? 31
??? 32
??? 33

4. 實現(xiàn)WebMvcConfigurer接口

Spring Boot 2.0中已經(jīng)廢棄WebMvcConfigurerAdapter類, 開發(fā)人員可以通過實現(xiàn)WebMvcConfigurer接口實現(xiàn)相應(yīng)的功能。

import org.springframework.context.annotation.Configuration; ?
import org.springframework.web.servlet.config.annotation.CorsRegistry; ?
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; ?

@Configuration ?
public class CorsConfig implements WebMvcConfigurer { ?

??? @Override ?
??? public void addCorsMappings(CorsRegistry registry) { ?
??????? registry.addMapping("/**") ?
??????????????? .allowedOrigins("*") ?
??????????????? .allowCredentials(true) ?
??????????????? .allowedMethods("GET", "POST", "DELETE", "PUT","PATCH") ?
??????????????? .maxAge(3600); ?
??? } ?
} ?

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15
??? 16

??? 以上為相關(guān)項目實戰(zhàn)中的應(yīng)用總結(jié), 如有不當(dāng)之處, 請指正。
?

總結(jié)

以上是生活随笔為你收集整理的Spring Boot配置跨域访问策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。