参考 :
Springboot实现过滤器_一个风轻云淡的博客-CSDN博客_springboot 过滤器
https://blog.csdn.net/YR_112233/article/details/126525192
包
http.proxy
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>http-proxy</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<mybatis-spring-boot.version>1.3.1</mybatis-spring-boot.version>
<jackson.version>2.9.8</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>http.proxy.Application</mainClass>
<layout>ZIP</layout>
<includeSystemScope>true</includeSystemScope><!-- 把第三方jar包打进去 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中 -->
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.properties
server.port=8000
proxy.http.host=http://192.168.1.1:8001
Application.java
package http.proxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
HttpProxyFilter.java
package http.proxy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StreamUtils;
import org.springframework.web.client.RestTemplate;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
@Component
@WebFilter(urlPatterns = "/filter/*", filterName = "httpProxyFilter")
@Slf4j
public class HttpProxyFilter implements Filter {
@Value("${proxy.http.host}")
private String host;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("[ {} ] 初始化网关...", this.getClass().getSimpleName());
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
log.info("[ {} ] 接收到请求...URI:{}", this.getClass().getSimpleName(), requestURI);
if (requestURI.equals("/live")) {
chain.doFilter(request, response);
return;
}
HttpServletResponse resp = (HttpServletResponse) response;
// 请求类型
String method = req.getMethod();
HttpMethod httpMethod = HttpMethod.resolve(method);//method
// 请求头
MultiValueMap<String, String> headers = parseRequestHeader(req);//header
// 请求体
byte[] body = parseRequestBody(req);
// 封装发singhttp请求
RequestEntity requestEntity = new RequestEntity(body, headers, httpMethod, URI.create(host + requestURI));
RestTemplate restTemplate = new RestTemplate();
// 编码格式转换
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
ResponseEntity<String> result = restTemplate.exchange(requestEntity, String.class);
// 将转发请求得到的结果和响应头返回客户端
String resultBody = result.getBody();
HttpHeaders resultHeaders = result.getHeaders();
MediaType contentType = resultHeaders.getContentType();
if (contentType != null) {
resp.setContentType(contentType.toString());
}
resp.setCharacterEncoding("UTF-8");// 在getWriterz之前执行,否则不生效
PrintWriter writer = resp.getWriter();
writer.write(resultBody);
writer.flush();
}
@Override
public void destroy() {
log.info("[ {} ] 关闭网关...", this.getClass().getSimpleName());
}
/**
* request header
*
* @param request
* @return
*/
private MultiValueMap<String, String> parseRequestHeader(HttpServletRequest request) {
HttpHeaders httpHeaders = new HttpHeaders();
List<String> headerNames = Collections.list(request.getHeaderNames());
for (String headerName : headerNames) {
List<String> headerValues = Collections.list(request.getHeaders(headerName));
for (String headerValue : headerValues) {
httpHeaders.add(headerName, headerValue);
}
}
return httpHeaders;
}
/**
* request body
*
* @param request
* @return
* @throws IOException
*/
private byte[] parseRequestBody(HttpServletRequest request) throws IOException {
InputStream inputStream = request.getInputStream();
return StreamUtils.copyToByteArray(inputStream);
}
}
SystemController.java
package http.proxy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auther: liyue
* @Date: 2020/4/27 15:13
* @Description:
*/
@RestController
public class SystemController {
public final static String SUCCESS = "SUCCESS";
@RequestMapping("/live")
public String live() {
return SUCCESS;
}
}