SpringBoot解决跨域问题
·
最近,用Springboot做服务器遇到了跨域问题。
遇见跨域问题的原因为:在VUE写的前端,在界面访问另一个不同的URL时,遇到了跨域问题。
跨域问题之所以出现,是因为AJAX只允许同源,即相同的URL头访问。该方案避免了不同源服务器之间访问的安全问题。
值得注意的是:相同的IP地址,但端口不一样,也会被认为不是同源。
解决跨域问题的关键是:允许不同源URL进行访问,即允许跨域。
可以让前端VUE来解决,但既然笔者是负责Springboot开发的,就先解决Springboot的跨域问题。
解决方案如下:
1)用CrosFilter(全局解决跨域问题)
@Component
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse rsp = (HttpServletResponse) response;
rsp.addHeader("Access-Control-Allow-Credentials", "true");
rsp.addHeader("Access-Control-Allow-Origin", "*");
rsp.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
rsp.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
chain.doFilter(request, response);
}
}
2)重写WebMVCConfigurer(全局解决跨域问题)
@Configuration
public class GlobalCorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置
.allowedOrigins("*") //开放哪些ip、端口、域名的访问权限
.allowCredentials(true) //是否允许发送Cookie信息
.allowedMethods("GET","POST", "PUT", "DELETE") //开放哪些Http方法,允许跨域访问
.allowedHeaders("*"); //允许HTTP请求中的携带哪些Header信息
}
};
}
}
或
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurer{
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("*")
.maxAge(3600);
}
}
3)使用注解(局部解决跨域问题)
@RestController
@CrossOrigin(origins = "*") //局部跨域
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello world";
}
}
4)设置响应头(局部解决跨域问题)
@RequestMapping("/hello")
public String hello(HttpServletResponse response) {
response.addHeader("Access-Allow-Control-Origin","*");
return "hello";
}
还有其他方法,本文不再一一列举。
更多推荐
所有评论(0)