//配置过滤器
import com.paas.filter.InterfaceFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebFileterConfig {
/**
* 配置过滤器
*/
@Bean
public FilterRegistrationBean filterRegistration() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new InterfaceFilter());
//设置过滤器URL
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(Integer.MAX_VALUE - 10);
return registrationBean;
}
}
//包装类
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;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class HttpRequestBodyAndParamsWrapper extends HttpServletRequestWrapper {
private String body;
private final Map<String , String[]> params = new HashMap<String, String[]>();
public HttpRequestBodyAndParamsWrapper(HttpServletRequest request) throws IOException {
super(request);
this.params.putAll(request.getParameterMap());
}
public HttpRequestBodyAndParamsWrapper(HttpServletRequest request, String context) {
super(request);
body = context;
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
ServletInputStream servletInputStream = new ServletInputStream() {
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
}
};
return servletInputStream;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
/**
* 添加参数到map中
* @param extraParams
*/
public void setParameterMap(Map<String, Object> extraParams) {
for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
setParameter(entry.getKey(), entry.getValue());
}
}
/**
* 添加参数到map中
* @param name
* @param value
*/
public void setParameter(String name, Object value) {
if (value != null) {
System.out.println(value);
if (value instanceof String[]) {
params.put(name, (String[]) value);
} else if (value instanceof String) {
params.put(name, new String[]{(String) value});
} else {
params.put(name, new String[]{String.valueOf(value)});
}
}
}
/**
* 重写getParameter,代表参数从当前类中的map获取
* @param name
* @return
*/
@Override
public String getParameter(String name) {
String[]values = params.get(name);
if(values == null || values.length == 0) {
return null;
}
return values[0];
}
/**
* 重写getParameterValues方法,从当前类的 map中取值
* @param name
* @return
*/
@Override
public String[] getParameterValues(String name) {
return params.get(name);
}
}
//过滤器
package com.paas.filter;
import com.paas.common.security.RSAUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@Slf4j
public class InterfaceFilter implements Filter {
@Override
public void destroy() {
log.info("过滤器执行结束");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 获取请求地址
String url = ((HttpServletRequest) request).getRequestURI().substring(((HttpServletRequest) request).getContextPath().length());
log.info("------------------请求地址,{}---------------",url);
HttpRequestBodyAndParamsWrapper httpRequestBodyAndParamsWrapper = new HttpRequestBodyAndParamsWrapper(
(HttpServletRequest) request);
try {
// 根据不同的请求方法类型 做 不同的参数处理业务
if (HttpMethod.POST.matches(httpServletRequest.getMethod())) {
String body = getBody(httpServletRequest);
//处理加密解密
httpServletRequest = new HttpRequestBodyAndParamsWrapper(httpServletRequest, newBody);
chain.doFilter(httpServletRequest,response);
}
if (HttpMethod.GET.matches(httpServletRequest.getMethod())) {
//修改参数值、
请求参数
//httpRequestBodyAndParamsWrapper.setParameter("","");
chain.doFilter(httpRequestBodyAndParamsWrapper, response);
}
chain.doFilter(httpServletRequest,response);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取Request的body数据
private String getBody(ServletRequest request) {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return stringBuilder.toString();
}
}
本文介绍如何在Spring Boot应用中配置自定义过滤器,包括实现请求参数处理及读取请求体等功能。通过示例代码展示了过滤器的注册过程,并介绍了如何根据不同HTTP方法处理请求。
5336

被折叠的 条评论
为什么被折叠?



