自定义几个过滤器类:
order是过滤器执行的顺序,越小越早执行
@Order(1)
@WebFilter(urlPatterns = "/*")
public class LogFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String uuid = UUIDGenerator.getUUID();
response = new ResponseWrapper(uuid, response);
logRequest(request, uuid);
try {
filterChain.doFilter(request, response);
} finally {
logResponse((ResponseWrapper) response);
}
}
/**
* 打印输出流所需内部类
*/
class ResponseWrapper extends HttpServletResponseWrapper {
private final ByteArrayOutputStream bos = new ByteArrayOutputStream();
private PrintWriter writer = new PrintWriter(bos);
private String id;
public ResponseWrapper(String requestId, HttpServletResponse response) {
super(response);
this.id = requestId;
}
@Override
public ServletResponse getResponse() {
return this;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
private TeeOutputStream tee = new TeeOutputStream(ResponseWrapper.super.getOutputStream(), bos);
@Override
public void write(int b) throws IOException {
tee.write(b);
}
};
}
@Override
public PrintWriter getWriter() throws IOException {
return new TeePrintWriter(super.getWriter(), writer);
}
public byte[] toByteArray() {
return bos.toByteArray();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
class TeePrintWriter extends PrintWriter {
PrintWriter branch;
public TeePrintWriter(PrintWriter main, PrintWriter branch) {
super(main, true);
this.branch = branch;
}
public void write(char buf[], int off, int len) {
super.write(buf, off, len);
super.flush();
branch.write(buf, off, len);
branch.flush();
}
public void write(String s, int off, int len) {
super.write(s, off, len);
super.flush();
branch.write(s, off, len);
branch.flush();
}
public void write(int c) {
super.write(c);
super.flush();
branch.write(c);
branch.flush();
}
public void flush() {
super.flush();
branch.flush();
}
}
}
}
配置类:
我们可以新增配置类, 加上@Configuration注解, 这样SpringBoot在启动的时候, 会自动帮你装载这个类里面的Bean。
这个Bean的类型是org.springframework.boot.web.servlet.FilterRegistrationBean
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean filter1() {
return new FilterRegistrationBean(
(a1,b1,c1) -> {
c1.doFilter(a1,b1);
}
) {{
setOrder(1);
setName("filter1");
setEnabled(true);
setUrlPatterns(Arrays.asList("/path1/*"));
}};
}
@Bean
public FilterRegistrationBean filter2() {
return new FilterRegistrationBean(
(a2,b2,c2) -> {
c2.doFilter(a2,b2);
}
){{
setOrder(2);
setName("filter2");
setEnabled(true);
setUrlPatterns(Arrays.asList("/path2/*"));
}};
}
}