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<HandlerMethodArgumentResolver> 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();
|
}
|
}
|