使用Java怎么解决跨域问题

  介绍

今天就跟大家聊聊有关使用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怎么解决跨域问题