需求
已部署在内网环境下的项目,开放了外网映射。
现在希望将 资源访问与接口访问请求,分开进行过滤。
依赖包
<!-- boot web 基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- boot tomcat 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!-- commons-lang3 工具包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
端口添加
配置文件
server.port=8081
server.request=8082
组件类
import org.apache.catalina.connector.Connector;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
* tomcat 配置类
*/
@Configuration
public class TomcatConfig {
@Value("${server.request}")
private String additional;
@Value("${server.port}")
private String serverPort;
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
Connector[] additionalConnectors = this.additionalConnector();
if (additionalConnectors != null && additionalConnectors.length > 0) {
tomcat.addAdditionalTomcatConnectors(additionalConnectors);
}
return tomcat;
}
@Bean// boot1.58以后
public ServletWebServerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
Connector[] additionalConnectors = this.additionalConnector();
if (additionalConnectors != null && additionalConnectors.length > 0) {
tomcat.addAdditionalTomcatConnectors(additionalConnectors);
}
return tomcat;
}
private Connector[] additionalConnector() {
if (StringUtils.isBlank(this.additional)) {
return null;
}
if (StringUtils.isBlank(this.serverPort)) {
return null;
}
String[] ports = this.additional.split(",");
List<Connector> result = new ArrayList<>();
for (String port : ports) {
if(serverPort.equals(port)) {
continue;
}
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(Integer.valueOf(port));
result.add(connector);
}
return result.toArray(new Connector[] {});
}
}
过滤器
在 webMvcConfig配置中添加过滤器。
/**
*需要过滤的url 也可以适用懒加载,
*用静态代码快 static{} 从配置中读取
*/
public static String[] externalUrls= {
"/userAccess",
"/login"
};
/**
*自定义过滤器配置类
*/
@Bean
public FilterRegistrationBean PortFilter() {
final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
Set<String> exclusionsUrls = new HashSet<>();
exclusionsUrls.addAll(Arrays.asList(externalUrls));
//自定义过滤器 PortFilter 将 区分的url、端口配置
//port 与 serverport需要值校验,这里省略
registrationBean.setFilter(new PortFilter(exclusionsUrls,additional,serverPort));
//要拦截的域名,自定义配置。
registrationBean.addUrlPatterns("/*");
//过滤器顺序,按项目实际情况
registrationBean.setOrder(2);
return registrationBean;
}