构建一个过滤器
@Configuration
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//实现过滤器接口,重写其中的doFilter方法,通常拦截请求的内容,需要将请求参数类型进行转换
HttpServletRequest request = (HttpServletRequest) servletRequest;
//获取请求头中的内容
String cccc = request.getHeader("cccc");
String dddd = request.getHeader("dddd");
//获取cookie中的内容
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + "token");
}
//获取服务器信息
StringBuffer requestURL = request.getRequestURL();
//获取请求设备地址
String remoteAddr = request.getRemoteAddr();
//获取请求设备详情
String header = request.getHeader("User-Agent");
//获取请求内容form表单请求
Map<String, String[]> parameterMap = request.getParameterMap();
for (String s : parameterMap.keySet()) {
System.out.println(s);
}
//使用Post请求参数为json数据
MyRequestWrapper requestWrapper = new MyRequestWrapper(request);
String body = requestWrapper.getBody();
System.out.println(body);
//进行放行操作
filterChain.doFilter(requestWrapper, servletResponse);
}
}
上述过滤器中已经包含了一些常用的方法,如果我们要读取请求体中的内容,需要构建读取的类,因为请求体中的内容需要使用流进行读取,而且只能调用一次,如果在过滤器中进行调用,则接口会接收不到数据,出现异常情况,所以使用辅助类将请求体中的内容复制一份,继续传递下去
public class MyRequestWrapper extends HttpServletRequestWrapper {
private byte[] body;
public MyRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
if(ServletFileUpload.isMultipartContent(request)){
return;
}
StringBuilder sb = new StringBuilder();
String line;
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
String body = sb.toString();
this.body = body.getBytes(StandardCharsets.UTF_8);
}
public String getBody() {
return new String(this.body , StandardCharsets.UTF_8) ;
}
@Override
public ServletInputStream getInputStream() {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read(){
return bais.read();
}
};
}
@Override
public BufferedReader getReader(){
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
}