Spring Boot Web 自定义注解篇(注解很简单很好用)
自从spring 4.0 开放以后,可以添加很多新特性的注解了。使用系统定义好的注解可以大大方便的提高开发的效率。
下面我贴一段代码来讲解注解:
通过小小的注解我们支持了以下功能:
- 使
spring.jackson.date-format
属性支持JDK8
日期格式化 - 解决
request.getInputStream()
一次读取后失效痛点 - 国际化支持
- 全局跨域支持
- 接口加密/解密
- 防XSS攻击
- 分布式限流/分布式锁支持
我们通过自定义@EnableCorsFilter 来看一下跨域是如何支持的:
- package com.battcn.boot.request.annotation;
- import com.battcn.boot.request.configuration.cors.CorsFilterAutoConfiguration;
- import org.springframework.context.annotation.Import;
- import java.lang.annotation.*;
- /**
- * 开启跨域支持
- *
- * @author Levin
- * @since 2019-01-01
- */
- @Target({ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Inherited
- @Import({CorsFilterAutoConfiguration.class})
- public @interface EnableCorsFilter {
- }
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。
如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
- CorsFilterAutoConfiguration类(具体实现)
- package com.battcn.boot.request.configuration.cors;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
- import org.springframework.boot.context.properties.EnableConfigurationProperties;
- 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;
- import static com.battcn.boot.request.utils.StringUtils.defaultString;
- /**
- * Cors 跨域支持
- *
- * @author Levin
- * @since 2017/12/5 0005
- */
- @Configuration
- @EnableConfigurationProperties(value = {CorsFilterProperties.class})
- public class CorsFilterAutoConfiguration {
- private static final String PATH = "/**";
- private final CorsFilterProperties properties;
- @Autowired
- public CorsFilterAutoConfiguration(CorsFilterProperties properties) {
- this.properties = properties;
- }
- private CorsConfiguration buildConfig() {
- CorsConfiguration corsConfiguration = new CorsConfiguration();
- corsConfiguration.addAllowedOrigin(defaultString(properties.getOrigin(), CorsConfiguration.ALL));
- corsConfiguration.addAllowedHeader(defaultString(properties.getAllowedHeader(), CorsConfiguration.ALL));
- corsConfiguration.addAllowedMethod(defaultString(properties.getMethod(), CorsConfiguration.ALL));
- // 是否发送 Cookie 信息
- corsConfiguration.setAllowCredentials(properties.getAllowCredentials());
- if (properties.getMaxAge() != null) {
- corsConfiguration.setMaxAge(properties.getMaxAge());
- }
- if (properties.getExposedHeader() != null) {
- corsConfiguration.addExposedHeader(properties.getExposedHeader());
- }
- return corsConfiguration;
- }
- /**
- * 跨域过滤器
- *
- * @return Cors过滤器
- */
- @Bean
- @ConditionalOnMissingBean
- public CorsFilter corsFilter() {
- UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
- source.registerCorsConfiguration(defaultString(properties.getPath(), PATH), buildConfig());
- return new CorsFilter(source);
- }
- }
- @ConditionalOnMissingBean 属性相同,自动生成加载
- @Configuration Ioc加载到bean里
- @EnableConfigurationProperties 加载class配置项
- @ConfigurationProperties 加载具体的配置参数
- CorsFilterProperties配置类
- package com.battcn.boot.request.configuration.cors;
- import lombok.Data;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.lang.Nullable;
- /**
- * Core 跨域相关配置
- *
- * @author Levin
- * @since 2017/12/5 0005
- */
- @Data
- @ConfigurationProperties("request.cors")
- public class CorsFilterProperties {
- private Boolean enabled;
- private String path;
- private String origin;
- private String allowedHeader;
- private String method;
- private String exposedHeader;
- @Nullable
- private Boolean allowCredentials;
- @Nullable
- private Long maxAge;
- }
application.properties配置项
我在类属性里定义的maxAge,但是application里面显示的是max-age,会自动帮做转换,如果使用maxAge属性参数也是可以取到值的(是不是spring帮做了匹配查找)。
完成以上操作,只要在SpringApplication 启动加上@EnableCorsFilter 就可以实现跨域了。
maven调用以下是快速使用方法:
- <dependency>
- <groupId>com.battcn</groupId>
- <artifactId>request-spring-boot-starter</artifactId>
- <version>1.0.8-RELEASE</version>
- </dependency>
感谢唐亚峰提供的工具类。
Spring Boot Web 自定义注解篇(注解很简单很好用)的更多相关文章
- Spring Boot Web 自定义返回值(通用)
在项目下新建common.entity包,包中包含两个文件Result数据类,ResultCode接口文件 Result.class @Data @NoArgsConstructor public c ...
- Spring Boot 2.0 教程 | @ModelAttribute 注解
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站: https://www.exception.site/springboot/spring-boot-model-attribute Spri ...
- Spring Boot 入门之基础篇(一)
原文地址:Spring Boot 入门之基础篇(一) 博客地址:http://www.extlight.com 一.前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是 ...
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- spring boot实战(第十三篇)自动配置原理分析
前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...
- Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析
前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面. 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据. { &quo ...
- Spring Boot(一):入门篇+前端访问后端
转自:Spring Boot(一):入门篇 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发 ...
- Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...
- Springboot 系列(六)Spring Boot web 开发之拦截器和三大组件
1. 拦截器 Springboot 中的 Interceptor 拦截器也就是 mvc 中的拦截器,只是省去了 xml 配置部分.并没有本质的不同,都是通过实现 HandlerInterceptor ...
随机推荐
- 计算机的Cache和Memory访问时Write-back,Write-through及write allocate的区别
计算机的存储系统采用Register,Cache,Memory和I/O的方式来构成存储系统,无疑是一个性能和经济性的妥协的产物.Cache和Memory机制是计算机硬件的基础内容,这里就不再啰嗦.下面 ...
- 第六章 MySQL 查询
查询数据表 语法: SELECT {* | <字段列表>} [ FROM <表1>, <表2>.... [ where <表达式> ] [ group ...
- 百度搜索(jsonp)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>百 ...
- 集群搭建(一)克隆虚拟机静态IP设置
[抛出问题] 当在搭建集群的时候,我们会将一个安装好相关程序的虚拟机进行克隆,克隆之后,我们会发下一些问题:就是原先的eth0 网卡不见了 原先的网卡 而克隆之后的网卡 会发现原来的网卡eth0 变为 ...
- QT5:C++实现基于multimedia的音乐播放器(二)
今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: //播放模式 void Music::musicPlayPattern() { //z=++z%3; ) { //顺序播放 pla ...
- debain 安装nodejs
apt-get update -yapt-get install -y build-essential curl curl -sL https://deb.nodesource.com/setup_8 ...
- PAT1081:Rational Sum
1081. Rational Sum (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given N ...
- urllib使用
1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=Fals ...
- CentOS7快速搭建LNMP环境
名词解释: LNMP:Linux+Nginx+MySql+PHPLAMP:LInux+Apache+MySql+PHPNginx的正确读法应该是Engine X我们使用CentOS自带的YUM来安装 ...
- 网络IO和磁盘IO详解
1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址 ...