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);
}
}