package com.cloudroam.common.configuration; import com.cloudroam.module.file.FileUtil; import com.cloudroam.common.interceptor.RequestLogInterceptor; import io.github.talelin.autoconfigure.interceptor.AuthorizeInterceptor; import io.github.talelin.autoconfigure.interceptor.LogInterceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.List; /** * Spring MVC 配置 * * @author * @author */ @Configuration(proxyBeanMethods = false) @Slf4j public class WebConfiguration implements WebMvcConfigurer { @Value("${auth.enabled:false}") private boolean authEnabled; @Value("${request-log.enabled:false}") private boolean requestLogEnabled; @Autowired private AuthorizeInterceptor authorizeInterceptor; @Autowired private LogInterceptor logInterceptor; @Autowired private RequestLogInterceptor requestLogInterceptor; @Value("${lin.file.store-dir:assets/}") private String dir; @Value("${lin.file.serve-path:assets/**}") private String servePath; /** * 跨域 * 注意: 跨域问题涉及安全性问题,这里提供的是最方便简单的配置,任何host和任何方法都可跨域 * 但在实际场景中,这样做,无疑很危险,所以谨慎选择开启或者关闭 * 如果切实需要,请咨询相关安全人员或者专家进行配置 */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") .allowCredentials(true) .maxAge(3600) .allowedHeaders("*") .exposedHeaders("Content-Disposition"); ; } @Override public void addInterceptors(InterceptorRegistry registry) { if (authEnabled) { //开发环境忽略签名认证 registry.addInterceptor(authorizeInterceptor) .excludePathPatterns(getDirServePath()); } if (requestLogEnabled) { registry.addInterceptor(requestLogInterceptor); } registry.addInterceptor(logInterceptor); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // classpath: or file: registry.addResourceHandler(getDirServePath()) .addResourceLocations("file:" + getAbsDir() + "/"); } /** * request parameter 转 java bean 时 snake_case 转 camelCase */ @Override public void addArgumentResolvers(List resolvers) { resolvers.add(new CustomServletModelAttributeMethodProcessor(true)); } private String getDirServePath() { // assets/** // assets/ // /usr/local/assets/ // assets return servePath; } /** * 获得文件夹的绝对路径 */ private String getAbsDir() { if (FileUtil.isAbsolute(dir)) { return dir; } String cmd = System.getProperty("user.dir"); Path path = FileSystems.getDefault().getPath(cmd, dir); return path.toAbsolutePath().toString(); } }