遇到的問題
1. 如何配置多個過濾器
2. 如何解決調用順序問題
3. 如何解決body值取了後,控制層爲null
4. 如何通過@value動態讀取nacos配置文件值
5. 響應數據到頁面
package com.ess.fourier.trace.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
@Configuration
public class ComponentFilterOrderConfig {
@Bean
@RefreshScope
public Filter sIDCheckFilter(){
return new FourierSIDCheckFilter();
}
@RefreshScope
@Bean
public Filter signCheckFilter(){
return new FourierSignCheckFilter();
}
@Bean
public FilterRegistrationBean filterRegistrationBean1() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(sIDCheckFilter());
filterRegistrationBean.addUrlPatterns("/new/entry");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean2() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(signCheckFilter());
filterRegistrationBean.addUrlPatterns("/new/entry");
filterRegistrationBean.setOrder(2);
return filterRegistrationBean;
}
}
package com.ess.fourier.trace.filter;
import org.apache.commons.io.IOUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
private byte[] body;
private BufferedReader reader;
private ServletInputStream inputStream;
public ContentCachingRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
loadBody(request);
}
private void loadBody(HttpServletRequest request) throws IOException {
body = IOUtils.toByteArray(request.getInputStream());
inputStream = new RequestCachingInputStream(body);
}
public byte[] getBody() {
return body;
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (inputStream != null) {
return inputStream;
}
return super.getInputStream();
}
@Override
public BufferedReader getReader() throws IOException {
if (reader == null) {
reader = new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding()));
}
return reader;
}
private static class RequestCachingInputStream extends ServletInputStream {
private final ByteArrayInputStream inputStream;
public RequestCachingInputStream(byte[] bytes) {
inputStream = new ByteArrayInputStream(bytes);
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public boolean isFinished() {
return inputStream.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readlistener) {
}
}
}
package com.ess.fourier.trace.filter;
import com.ess.fourier.commons.constant.FourierRedisKeyConstants;
import com.ess.framework.api.response.ApiResponse;
import com.ess.framework.commons.response.RequestCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
@RefreshScope
public class FourierSIDCheckFilter implements Filter {
@Value("${xxxxxxxxxx}")
private boolean validSid = true;
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
package com.ess.fourier.trace.filter;
import com.ess.framework.api.response.ApiResponse;
import com.ess.framework.commons.response.RequestCode;
import com.ess.framework.commons.utils.SignUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@Component
@RefreshScope
public class FourierSignCheckFilter implements Filter {
@Value("${validSign }")
private boolean validSign = true;
@Value("${xxccc:}")
private String md5Salt = "";
@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 sign = request.getHeader("sign");
String sid = request.getHeader("sid");
ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper((HttpServletRequest) request);
String bodyStr = new String(requestWrapper.getBody(), request.getCharacterEncoding());
log.info("filter request body is {}", bodyStr);
filterChain.doFilter(requestWrapper, servletResponse);
}
@Override
public void destroy() {
}
}
package com.ess.fourier.trace.filter;
import com.alibaba.fastjson.JSON;
import com.ess.framework.api.response.ApiResponse;
import org.springframework.http.MediaType;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseWrite {
public static void write(HttpServletResponse response, ApiResponse<String> responseMap) throws IOException, ServletException {
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
writer.write(JSON.toJSONString(responseMap));
writer.flush();
writer.close();
}
}