介绍
什么情况会跨域
解决方案
前端解决方案
后端解决方案
具体方式
一、使用过滤方式进行设置
五、使用@CrossOrgin注解
今天就跟大家聊聊有关使用Java怎么解决跨域问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
跨域(歌珥)是指不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。
什么情况会跨域
- <李>
同一协议,如http或https
李> <李>同一IP地址,如127.0.0.1
李> <李>同一端口,如8080年
以上三个条件中有一个条件不同就会产生跨域问题。
解决方案
前端解决方案
- <李>
使用JSONP方式实现跨域调用;
李> <李>使用NodeJS服务器做为服务代理,前端发起请求到NodeJS服务器,NodeJS服务器代理转发请求到后端服务器;
后端解决方案
- <李>
nginx反向代理解决跨域
李> <李>服务端设置响应头(响应头部)的Access-Control-Allow-Origin
李> <李>在需要跨域访问的类和方法中设置允许跨域访问(如Spring中使用@CrossOrigin注解);
李> <李>继承使用Spring Web的CorsFilter(适用于Spring MVC,春天)
李> <李>实现WebMvcConfigurer接口(适用于弹簧引导)
李>具体方式
一、使用过滤方式进行设置
使用滤过滤器来过滤服务请求,向请求端设置响应头(响应头部)的Access-Control-Allow-Origin属性声明允许跨域访问。
@WebFilter public class  CorsFilter implements Filter  {, @Override才能 doFilter (public 才能;void  ServletRequest 点播,ServletResponse ,, FilterChain 链),throws IOException, ServletException {, ,,,HttpServletResponse response =, (HttpServletResponse), res,, ,,,response.setHeader (“Access-Control-Allow-Origin",,“*“),, ,,,response.setHeader (“Access-Control-Allow-Methods",,“*“),, ,,,response.setHeader (“Access-Control-Max-Age",,“3600“),, ,,,response.setHeader (“Access-Control-Allow-Headers",,“*”); ,,,response.setHeader (“Access-Control-Allow-Credentials",,“true"); ,,,chain.doFilter(点播,res);, ,,}, }
二,继承HandlerInterceptorAdapter
@ component public class  CrossInterceptor extends HandlerInterceptorAdapter  { @Override才能 public 才能;boolean  preHandle (HttpServletRequest 请求,HttpServletResponse 反应,Object 处理程序),throws Exception { ,,,response.setHeader (“Access-Control-Allow-Origin",,“*”); ,,,response.setHeader (“Access-Control-Allow-Methods",,,,,,,,,删除,OPTIONS"); ,,,response.setHeader (“Access-Control-Max-Age",,“3600“); ,,,response.setHeader (“Access-Control-Allow-Headers",,“*”); ,,,response.setHeader (“Access-Control-Allow-Credentials",,“true"); ,,,return 真实; ,,} }
三,实现WebMvcConfigurer
@ configuration @SuppressWarnings (“SpringJavaAutowiredFieldsWarningInspection") public class  AppConfig implements WebMvcConfigurer  { @Override才能 public 才能;void  addCorsMappings (CorsRegistry 注册),{ ,,,registry.addMapping(“/* *”),//,拦截所有的请求 ,,,,,,,.allowedOrigins (“http://www.abc.com"),//,可跨域的域名,可以为,* ,,,,,,,.allowCredentials(真正的) ,,,,,,,.allowedMethods(“*”),,//,允许跨域的方法,可以单独配置 ,,,,,,,.allowedHeaders(“*”);,//,允许跨域的请求头,可以单独配置 ,,} }
四、使用Nginx配置
的位置/,{ add_header 才能Access-Control-Allow-Origin *; add_header 才能;Access-Control-Allow-Headers  X-Requested-With; add_header 才能;Access-Control-Allow-Methods GET、POST、PUT删除选项; if 才能;(request_method 美元;=,& # 39;选项# 39;),{ ,,return 204; ,,} }
五、使用@CrossOrgin注解
如果只是想部分接口跨域,且不想使用配置来管理的话,可以使用这种方式
<强>在控制器使用强>
@CrossOrigin @RestController @RequestMapping (“/user") public class  UserController { @GetMapping (“/{id}“) public User get (@PathVariable Long id), { } @DeleteMapping (“/{id}“) public void 删除(@PathVariable Long id), { } }使用Java怎么解决跨域问题