SpringBoot 配置类整理
- 一、跨域请求后端解决方案
- 二、MVC 使用 Java 编码解决静态文件不加载
- 三、封装统一返回结果集时,解决返回 null 值问题
- 四、SpringBoot 整合 swagger2 配置类编写
- 五、MVC 拦截器配置
- 六、MVC 视图控制器 (ViewController)
如下配置类不需要特意去记忆
一、跨域请求后端解决方案
代码语言:javascript复制package cn.gorit.config;
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 CrosConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET","POST","HEAD","PUT","DELETE")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
// 如果同时配置了拦截器,上面的方法就会失效,可以使用下面的方式解决跨域问题
/**
* 问题:配置 JWT ,使用拦截器出现跨域问题
* 跨越配置
* 改用过滤器CorsFilter 来配置跨域,由于Filter的位置是在Interceptor之前的,问题得到解决:
*/
@Autowired
JWTInterceptor jwtInterceptor;
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
// 设置允许跨域请求的域名
config.addAllowedOrigin("*");
// 是否允许证书 不再默认开启
config.setAllowCredentials(true);
// 设置允许的方法
config.addAllowedMethod("*");
// 允许任何头
config.addAllowedHeader("*");
config.addExposedHeader("token");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}
}
二、MVC 使用 Java 编码解决静态文件不加载
在 resources 目录下的 static 的静态文件给外部访问
代码语言:javascript复制package cn.gorit.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
}
三、封装统一返回结果集时,解决返回 null 值问题
当我们想要返回 json 格式数据的时候,难免会出现 null 值得情况,因此加入如下配置即可解决问题,使用默认的 jackson 解决问题。
代码语言:javascript复制import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;
/**
* 使用 SpringBoot 默认的 jackjson 解决 统一结果集为空的情况
* */
@Configuration
public class NullValueConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, IOException {
jsonGenerator.writeString("");
}
});
return objectMapper;
}
}
四、SpringBoot 整合 swagger2 配置类编写
SpringBoot 使用 swagger2 需在相对应的 实体类 和 Controller 中配置相对应的注解,就可以在根路径下的 swagger-ui.html 看到生成的在线文档
代码语言:javascript复制package cn.gorit.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @Author CondingGorit
* @Date 2020年7月9日15:17:34
* http://localhost/swagger-ui.htm
* */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
// 指定构建 api 文档的详细信息放放:apiInfo()
.apiInfo(apiInfo())
.enable(true)
.select()
// 指定要生成的 API 接口的包路径,这里把 Controller 作为包路径,生成 Controller 中的所有接口
.apis(RequestHandlerSelectors.basePackage("cn.gorit.controller"))
.paths(PathSelectors.any())
.build();
}
/**
* 构建 API 文档的详细信息
* @Return
* */
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 设置页面标题
.title("SpringBoot集成 Swagger2 接口总览")
// 设置接口描述
.description("和 Gorit 学习 SpringBoot")
// 设置联系方式
.contact("Gorit: gorit@qq.com")
// 设置版本
.version("1.0")
// 构建
.build();
}
}
效果图
五、MVC 拦截器配置
代码语言:javascript复制package cn.gorit.config;
import cn.gorit.interceptors.JWTInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器的配置类
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 这里添加自定义的拦截器
registry.addInterceptor(new JWTInterceptor())
.addPathPatterns("/**") // 拦截的接口
.excludePathPatterns("/user/**"); // 不拦截的接口
}
}
六、MVC 视图控制器 (ViewController)
- 在 pom.xml 中添加 thymeleaf 依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
- 在 templates 目录下添加 index.html、login.html
- 添加配置
package com.example.config;
import com.example.interceptor.TestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 拦截器配置访问路径, 配置多个访问的路径
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/idx")
.setViewName("index.html");
registry.addViewController("/signin")
.setViewName("login.html");
}
}
4. 然后访问指定的路径就可以显示对应的数据