spring boot跨域处理

简介:

使用spring boot开发web应用时,有时会需要对跨域访问进行处理。本文包含了服务端跨域和客户端跨域的处理,对于json数据的处理包含了fastjson和jackson两种方式

一. 客户端跨域

对于客户端跨域,原理这里就不做详解,大家熟知的应该是jquery jsonp请求。这种方式会在请求的url上增加一个callback参数(表示请求返回后的回调js函数,参数名可以配置),服务端返回的数据实际是一段js,而js的内容就是执行这个回调js函数,服务端返回的数据就是这个回调js函数的参数,只是jquery内部已有处理,所以使用起来就和普通的ajax json请求没有什么差别,但是服务端返回的数据就需要按约定进行处理。比如一个ajax jsonp的请求中,callback参数的值是a,服务端需要返回数据data,那么服务端返回的结果就应该是a(data)。因此可以在服务端对Controller请求做统一处理,在普通http请求返回结果的基础上,获取callback参数的值拼接成jsonp需要返回的结果

  1. jackson支持jsonp的配置
  • spring boot的json序列化默认使用的是jackson;@ControllerAdvice是spring3.2提供的一个增强控制器的注解,AbstractJsonpResponseBodyAdvice 是spring mvc提供的针对jsonp请求的处理。spring boot只需增加如下配置即可支持jackson对jsonp的支持。并且增加了此配置之后,只有当请求中包含callback参数时才会被当做跨域请求处理,否则跟同源请求处理一样。
@Configuration
@ControllerAdvice  
public class JsonpSupportAdvice extends AbstractJsonpResponseBodyAdvice {  
    public JsonpSupportAdvice() {  
        //参数包含callback的时候 使用jsonp的反馈形式  
        super("callback");  
    }  
}  
  1. fastjson支持jsonp的配置
  • 现在有很多json序列化是使用fastjson的,而fastjson也提供了对于jsonp的支持,配置如下:
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
    //配置使用fastjson作为转换器,注意是FastJsonpHttpMessageConverter4而不是FastJsonHttpMessageConverter4
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new FastJsonpHttpMessageConverter4());
    }
}

//配置fastjson的ResponseBodyAdvice
@Bean
public FastJsonpResponseBodyAdvice fastJsonpResponseBodyAdvice() {
    return new FastJsonpResponseBodyAdvice("callback");
}

注意

  • 由于jackson和fastjson是两种不同的序列化,所以两者不能混用,即如果配置fastjson作为消息转换器,就只能使用fastjson的ResponseBodyAdvice

二. 服务端跨域

客户端跨域的请求只能是get方式请求,更多适用于提供一些公开的api,比如网上提供的获取天气、手机号归属地等接口。而很多项目是因为做前后端分离需要使用跨域,这时候就更适合用服务端跨域,客户端就可以像同源请求一样正常使用,spring boot默认使用jackson,本身提供了对于跨域的支持,配置如下:

  1. jackson服务端支持跨域
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(HttpMethod.GET.toString());
    }
    
}
  1. 使用fastjson时,配置服务端支持跨域,除了前面使用默认jackson的配置之外,还需要配置fastjson的SupportedMediaTypes,默认是*,请求会报错
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // FastJsonHttpMessageConverter4默认的mediaType是*/*,restTemplate请求不允许请求头信息中的ContentType为*,所以需要修改mediaType
        FastJsonHttpMessageConverter4 fastJsonHttpMessageConverter4 = new FastJsonHttpMessageConverter4();
        List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        // fastJsonHttpMessageConverter4.getSupportedMediaTypes()方法获取的list不允许修改,所以只能使用set方法进行修改
        fastJsonHttpMessageConverter4.setSupportedMediaTypes(supportedMediaTypes);
        converters.add(fastJsonHttpMessageConverter4);
        // converters.add(new FastJsonHttpMessageConverter4());
    }
}
  • 前端请求示例(注意dataType是json,不是jsonp)
$.ajax({
    url: 'http://jsonp.itopener1.com:8081/jsonp/user/2',
    type: 'get',
    dataType: 'json',
    success: function(data){
        console.log(JSON.stringify(data));
    },
    error: function(err){
        console.log(JSON.stringify(err));
    }
});
目录
相关文章
|
8天前
|
安全 Java 应用服务中间件
SpringBoot:CORS是什么?SpringBoot如何解决跨域问题?
CORS是Web开发中常见且重要的机制,SpringBoot通过提供注解、全局配置和过滤器等多种方式来解决跨域问题。选择适合的方式可以帮助开发者轻松处理跨域请求,提高应用的灵活性和安全性。
34 2
|
16天前
|
前端开发 安全 JavaScript
SpringBoot 如何解决跨域问题?
本文深入探讨了Spring Boot解决跨域问题的方法,包括全局配置CORS、使用@CrossOrigin注解和自定义过滤器,提供了详细的代码示例和分析,帮助开发者有效应对Web开发中的跨域挑战。
|
24天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
38 2
|
2月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
380 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
65 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
114 1
|
6月前
|
前端开发 安全 JavaScript
Spring Boot2 系列教程(十四)CORS 解决跨域问题
Spring Boot2 系列教程(十四)CORS 解决跨域问题
|
2月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
70 2
|
4月前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
|
6月前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
57 2