精华内容
下载资源
问答
  • 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:01
    springboot的注解跨域解决也不行,在网上看来很多解决问题的办法,都很繁琐,最后从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:21
    JAVA | Java 解决跨域问题 引言 什么是跨域(CORS) 什么情况会跨域 解决方案 前端解决方案 后端解决方案 具体方式 一、使用Filter方式进行设置 二、继承 HandlerInterceptorAdapter 三、实现 ...

    JAVA | Java 解决跨域问题


    引言

    我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.

    什么是跨域(CORS)

    跨域(CORS)是指不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。

    什么情况会跨域

    • 同一协议, 如http或https
    • 同一IP地址, 如127.0.0.1
    • 同一端口, 如8080

    以上三个条件中有一个条件不同就会产生跨域问题。

    解决方案

    前端解决方案

    1. 使用JSONP方式实现跨域调用;
    2. 使用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:12
    Java项目中如何解决跨域问题发布时间: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服务器端跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Java解决vue跨域问题

    千次阅读 2021-11-19 18:28:25
    只需要在相应的时候加上以下代码即可: response.setHeader("Access-Control-Allow-Origin", "*");此代码的意思是:表示该资源谁都可以访问 或者在controller层类或者方法上添加@CrossOrigin注解即可解决跨域问题
  • java后端解决跨域问题

    万次阅读 多人点赞 2019-06-22 21:35:35
    1.java过滤器过滤 允许整个项目跨域访问,可通过filter来进行过虑: public class SimpleCORSFilter implements Filter{ @Override public void destroy() { } @Override public void doFilte...
  • java cxf webservice接口解决跨域问题,cors-filter-1.7.jar、java-property-utils-1.9.jar,以及web.xml文件配置
  • 主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • JAVA如何解决跨域问题

    千次阅读 2018-04-23 14:05:02
    1.普通的GET或者POST请求跨域。 在自己编写的过滤器文件中添加如下代码,也可以再单独的方法中添加,: //允许所有的域都可以跨域访问 response.addHeader("Access-Control-Allow-Origin", "*&...
  • 1.通过配置cors协议解决跨域 在springboot中 可以在控制器当中添加注解@CrossOrigin 该注解的属性value=”“,填入地址,多个地址逗号分开,或者填入 * ,表示所有域名都可访问。属性maxAge,也就是Cookie的有效期 ...
  • 跨域 1.1 什么是跨域 浏览器开启了安全模式 发送的请求必须是xhr(ajax...再很久很久之前,一帮野生程序员为了解决跨域问题,采用了JSONP的方式,JSONP的方式就是将xhr请求类型悄悄滴替换为了Script请求,从而处理了
  • 1、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规范,允许您灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不太强大...
  • 配置CorsWebFilter实现跨域,适用于分布式网关 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,086
精华内容 16,834
关键字:

java解决跨域问题

java 订阅