在Java Web开发中,Filter作为Servlet规范的拦截器,能够对请求进行预处理和响应后处理。本文将深入探讨如何使用Filter修改HTTP请求,并提供实际示例。
一、Filter修改请求原理
通过封装HttpServletRequestWrapper,可以重写getParameter()、getInputStream()等方法实现对查询参数、表单数据和JSON请求体的修改。这种技术常用于:
- 请求参数过滤和清洗
- 敏感词替换
- 数据格式转换
- 安全攻击防护
二、实战示例:修改请求参数
// 自定义请求包装器
public class ModifiedRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> parameterMap;
public ModifiedRequestWrapper(HttpServletRequest request) {
super(request);
parameterMap = new HashMap<>(request.getParameterMap());
}
public void setParameter(String key, String value) {
parameterMap.put(key, new String[]{value});
}
@Override
public String getParameter(String name) {
String[] values = parameterMap.get(name);
return values != null ? values[0] : null;
}
}
// 过滤器实现
@WebFilter("/*")
public class ParamFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
ModifiedRequestWrapper wrapper = new ModifiedRequestWrapper((HttpServletRequest) request);
wrapper.setParameter("modified", "true"); // 添加新参数
chain.doFilter(wrapper, response);
}
}
三、进阶示例:修改JSON请求体
public class JsonRequestWrapper extends HttpServletRequestWrapper {
private String body;
public JsonRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
body = IOUtils.toString(request.getInputStream(),
request.getCharacterEncoding());
// 解析并修改JSON内容
JSONObject json = new JSONObject(body);
json.put("injectedField", "value");
body = json.toString();
}
@Override
public ServletInputStream getInputStream() {
ByteArrayInputStream bios = new ByteArrayInputStream(body.getBytes());
return new ServletInputStream() {
// 实现抽象方法
};
}
}
四、注意事项
- 线程安全:Filter实例默认单例,避免使用实例变量
- 性能影响:请求体读取会增加内存消耗,大数据量需谨慎
- 执行顺序:通过@WebFilter的order属性或web.xml控制过滤器顺序
通过合理运用Filter修改请求,可以实现统一的数据处理层,为Web应用提供强大的请求处理能力。

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



