Java中跨域問題解決的幾種方式舉例詳解
前言
在前后端分離項目中,經(jīng)常會遇到跨域問題,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下,一起來看看吧~
什么是跨域
當(dāng)一個請求的url的協(xié)議、域名、端口任意一個與當(dāng)前頁面的url不同即為跨域。
比如 a頁面想獲取b頁面的資源,a與b頁面的協(xié)議、域名或端口號不同,進行的訪問行為都是跨域,由于瀏覽器的同源策略,會限制跨域請求資源。
同源策略由 Netscape 公司引入瀏覽器。目前,所有瀏覽器都實行這個政策。最初,它的含義是指,A網(wǎng)頁設(shè)置的 Cookie,B網(wǎng)頁不能打開,除非這兩個網(wǎng)頁"同源"。所謂"同源"指的是"三個相同":
- 協(xié)議相同
- 域名相同
- 端口相同
同源策略確保一個應(yīng)用中的資源只能被本應(yīng)用的資源訪問。
非同源限制
- cookie、localStorage、indexDB無法讀取
- DOM和js對象無法獲取
- 無法發(fā)送Ajax請求
Java 中的跨域問題指的是在使用 Ajax 技術(shù)進行跨域訪問時,由于瀏覽器的安全限制,導(dǎo)致請求被拒絕或者無法獲取到正確的響應(yīng)結(jié)果。
解決 Java 中的跨域問題可以采用以下幾種方式:
1、通過設(shè)置響應(yīng)頭信息來支持跨域訪問。
在 Java 中可以通過設(shè)置響應(yīng)頭信息來支持跨域訪問,例如在 Spring MVC 中可以使用
//@CrossOrigin 注解來設(shè)置允許跨域訪問的源地址:
@CrossOrigin(origins = "http://localhost:8080")
@RequestMapping("/api")
@RestController
public class ApiController {
// ...
}2、使用 iframe 來實現(xiàn)跨域訪問。
可以通過在同一頁面中使用 iframe 元素來實現(xiàn)跨域訪問,從而避免了瀏覽器安全限制。例如在前端頁面中可以通過以下方式來獲取來自不同域名的數(shù)據(jù):
var iframe = document.createElement('iframe');
iframe.src = 'http://exampleURL.com/data';
iframe.style.display = 'none';
document.body.appendChild(iframe);
var data = iframe.contentWindow.document.body.innerText;
console.log(data);或前端發(fā)送ajax請求
$("#test").click(function(){
$.ajax({
url : "http://localhost:8082/hello.cors",
type : "GET",
success : function(result){
// alert(result);
console.log(result)
}
})
})3、使用 WebSocket 來解決跨域問題。
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/data").setAllowedOrigins("*");
}
}4、HttpServletResponse添加頭信息
@RestController
public class CorsController {
?
@RequestMapping(value = "/hello.cors")
public String hello(HttpServletResponse response){
response.addHeader("Access-Control-Allow-Origin","http://localhost:8081");
//response.addHeader("Access-Control-Allow-Credentials","true");
return "hello cors";
}
}5、通過配置類解決跨域
使用HttpServletResponse對象或注解方式,需要在每個需要跨域的方法上都加上相應(yīng)的注解或參數(shù),我們想讓所有的controller都添加跨域功能,我們可以通過實現(xiàn)WebMvcConfigurer接口來自定義跨域配置。
WebMvcConfigurer是一個接口,提供很多自定義的攔截器,例如跨域設(shè)置、類型轉(zhuǎn)化器等springMVC的配置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
?
/**
* **addMapping**:配置可以被跨域的路徑,可以任意配置,可以具體到直接請求路徑。
*
* **allowedMethods**:允許所有的請求方法訪問該跨域資源服務(wù)器,如:POST、GET、PUT、DELETE等。
*
* **allowedOrigins**:允許所有的請求域名訪問我們的跨域資源,可以固定單條或者多條內(nèi)容,如:”[http://www.address.com](http://www.address.com/)“,只有該域名可以訪問我們的跨域資源。
*
* **allowedHeaders**:允許所有的請求header訪問,可以自定義設(shè)置任意請求頭信息。
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*.cors")
.allowedOrigins("http://localhost:8081")
.allowedMethods("POST","GET")
.maxAge(1000);
}
}總結(jié)
到此這篇關(guān)于Java中跨域問題解決的幾種方式的文章就介紹到這了,更多相關(guān)Java跨域問題解決內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java單表實現(xiàn)評論回復(fù)功能(多種實現(xiàn)方式)
這篇文章主要介紹了Java單表實現(xiàn)評論回復(fù)功能,大家都知道評論功能有多種實現(xiàn)方式,本文逐一給大家詳細(xì)講解,需要的朋友可以參考下2023-03-03
基于java ssm springboot實現(xiàn)選課推薦交流平臺系統(tǒng)
這篇文章主要介紹了選課推薦交流平臺系統(tǒng)是基于java ssm springboot來的實現(xiàn)的,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
SpringBoot使用Maven實現(xiàn)多環(huán)境配置管理
軟件開發(fā)中經(jīng)常有開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境,而且一般這些環(huán)境配置會各不相同,本文主要介紹了SpringBoot使用Maven實現(xiàn)多環(huán)境配置管理,感興趣的可以了解一下2024-01-01
打開.properties中文顯示unicode編碼問題以及解決
這篇文章主要介紹了打開.properties中文顯示unicode編碼問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
MybatisPlus字段類型轉(zhuǎn)換的實現(xiàn)示例
本文主要介紹了MybatisPlus如何完成字段類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
全網(wǎng)最新Log4j?漏洞修復(fù)和臨時補救方法
Apache?Log4j?遠程代碼執(zhí)行漏洞,如何快速修復(fù)log4j2漏洞,本文給大家介紹下Log4j?漏洞修復(fù)和臨時補救方法,感興趣的朋友跟隨小編一起看看吧2021-12-12
Spring Security注解方式權(quán)限控制過程
這篇文章主要介紹了Spring Security注解方式權(quán)限控制過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03

