springboot跨域问题解决方案整理

springboot跨域问题:

第一种:注解解决@CrossOrigin

优点:注解是springboot的常用解决方案,简单快捷

缺点:注解只能解决单个控制器跨域

可以作用于方法  也可以作用于类

@CrossOrigin中的2个参数:

origins  : 允许可访问的域列表 

maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。

实例:@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协议

JSONP的优缺点

        1.优点

1.1它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制,JSONP可以跨越同源策略;

1.2它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持

1.3在请求完毕后可以通过调用callback的方式回传结果。将回调方法的权限给了调用方。这个就相当于将controller层和view层终于分开了。我提供的jsonp服务只提供纯服务的数据,至于提供服务以 后的页面渲染和后续view操作都由调用者来自己定义就好了。如果有两个页面需要渲染同一份数据,你们只需要有不同的渲染逻辑就可以了,逻辑都可以使用同 一个jsonp服务。

        2.缺点

2.1它只支持GET请求而不支持POST等其它类型的HTTP请求

2.2它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

2.3 jsonp在调用失败的时候不会返回各种HTTP状态码。

2.4缺点是安全性。万一假如提供jsonp的服务存在页面注入漏洞,即它返回的javascript的内容被人控制的。那么结果是什么?所有调用这个 jsonp的网站都会存在漏洞。于是无法把危险控制在一个域名下…所以在使用jsonp的时候必须要保证使用的jsonp服务必须是安全可信的。

第三种:创建一个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);

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。