springboot跨域問(wèn)題解決方案整理

springboot跨域問(wèn)題:

第一種:注解解決@CrossOrigin

優(yōu)點(diǎn):注解是springboot的常用解決方案,簡(jiǎn)單快捷

缺點(diǎn):注解只能解決單個(gè)控制器跨域

可以作用于方法? 也可以作用于類

@CrossOrigin中的2個(gè)參數(shù):

origins? : 允許可訪問(wèn)的域列表?

maxAge:準(zhǔn)備響應(yīng)前的緩存持續(xù)的最大時(shí)間(以秒為單位)。

實(shí)例:@CrossOrigin(origins = {"http://www.baidu.com","http://www.google.com"}, maxAge = 3600)

作用在方法上

@RestController

@RequestMapping("/account")

public class AccountController {

@CrossOrigin(origins = {"http://www.baidu.com","http://www.google.com"}, maxAge = 3600)

@GetMapping("/{id}")

public Account retrieve(@PathVariable Long id) {

// ...

}

@DeleteMapping("/{id}")

public void remove(@PathVariable Long id) {

// ...

}

}

作用在類上

@CrossOrigin(origins = {"http://www.baidu.com","http://www.google.com"}, maxAge = 3600)

@RestController

@RequestMapping("/account")

public class AccountController {

@GetMapping("/{id}")

public Account retrieve(@PathVariable Long id) {

// ...

}

@DeleteMapping("/{id}")

public void remove(@PathVariable Long id) {

// ...

}

}

第二種:jsonp協(xié)議

JSONP的優(yōu)缺點(diǎn)

? ? ? ? 1.優(yōu)點(diǎn)

1.1它不像XMLHttpRequest對(duì)象實(shí)現(xiàn)的Ajax請(qǐng)求那樣受到同源策略的限制,JSONP可以跨越同源策略;

1.2它的兼容性更好,在更加古老的瀏覽器中都可以運(yùn)行,不需要XMLHttpRequest或ActiveX的支持

1.3在請(qǐng)求完畢后可以通過(guò)調(diào)用callback的方式回傳結(jié)果。將回調(diào)方法的權(quán)限給了調(diào)用方。這個(gè)就相當(dāng)于將controller層和view層終于分開(kāi)了。我提供的jsonp服務(wù)只提供純服務(wù)的數(shù)據(jù),至于提供服務(wù)以 后的頁(yè)面渲染和后續(xù)view操作都由調(diào)用者來(lái)自己定義就好了。如果有兩個(gè)頁(yè)面需要渲染同一份數(shù)據(jù),你們只需要有不同的渲染邏輯就可以了,邏輯都可以使用同 一個(gè)jsonp服務(wù)。

? ? ? ? 2.缺點(diǎn)

2.1它只支持GET請(qǐng)求而不支持POST等其它類型的HTTP請(qǐng)求

2.2它只支持跨域HTTP請(qǐng)求這種情況,不能解決不同域的兩個(gè)頁(yè)面之間如何進(jìn)行JavaScript調(diào)用的問(wèn)題。

2.3 jsonp在調(diào)用失敗的時(shí)候不會(huì)返回各種HTTP狀態(tài)碼。

2.4缺點(diǎn)是安全性。萬(wàn)一假如提供jsonp的服務(wù)存在頁(yè)面注入漏洞,即它返回的javascript的內(nèi)容被人控制的。那么結(jié)果是什么?所有調(diào)用這個(gè) jsonp的網(wǎng)站都會(huì)存在漏洞。于是無(wú)法把危險(xiǎn)控制在一個(gè)域名下…所以在使用jsonp的時(shí)候必須要保證使用的jsonp服務(wù)必須是安全可信的。

第三種:創(chuàng)建一個(gè)WebFilter解決跨域

@WebFilter(filterName = "simpleCORSFilter",urlPatterns = "/*")

public class SimpleCORSFilter implements Filter {

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, HEAD");

response.setHeader("Access-Control-Max-Age", "3600");

response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");

chain.doFilter(req, res);

}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}

在入口類增加注解:

@ServletComponentScan

第四種:基于WebMvcConfigurerAdapter配置加入Cors的跨域

@Configuration

@EnableWebMvc

public class WebConfig extends WebMvcConfigurerAdapter {

@Override

public void addCorsMappings(CorsRegistry registry) {

registry.addMapping("/**")

.allowedOrigins("*")

.allowCredentials(true)

.allowedMethods("GET", "POST", "DELETE", "PUT")

.maxAge(3600);

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容