您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么理解Spring Boot跨域”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么理解Spring Boot跨域”吧!
首先,我們需要了解一下一個URL是怎么組成的:
// 協(xié)議 + 域名(子域名 + 主域名) + 端口號 + 資源地址
http: + // + www.baidu.com + :8080/
只要協(xié)議,子域名,主域名,端口號這四項(xiàng)組成部分中有一項(xiàng)不同,就可以認(rèn)為是不同的域,不同的域之間互相訪問資源,就被稱之為跨域。
隨著前后端分離開發(fā)的越來越普及,會經(jīng)常遇到跨域的問題,當(dāng)我們在瀏覽器中看到這樣的錯誤時(shí),就需要意識到遇到了跨域:
首先,我們使用vue-cli
來快速構(gòu)建一個前端項(xiàng)目,然后使用axios
來向后臺發(fā)送ajax請求。然后在控制臺中打印出返回信息。這里就不再多做贅述,后面我會單獨(dú)寫一篇文章來講一下如何使用vue-cli快速創(chuàng)建一個vue項(xiàng)目。
這里不再講解使用
jsonp
的方式來解決跨域,因?yàn)?code>jsonp方式只能通過get
請求方式來傳遞參數(shù),而且有一些不便之處。
下面的幾種方式都是通過跨域訪問技術(shù)CORS(Cross-Origin Resource Sharing)來解決的。具體的實(shí)現(xiàn)原理我們不做深入的探究,這節(jié)課的目的是解決跨域問題~
在Spring Boot 中給我們提供了一個注解@CrossOrigin
來實(shí)現(xiàn)跨域,這個注解可以實(shí)現(xiàn)方法級別的細(xì)粒度的跨域控制。我們可以在類或者方添加該注解,如果在類上添加該注解,該類下的所有接口都可以通過跨域訪問,如果在方法上添加注解,那么僅僅只限于加注解的方法可以訪問。
@RestController @RequestMapping("/user") @CrossOrigin public class UserController { @Autowired private UserService userService; @RequestMapping("/findAll") public Object findAll(){ return userService.list(); } }
現(xiàn)在再去測試一下:
Bingo,成功!
這里可以通過實(shí)現(xiàn)WebMvcConfigurer
接口中的addCorsMappings()
方法來實(shí)現(xiàn)跨域。
@Configuration class CORSConfiguration implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
下面我們將剛剛加上的注解給注釋掉,看看能不能訪問到這個接口:
不出我們所料,果然還是可以的~
我們可以通過實(shí)現(xiàn)Fiter接口在請求中添加一些Header來解決跨域的問題:
@Component public class CORSFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.addHeader("Access-Control-Allow-Credentials", "true"); res.addHeader("Access-Control-Allow-Origin", "*"); res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN"); if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) { response.getWriter().println("ok"); return; } chain.doFilter(request, response); } @Override public void destroy() { } @Override public void init(FilterConfig filterConfig) throws ServletException { } }
不出意外的話,應(yīng)該也可以在控制臺獲取到返回信息。
如果我們在項(xiàng)目中使用了Nginx,可以在Nginx中添加以下的配置來解決跨域(原理其實(shí)和Filter類似,只不過把活兒丟給了運(yùn)維????)
location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; if ($request_method = 'OPTIONS') { return 204; } }
感謝各位的閱讀,以上就是“怎么理解Spring Boot跨域”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么理解Spring Boot跨域這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。