自从 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>
感谢唐亚峰提供的工具类.
来源: https://www.cnblogs.com/jay-wu/p/10615267.html