-
2022-05-13 16:42:42
在做前后端项目时,都会遇到的问题就是跨域问题。
跨域问题一般都是在后端解决
第一种解决方法是加注解的方式
在controller层里的类上加 @CrossOrigin 注解 就可以了。
第二种是写一个配置类
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") .allowCredentials(true) .maxAge(3600) .allowedHeaders("*"); } }
更多相关内容 -
解决java项目跨域问题
2019-05-29 15:52:01springboot的注解跨域解决也不行,在网上看来很多解决问题的办法,都很繁琐,最后从spring根源去寻找问题,最后从后台解决了前端的跨域问题,只需将此java文件粘贴到项目中,便可以解决跨域问题。前端无需修改,便... -
java解决跨域问题
2021-10-14 16:25:38一般的,只要网站的【协议名protocol】、【主机host】、【端口号port】这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用; 跨域请求能够达到服务端,但是返回结果会被浏览器拦截; 方法一、@Cross...说明
- 资源请求的发起方与请求的资源不在同一个域中的;
- 一般的,只要网站的【协议名protocol】、【主机host】、【端口号port】这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用;
- 跨域请求能够达到服务端,但是返回结果会被浏览器拦截;
方法一、@CrossOrigin
spring boot中只用在Controller类上添加一个“@CrossOrigin“注解就可以实现对当前controller 的跨域 访问了,当然这个标签也可以加到方法上。
其他controller类继承以上这个类就可以解决跨域问题。
注意:“@CrossOrigin“注解要求jdk1.8以上版本@CrossOrigin public class CommonController { }
方法二、采用添加拦截器的方法
package com.autonavi.acis.system.conf; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //添加静态资源 registry.addResourceHandler("/js/**").addResourceLocations("classpath:/public/js/"); registry.addResourceHandler("/css/**").addResourceLocations("classpath:/public/css/"); registry.addResourceHandler("/fonts/**").addResourceLocations("classpath:/public/fonts/"); registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/static/favicon.ico"); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerInterceptor() { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //允许所有请求 response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }); } @Override public void addCorsMappings(CorsRegistry registry) { //显式配置路径 registry.addMapping("/public/api/ajxSelf/project/appVersions/*"); } }
新版替换类
Spring 5.0后,WebMvcConfigurerAdapter被废弃,取代的方法有两种:
①implements WebMvcConfigurer(官方推荐)
②extends WebMvcConfigurationSupport
使用第一种方法是实现了一个接口,可以任意实现里面的方法,不会影响到Spring Boot自身的@EnableAutoConfiguration,而使用第二种方法相当于覆盖了@EnableAutoConfiguration里的所有方法,每个方法都需要重写,比如,若不实现方法addResourceHandlers(),则会导致静态资源无法访问,实现的方法如下:
@Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/resources/") .addResourceLocations("classpath:/resources/") .addResourceLocations("classpath:/static/") .addResourceLocations("classpath:/public/"); super.addResourceHandlers(registry); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/public/api/ajxSelf/project/appVersions/*"); }
方法三、filter处理器
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @WebFilter(filterName = "OriginFilter", urlPatterns = "*") public class OriginFilter implements Filter { private final Logger logger= LoggerFactory.getLogger(this.getClass()); @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpServletResponse = (HttpServletResponse) response; // * 表示允许所有请求 httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); httpServletResponse.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,DELETE,PUT"); httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); //httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, content-Type, Accept,X-Requested-With, WG-App-Version, WG-Device-Id, WG-Network-Type, WG-Vendor, WG-OS-Type, WG-OS-Version, WG-Device-Model, WG-CPU, WG-Sid, WG-App-Id, WG-Token"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "X-Requested-With,content-type"); chain.doFilter(request, httpServletResponse); } @Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("----------------过滤器正在启动-----------------"); } }
其他文档介绍:https://zhuanlan.zhihu.com/p/31016194
-
JAVA Java 解决跨域问题
2022-03-24 20:33:21JAVA | Java 解决跨域问题 引言 什么是跨域(CORS) 什么情况会跨域 解决方案 前端解决方案 后端解决方案 具体方式 一、使用Filter方式进行设置 二、继承 HandlerInterceptorAdapter 三、实现 ...JAVA | Java 解决跨域问题
- 引言
- 解决方案
- 具体方式
- Spring Cloud Gateway 跨域配置
引言
我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.
什么是跨域(CORS)
跨域(CORS)是指不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。
什么情况会跨域
- 同一协议, 如http或https
- 同一IP地址, 如127.0.0.1
- 同一端口, 如8080
以上三个条件中有一个条件不同就会产生跨域问题。
解决方案
前端解决方案
- 使用JSONP方式实现跨域调用;
- 使用NodeJS服务器做为服务代理,前端发起请求到NodeJS服务器, NodeJS服务器代理转发请求到后端服务器;
后端解决方案
- nginx反向代理解决跨域
- 服务端设置Response Header(响应头部)的Access-Control-Allow-Origin
- 在需要跨域访问的类和方法中设置允许跨域访问(如Spring中使用@CrossOrigin注解);
- 继承使用Spring Web的CorsFilter(适用于Spring MVC、Spring Boot)
- 实现WebMvcConfigurer接口(适用于Spring Boot)
具体方式
一、使用Filter方式进行设置
使用Filter过滤器来过滤服务请求,向请求端设置Response Header(响应头部)的Access-Control-Allow-Origin属性声明允许跨域访问。
@WebFilter public class CorsFilter implements Filter { @Override 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", "*"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Allow-Credentials", "true"); chain.doFilter(req, res); } }
二、继承 HandlerInterceptorAdapter
@Component public class CrossInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Allow-Credentials", "true"); return true; } }
三、实现 WebMvcConfigurer
@Configuration @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") public class AppConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 拦截所有的请求 .allowedOrigins("http://www.abc.com") // 可跨域的域名,可以为 * .allowCredentials(true) .allowedMethods("*") // 允许跨域的方法,可以单独配置 .allowedHeaders("*"); // 允许跨域的请求头,可以单独配置 } } 复制代码
四、使用Nginx配置
location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; if ($request_method = 'OPTIONS') { return 204; } } 复制代码
五、使用
@CrossOrgin
注解如果只是想部分接口跨域,且不想使用配置来管理的话,可以使用这种方式
在Controller使用
@CrossOrigin @RestController @RequestMapping("/user") public class UserController { @GetMapping("/{id}") public User get(@PathVariable Long id) { } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { } }
在具体接口上使用
@RestController @RequestMapping("/user") public class UserController { @CrossOrigin @GetMapping("/{id}") public User get(@PathVariable Long id) { } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { } }
Spring Cloud Gateway 跨域配置
spring: cloud: gateway: globalcors: cors-configurations: '[/**]': # 允许跨域的源(网站域名/ip),设置*为全部 # 允许跨域请求里的head字段,设置*为全部 # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部 allow-credentials: true allowed-origins: - "http://xb.abc.com" - "http://sf.xx.com" allowed-headers: "*" allowed-methods: - OPTIONS - GET - POST - DELETE - PUT - PATCH max-age: 3600
注意: 通过
gateway
转发的其他项目,不要进行配置跨域配置有时即使配置了也不会起作用,这时你可以根据浏览器控制的错误输出来查看问题,如果提示是
response
中 header 出现了重复的Access-Control-*
请求头,可以进行如下操作import java.util.ArrayList; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component("corsResponseHeaderFilter") public class CorsResponseHeaderFilter implements GlobalFilter, Ordered { @Override public int getOrder() { // 指定此过滤器位于NettyWriteResponseFilter之后 // 即待处理完响应体后接着处理响应头 return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange).then(Mono.defer(() -> { exchange.getResponse().getHeaders().entrySet().stream() .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1)) .filter(kv -> ( kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS) || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS) || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS) || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_MAX_AGE))) .forEach(kv -> { kv.setValue(new ArrayList<String>() {{ add(kv.getValue().get(0)); }}); }); return chain.filter(exchange); })); } }
作者:双鬼带单
链接:https://juejin.cn/post/6874163312918003719
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 -
Java解决跨域问题
2021-06-07 11:36:51我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来. 2.什么是跨域(CORS) 跨域(CORS)是指不同域名之间相互...1.引言
我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.
2.什么是跨域(CORS)
跨域(CORS)是指不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。
3.什么情况会跨域(CORS)
- 同一协议, 如http或https
- 同一IP地址, 如127.0.0.1
- 同一端口, 如8080
以上三个条件中有一个条件不同就会产生跨域问题。
4.跨域流程
参考地址:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
5.解决跨域
配置当次请求允许跨域
解决方法:在网关中定义“
CorsConfig
”类,该类用来做过滤,允许所有的请求跨域。package com.microservice.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; //配置过滤器,解决跨域问题 @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); //允许任何域名使用 corsConfiguration.addAllowedHeader("*"); //允许任何头 corsConfiguration.addAllowedMethod("*"); //允许任何方法(post、get等) return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } }
-
Java 解决跨域问题
2018-03-31 22:31:57备注:有时候项目有点忙,都忘记思考,一次面试中提出的跨域的问题,才恍然大悟,做了一下小的总结,望指正!过滤拦截请求!!!由于工程合作开发的需要,后台的应用要能支持跨域访问,但是在这个跨域访问“时好时坏... -
Java项目中如何解决跨域问题
2021-03-05 16:29:12Java项目中如何解决跨域问题发布时间:2020-11-11 16:00:40来源:亿速云阅读:91作者:LeahJava项目中如何解决跨域问题?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面... -
Java解决跨域的三种方式
2022-03-16 11:19:02跨域是开发中经常会遇到的问题,当协议(http/https),主机(www.baidu.com/www.360.com||http://137.220.35.89//http://137.220.35.90/),端口(localhost:80/localhost:81)有一者不同时,即为跨域请求,详见跨源... -
Java服务器端跨域问题解决方案
2020-08-25 04:22:27主要介绍了java服务器端跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Java解决vue跨域问题
2021-11-19 18:28:25只需要在相应的时候加上以下代码即可: response.setHeader("Access-Control-Allow-Origin", "*");此代码的意思是:表示该资源谁都可以访问 或者在controller层类或者方法上添加@CrossOrigin注解即可解决跨域问题 -
java后端解决跨域问题
2019-06-22 21:35:351.java过滤器过滤 允许整个项目跨域访问,可通过filter来进行过虑: public class SimpleCORSFilter implements Filter{ @Override public void destroy() { } @Override public void doFilte... -
java cxf webservice接口解决跨域问题
2018-05-02 11:53:25java cxf webservice接口解决跨域问题,cors-filter-1.7.jar、java-property-utils-1.9.jar,以及web.xml文件配置 -
java解决请求跨域的两种方法
2020-08-25 17:28:46主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
JAVA如何解决跨域问题
2018-04-23 14:05:021.普通的GET或者POST请求跨域。 在自己编写的过滤器文件中添加如下代码,也可以再单独的方法中添加,: //允许所有的域都可以跨域访问 response.addHeader("Access-Control-Allow-Origin", "*&... -
java 后端解决跨域问题
2022-03-24 10:09:321.通过配置cors协议解决跨域 在springboot中 可以在控制器当中添加注解@CrossOrigin 该注解的属性value=”“,填入地址,多个地址逗号分开,或者填入 * ,表示所有域名都可访问。属性maxAge,也就是Cookie的有效期 ... -
java中跨域以及解决办法
2021-03-27 15:09:45跨域 1.1 什么是跨域 浏览器开启了安全模式 发送的请求必须是xhr(ajax...再很久很久之前,一帮野生程序员为了解决跨域问题,采用了JSONP的方式,JSONP的方式就是将xhr请求类型悄悄滴替换为了Script请求,从而处理了 -
Java配置过滤器,并解决跨域的问题
2021-03-04 09:44:401、web.xml配置filter SystemInterceptor com.yk.interceptor.SystemInterceptor SystemInterceptor /* 2、在com.yk.interceptor包下创建类SystemInterceptor ... 上述是解决跨域问题的代码,*是允许所有域名 -
注解@CrossOrigin解决跨域问题
2021-03-15 12:34:40注解@CrossOrigin出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。...跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,允许您灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不太强大... -
java 解决跨域的四种方式
2021-09-01 09:47:31配置CorsWebFilter实现跨域,适用于分布式网关 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors....