-
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解决跨域的三种方式
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)有一者不同时,即为跨域请求,详见跨源...跨域是开发中经常会遇到的问题,当协议(http/https),主机(www.baidu.com/www.360.com||http://137.220.35.89/ /http://137.220.35.90/),端口(localhost:80/localhost:81)有一者不同时,即为跨域请求,详见跨源资源共享(CORS) - HTTP | MDN跨源资源共享 (CORS)(或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
在前后端分离项目中,经常会遇到跨域问题,Java中常用的三种解决方案如下:
- 使用注解 `@CrossOrigin`,标注在controller类的方法上或者controller类上
- crosFIlter
@Bean public CorsWebFilter corsWebFilter(){ // cors跨域配置对象 CorsConfiguration configuration = new CorsConfiguration(); configuration.addAllowedOrigin("*"); //设置允许访问的网络 configuration.setAllowCredentials(true); // 设置是否从服务器获取cookie configuration.addAllowedMethod("*"); // 设置请求方法 * 表示任意 configuration.addAllowedHeader("*"); // 所有请求头信息 * 表示任意 // 配置源对象 UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource(); configurationSource.registerCorsConfiguration("/**", configuration); // cors过滤器对象 return new CorsWebFilter(configurationSource); } //或者 @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); //sessionid 多次访问一致 // 允许访问的客户端域名 List<String> allowedOriginPatterns = new ArrayList<>(); allowedOriginPatterns.add("*"); corsConfiguration.setAllowedOriginPatterns(allowedOriginPatterns); // 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); } }
3.
WebMvcConfigurer
//标注这个类是一个配置类 @Configuration //实现 WebMvcConfigurer 接口 public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //设置允许跨域访问的路径 .allowedOriginPatterns("*") //设置允许跨域访问的源 .allowedMethods("*") //允许跨域请求的方法 .maxAge(168000) //预检间隔时间 .allowedHeaders("*") //允许头部设置 .allowCredentials(true); //是否发送 cookie } }
-
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....1.后台Controller注解方式
@CrossOrigin("*")
2.实现WebMvcConfigurer接口
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("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
3.配置CorsWebFilter实现跨域,适用于分布式网关
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import java.util.Arrays; @Configuration public class GulimallCorsConfiguration{ @Bean public CorsWebFilter corsWebFilter(){ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowedHeaders(Arrays.asList(new String("*"))); corsConfiguration.setAllowedMethods(Arrays.asList(new String("*"))); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.setAllowCredentials(true); source.registerCorsConfiguration("/**",corsConfiguration); return new CorsWebFilter(source); } }
4.使用nginx配置反向代理,适用于开发测试
server { listen 8500; server_name 127.0.0.1; location / { root html; proxy_pass http://127.0.0.1:8555/test; } }
-
java解决请求跨域的两种方法
2020-08-25 17:28:46主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
JAVA Java 解决跨域问题
2022-03-24 20:33:21JAVA | Java 解决跨域问题 引言 什么是跨域(CORS) 什么情况会跨域 解决方案 前端解决方案 后端解决方案 具体方式 一、使用Filter方式进行设置 二、继承 HandlerInterceptorAdapter 三、实现 ... -
Java解决跨域问题
2021-06-07 11:36:51我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来. 2.什么是跨域(CORS) 跨域(CORS)是指不同域名之间相互... -
java 解决跨域的两种方案
2019-12-09 13:02:04文章作者:云里飞鸟轻轻摇摆;...java 解决跨域的两种方案一、跨域与同源策略二、跨域的情况-图例三、json与jsonp区别json格式:jsonp格式:四、跨域处理代码实现 (两种方式)1、ajax的Jsonp方式... -
java代码-使用java解决跨域调用java后台!需要httpclient,httpcore的问题的源代码
2022-03-13 17:14:52java代码-使用java解决跨域调用java后台!需要httpclient,httpcore的问题的源代码 ——学习参考资料:仅用于个人学习使用! -
Java 解决跨域问题
2018-03-31 22:31:57备注:有时候项目有点忙,都忘记思考,一次面试中提出的跨域的问题,才恍然大悟,做了一下小的总结,望指正!过滤拦截请求!!!由于工程合作开发的需要,后台的应用要能支持跨域访问,但是在这个跨域访问“时好时坏... -
Java解决跨域(后端转发方式)
2022-03-06 14:36:19开发过程中经常能碰到这种场景,前端页面访问的是外部资源(跟前端应用部署的不是一台机器或者不是一个IP),此时常见的做法是通过 nginx 进行代理转发解决跨域。 代理转发要求被代理服务的域名(IP)固定,且具有... -
Java项目中如何解决跨域问题
2021-03-05 16:29:12Java项目中如何解决跨域问题发布时间:2020-11-11 16:00:40来源:亿速云阅读:91作者:LeahJava项目中如何解决跨域问题?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面... -
Java解决跨域问题(SpringCloud)
2021-04-10 20:43:10Java解决跨域问题(SpringCloud) @SpringBootApplication @EnableZuulProxy @EnableFeignClients public class ZuulServerApp { public static void main(String[] args) { SpringApplication.run(ZuulServerApp.... -
java中跨域以及解决办法
2021-03-27 15:09:45跨域 1.1 什么是跨域 浏览器开启了安全模式 发送的请求必须是xhr(ajax...再很久很久之前,一帮野生程序员为了解决跨域问题,采用了JSONP的方式,JSONP的方式就是将xhr请求类型悄悄滴替换为了Script请求,从而处理了 -
2种方式教你解决Java后端跨域问题
2022-04-08 11:25:12添加配置类解决Java跨域访问的问题。 -
Java解决vue跨域问题
2021-11-19 18:28:25只需要在相应的时候加上以下代码即可: response.setHeader("Access-Control-Allow-Origin", "*");此代码的意思是:表示该资源谁都可以访问 或者在controller层类或者方法上添加@CrossOrigin注解即可解决跨域问题 -
[后端] java如何解决跨域问题
2021-07-30 11:21:49基于zuul网关解决跨域问题 1.跨域问题描述: 本人在基于Oauth2.0做鉴权/授权时,配合前端联调接口时,已经让前端请求时的请求头带上key:Authorization,但是前台报错为跨域问题,后台报错鉴权失败,于是跟踪错误,... -
Java——cors解决跨域问题
2022-02-11 16:21:09Java——cors解决跨域问题 -
java后端解决跨域问题
2019-06-22 21:35:351.java过滤器过滤 允许整个项目跨域访问,可通过filter来进行过虑: public class SimpleCORSFilter implements Filter{ @Override public void destroy() { } @Override public void doFilte... -
JAVA | Java 解决跨域问题
2020-09-19 19:59:35我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来. 什么是跨域(CORS) 跨域(CORS)是指不同域名之间相互... -
JAVA全局跨域问题解决
2021-06-05 21:20:22JAVA全局跨域问题解决(springboot) 问题: 前端和后端用的域名地址不是一个,前端请求时提示跨域 目标: 任何域名的请求都可以访问 解决方式: 全局的允许跨域配置 @Configuration public class ... -
vue+Java后端进行调试时解决跨域问题的方式
2020-11-26 19:22:24今天在开发过程中遇到一个问题,拿到了一套vue代码,计划对这套代码的部分样式进行调整,Java后端代码已经写好并且部署到了线上。这时命令行运行vue项目时访问会受限,取不下数据来,遇到了跨域访问失败的问题,这时... -
Java | Java 解决跨域问题
2020-03-08 20:21:32文章目录引言什么是跨域(CORS)什么情况会跨域解决方案前端解决方案后端解决方案具体方式一、使用Filter方式进行设置二、继承 HandlerInterceptorAdapter三、实现 WebMvcConfigurer四、使用Nginx配置五、使用 `@... -
跨域问题与JAVA解决方案
2022-03-08 22:38:24跨域问题及解决方案