本章概要

  • CORS 支持
  • 配置类与 XML 配置
  • 注册拦截器

CORS 支持

CORS (Cross-Origin Resource Sharing)是由 W3C 制定开发的一种跨域资源共享技术标准,其目的就是为了解决前端的跨域请求。在 Java EE 开发中,最常见的前端跨域请求解决方案是 JSONP ,但是 JSONP 只支持 GET 请求,而 CORS 则支持多种 HTTP 请求方法。

GET、POST、HEAD 请求流程:响应头中有一个 Access-Control-Orgin 字段,用来记录可以访问该资源的域。当浏览器收到这样的响应头信息后,提取 Access-Control-Orgin 字段中的值,发现该值包含当前页面所在的域,就知道这个跨域是被允许的。

DELETE、PUT 及 自定义请求等请求流程:以 DELETE 请求为例,当前端发起一个 DELETE 请求时,这个请求的处理会经过两个步骤。第一步,发送一个 OPTIONS 请求询问服务端是否具备该资源的 DELETE 权限,服务端给浏览器响应, Allow 头信息表示服务端支持的请求方法。第二步,发送 DELETE 请求,服务端再次给出一次响应。

无论是简单请求还是自定义请求,前端的写法都不变,额外的处理都是在服务端来完成的。在传统 Java EE 开发中,可以通过过滤器统一配置,而 Spring Boot 中对此则提供了更简洁的解决方案。

1. 创建SpringBoot工程

创建 Spring Boot 工程,添加 Web 依赖,如下

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 创建控制器

@RestController
@RequestMapping("/book")
public class BookController {
    @PostMapping("/")
    public String addBook(String name){
        return "receive:" name;
    }
    @DeleteMapping("/{id}")
    public String deleteBookById(@PathVariable long id){
        return String.valueOf(id);
    }
}

3. 配置跨域

跨域有两个地方可以配置,一个是直接在相应的请求方法上加注解:

@RestController
@RequestMapping("/book")
public class BookController {
    @PostMapping("/")
    @CrossOrigin(value = "http://localhost:8081",maxAge = 1800,allowedHeaders = "*")
    public String addBook(String name){
        return "receive:" name;
    }
    @DeleteMapping("/{id}")
    @CrossOrigin(value = "http://localhost:8081",maxAge = 1800,allowedHeaders = "*")
    public String deleteBookById(@PathVariable long id){
        return String.valueOf(id);
    }
}

代码解释:

  • @CrossOrigin 中的 value 表示支持的域,这里表示来自 http://localhost:8081 域的请求是支持跨域的
  • maxAge 表示探测请求的有效期,探测请求不用每次都发送,可以配置一个有效期,有效期过了之后才会发送探测请求,默认1800秒
  • allowedHeaders 表示允许的请求头,“*” 表示所有的请求头都被允许

这种配置方式是一种细粒度的配置,可以控制到每一个方法上。也可以不再每个方法上加 @CrossOrigin 注解,而是采用全局配置,如下:

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/book/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(1800)
                .allowedOrigins("http://localhost:8081");
        System.out.println("进入跨域配置");
    }
}

代码解释:

  • 全局配置需要自定义实现 WebMvcConfigurer 接口,然后实现接口中的 addCorsMappings 方法
  • 在 addCorsMappings 方法中,addMapping 表示对哪种格式的请求路径进行跨域处理;allowedHeaders 表示允许的请求头,默认允许所有的请求头信息;allowedMethods表示允许的请求方法,默认是 GET 、POST 和 HEAD , * 表示支持所有的请求方法; maxAge表示探测请求的有效期;allowedOrigins表示支持的域

上面两种配置方式,选择一种即可,然后启动项目。

4. 测试

新建一个Spring Boot 项目,添加Web依赖,然后在 resources/static 目录下加入jquery.js并创建一个index.html文件,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery3.3.1.js"></script>
</head>
<body>
<div id="contentDiv"></div>
<div id="deleteResult"></div>
<input type="button" value="提交数据" onclick="getData()"><br>
<input type="button" value="删除数据" onclick="deleteData()"><br>
<script>
    function getData() {
        $.ajax({
            url: 'http://localhost:8081/book/',
            type: 'get',
            success: function (msg) {
                $("#contentDiv").html(msg);
            }
        })
    }
    function deleteData() {
        $.ajax({
            url: 'http://localhost:8081/book/99',
            type: 'delete',
            success: function (msg) {
                $("#deleteResult").html(msg);
            }
        })
    }
</script>
</body>
</html>

运行项目,访问"http://localhost:8081/index.html",查看结果

配置类与 XML 配置

Spring Boot 推荐使用 Java 完成相关的配置工作。在项目中,不建议将所有的配置放在一个配置类中,可以根据不同的需求提供不同的配置类,例如专门处理Spring Security 的配置类、提供 Bean 的配置类、Spring MVC 相关的配置类。这些配置上都需要添加 @Configuration,@ComponentScan 注解会扫描所有的 Spring 组件,也包括 @Configuration 。@ComponentScan注解 在项目入口类的 @SpringBootApplication 注解中已经提供,因此在实际项目中只需要按需提供相关配置类即可。

Spring Boot 中并不推荐使用 XML配置。如果需要使用 XML 配置,只需要在 resources 目录下提供配置文件 然后通过 @ImportResource 加载配置文件即可,例如,有一个 Hello 类,如下:

public class Hello {
    public String sayHello(String name){
        return "hello"   name;
    }
}

在resources 目录下新建 beans.xml 文件配置该类:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="com.sang.chapter04.Hello" id="hello"/>
</beans>

然后创建 Bean 配置类,导入 XML 配置

@Configuration
@ImportResource("classpath:beans.xml")
public class Beans {
}

最后在 Controller 中就可以直接导入 Hello 类使用了:

@RestController
public class HelloController {
    @Autowired
    Hello hello;
    @GetMapping("/hello")
    public String hello(){
        return hello.sayHello("嗨喽!");
    }
}

注册拦截器

Spring Boot 中提供了 AOP 风格的拦截器,拥有更加精细的拦截处理能力。Spring Boot 中拦截器的注册更加方便。

步骤1:创建一个 Spring Boot 项目,添加 spring-boot-starter-web 依赖。

步骤2:创建拦截器实现 HandlerInterceptor 接口

public class MyInterceptor1 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("MyInterceptor1>>>preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("MyInterceptor1>>>postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("MyInterceptor1>>>afterCompletion");
    }
}

拦截器中的方法将按 preHandle --> Controller --> postHandle --> afterCompletion 的顺序执行。注意,只有 preHandle 方法返回 true 时后面的方法才会执行。当拦截器链内存在多个拦截拦截器时,postHandle 在拦截器链内的所有的拦截器返回成功时才会调用,而 afterCompletion 只有 preHandle 返回 true 才会调用,若拦截器链内的第一个拦截器的 preHandle 方法返回 false ,则后面的方法都不会执行。

步骤3:配置拦截器。定义配置类进行拦截器的配置,如下

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor1())
                .addPathPatterns("/**")
                .excludePathPatterns("/hello");
    }
}

自定义实现 WebMvcConfigurer 接口,实现接口中的 addInterceptors 方法。其中,addPathPatterns表示拦截路径,excludePathPatterns 表示排除的路径。

步骤4:测试。在浏览器中访问 /hello 和 /hello2 接口,当访问 /hello2 时,打印日志如下:

MyInterceptor1>>>preHandle
MyInterceptor1>>>postHandle
MyInterceptor1>>>afterCompletion

到此这篇关于SpringBoot整合Web之CORS支持与配置类和 XML配置及注册拦截器的文章就介绍到这了,更多相关SpringBoot CORS支持内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringBoot整合Web之CORS支持与配置类和 XML配置及注册拦截器的更多相关文章

  1. 简单易懂的JSONP和CORS跨域方案详解

    这篇文章主要为大家介绍了简单易懂的JSONP和CORS跨域方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. SpringBoot本地磁盘映射问题

    这篇文章主要介绍了SpringBoot本地磁盘映射问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)

    这篇文章主要介绍了java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源),文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

  4. SpringBoot整合Javamail实现邮件发送的详细过程

    日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等,下面这篇文章主要给大家介绍了关于SpringBoot整合Javamail实现邮件发送的详细过程,需要的朋友可以参考下

  5. SpringBoot详细讲解视图整合引擎thymeleaf

    这篇文章主要分享了Spring Boot整合使用Thymeleaf,Thymeleaf是新一代的Java模板引擎,类似于Velocity、FreeMarker等传统引擎,关于其更多相关内容,需要的小伙伴可以参考一下

  6. Springboot集成mybatis实现多数据源配置详解流程

    在日常开发中,若遇到多个数据源的需求,怎么办呢?通过springboot集成mybatis实现多数据源配置,简单尝试一下,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. SpringBoot使用Minio进行文件存储的实现

    本文主要介绍了SpringBoot使用Minio进行文件存储的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. 解析SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    这篇文章主要介绍了SpringBoot中使用LoadTimeWeaving技术实现AOP功能,AOP面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强,本文给大家介绍的非常详细,需要的朋友可以参考下

  9. 详解springboot测试类注解

    这篇文章主要介绍了springboot测试类注解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  10. SpringBoot实现过滤器和拦截器的方法

    大家应该都晓得实现过滤器需要实现 javax.servlet.Filter 接口,而拦截器会在处理指定请求之前和之后进行相关操作,配置拦截器需要两步,本文通过实例代码给大家介绍SpringBoot 过滤器和拦截器的相关知识,感兴趣的朋友一起看看吧

随机推荐

  1. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  4. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  5. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  6. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  7. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  8. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

返回
顶部