javascript
Spring Boot配置跨域访问策略
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac电脑版微信】双开方法,最简单的微信
- 下一篇: 从零开始学_JavaScript_系列(