最近接触到filter过滤器,之前都没有接触到,这次在组长大人得帮助下对filter过滤器有了一点概念,组长大人还给了一个例子,记录一下。
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean filterRegist() {
FilterRegistrationBean frBean = new FilterRegistrationBean();
//定义一个 ParamterFilter过滤器
frBean.setFilter(new ParamterFilter());
//需要拦截的地址
frBean.addUrlPatterns("/cxf/*");
//设置注册名称,若没有指定,使用bean名称
frBean.setName("WebAsscessFilterMVC");
return frBean;
}
}
@Component
public class ParamterFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if(HttpMethod.POST.equals(HttpMethod.resolve(request.getMethod()))){
//调用封装好的一个Wrapper
PostRequestWrapper postRequestWrapper = new PostRequestWrapper(request);
wirteLog(postRequestWrapper,response);
filterChain.doFilter(postRequestWrapper,response);
}else {
wirteLog(request,response);
filterChain.doFilter(request,response);
}
}
protected void wirteLog(HttpServletRequest request, HttpServletResponse response) throws IOException {
InputStream inputStream = request.getInputStream();
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buf = new byte[2048];
int len = 0;
while((len=inputStream.read(buf))>0){
result.write(buf,0,len);
}
logger.debug(result.toString());
}
}
public class PostRequestWrapper extends HttpServletRequestWrapper {
private Logger logger = LoggerFactory.getLogger(PostRequestWrapper.class);
private final byte[] bodyData;
/**
* Constructs a request object wrapping the given request.
*
* @param request The request to wrap
* @throws IllegalArgumentException if the request is null
*/
public PostRequestWrapper(HttpServletRequest request) {
super(request);
bodyData = getByteFromRequest(request);
}
/**
* 获取Body中的字符中表示
* @return
*/
public String getBodyString() {
if(bodyData != null && bodyData.length>0){
return new String(bodyData);
}
return null;
}
/**
*从Body体中获取数据并保存
* @param request
* @return
*/
protected byte[] getByteFromRequest(HttpServletRequest request){
ByteArrayOutputStream result = new ByteArrayOutputStream();
try {
//BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
byte[] buf = new byte[2048];
int len = 0;
while ((len=request.getInputStream().read(buf))>0){
result.write(buf,0,len);
}
} catch (IOException e) {
logger.error("{}",e);
}
return result.toByteArray();
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream inputStream = new ByteArrayInputStream(bodyData);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
}
这样就ok啦,就能在日志中查看到拦截信息。
知识嘛,慢慢积累,就好啦。