Filter的使用(对请求和响应数据进行替换)

本文详细介绍了如何在web.xml中配置过滤器,包括GuestbookFilter的编写,用于替换请求中的特殊字符和响应中的不雅字句。通过使用MyRequestWrapper和MyResponseWrapper类,实现了对请求参数和响应数据的过滤功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、过滤器配置web.xml

<filter>
<filter-name>GuestbookFilter</filter-name>
<filter-class>test.GuestbookFilter</filter-class>
<init-param>
<!-- 配置不雅字句内容的替换文件,内容如:fuck=****,每行一句 -->
<param-name>word_file</param-name>
<param-value>/WEB-INF/word.txt</param-value>
</init-param>
</filter>

<filter-mapping>
<!-- 存储过滤 -->
<filter-name>GuestbookFilter</filter-name>
<url-pattern>/process.jsp</url-pattern>
</filter-mapping>

<filter-mapping>
<!-- 显示过滤 -->
<filter-name>GuestbookFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

二、过滤器编写GuestbookFilter.java,利用MyRequestWrapper和MyResponseWrapper来替换请求中的特殊字符和响应中的不雅字句

package test;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class GuestbookFilter implements Filter
{
private static final String WORD_FILE="word_file";
HashMap<String,String> hm=new HashMap<String,String>();

/**
* 在init()方法中,读取保存了不雅字句和替换内容的文件,
* 并以不雅字句作为key,替换内容作为value,保存到Hashmap对象中。
*/
public void init(FilterConfig filterConfig) throws ServletException{
String configPath=filterConfig.getInitParameter(WORD_FILE);
ServletContext sc=filterConfig.getServletContext();
String filePath=sc.getRealPath(configPath);
try{
FileReader fr=new FileReader(filePath);
BufferedReader br=new BufferedReader(fr);
String line;
while(null!=(line=br.readLine())){
String[] strTemp=line.split("=");
hm.put(strTemp[0],strTemp[1]);
}
}catch(IOException ie){
throw new ServletException("读取过滤文件信息出错!");
}
}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
throws IOException, ServletException{
HttpServletRequest httpReq=(HttpServletRequest)request;
HttpServletResponse httpResp=(HttpServletResponse)response;
//得到请求和响应对象的封装类对象。
MyRequestWrapper reqWrapper=new MyRequestWrapper(httpReq);
MyResponseWrapper respWrapper=new MyResponseWrapper(httpResp);
chain.doFilter(reqWrapper,respWrapper);
String content = new String(respWrapper.toByteArray());
String result=replaceText(content);
httpResp.setContentType("text/html;charset=GB2312");
PrintWriter out = httpResp.getWriter();
out.println(result);
out.close();
}

/**
* 对内容中的不雅字句进行过滤。
*/
public String replaceText(String content) throws IOException{
StringBuffer sb=new StringBuffer(content);
Set keys=hm.keySet();
Iterator it=keys.iterator();
while(it.hasNext()){
String key=(String)it.next();
int index=sb.indexOf(key);
if(-1!=index){
sb.replace(index,index+key.length(),(String)hm.get(key));
}
}
return sb.toString();
}
public void destroy(){}
}

三、请求参数过滤MyRequestWrapper.java,替换请求中的特殊字符

package test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public final class MyRequestWrapper extends HttpServletRequestWrapper{
public MyRequestWrapper(HttpServletRequest request){
super(request);
}
/**
* 覆盖基类的getParameter()方法,对请求参数的值进行过滤。
*/
public java.lang.String getParameter(java.lang.String name){
String value=super.getParameter(name);
if(null!=value)
return toHtml(value.trim());
else
return null;
}
/**
* 将特殊字符转换为对应的实体引用或字符引用。
*/
private String toHtml(String str){
if(str==null)
return null;
StringBuffer sb = new StringBuffer();
int len = str.length();
for (int i = 0; i < len; i++){
char c = str.charAt(i);
switch(c){
case ' ':sb.append("&nbsp;");break;
case '\n':sb.append("<br>");break;
case '\r':break;
case '\'':sb.append("&#39;");break;
case '<': sb.append("&lt;");break;
case '>':sb.append("&gt;");break;
case '&':sb.append("&amp;");break;
case '"':sb.append("&#34;");break;
case '\\':sb.append("&#92;");break;
default:sb.append(c);
}
}
return sb.toString();
}
}
四、对响应数据进行过滤MyResponseWrapper.java,替换响应中的不雅字句,用ByteArrayServletOutputStream类的对象替换Web容器中的对象

package test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class MyResponseWrapper extends HttpServletResponseWrapper{
private ByteArrayOutputStream baos;
private ByteArrayServletOutputStream basos;
private PrintWriter pw;
public MyResponseWrapper(HttpServletResponse response){
super(response);
//创建ByteArrayOutputStream对象。
baos=new ByteArrayOutputStream();
//用ByteArrayOutputStream对象作为参数,
//构造ByteArrayServletOutputStream对象。
basos=new ByteArrayServletOutputStream(baos);
//用ByteArrayOutputStream对象作为参数,
//构造PrintWriter对象。
pw=new PrintWriter(baos);
}
public PrintWriter getWriter(){
return pw;
}
public ServletOutputStream getOutputStream(){
return basos;
}
/**
* 以字节数组的形式返回输出流缓冲区中的内容。
*/
public byte[] toByteArray(){
return baos.toByteArray();
}
}

五、替换Web容器中的ServletOutputStream对象ByteArrayServletOutputStream.java

package test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletOutputStream;

//用该类的对象替换HttpServletResponse.getOutputStream()方法返回的ServletOutputStream对象
public class ByteArrayServletOutputStream extends ServletOutputStream{
ByteArrayOutputStream baos;
ByteArrayServletOutputStream(ByteArrayOutputStream baos){
this.baos = baos;
}
public void write(int data) throws IOException{
baos.write(data);
}
}

在Spring Cloud Gateway中,要拦截WebSocket(ws)请求并对入参响应参数进行修改,你可以通过定义一个WebFilter并将其添加到网关路由配置中。这里是一个简单的步骤说明: 1. **创建WebFilter**: 首先,你需要创建一个实现了`ServerWebExchangeFilterFunction`的自定义过滤器。这个接口允许你在处理HTTP请求响应链路上添加功能。例如: ```java import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterFunction; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; public class WebSocketFilter implements GatewayFilterFunction { @Override public GatewayFilter apply(String id) { return new GatewayFilter() { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 在这里添加对WS请求的拦截逻辑 return chain.filter(exchange) .doOnNext(response -> { // 修改响应参数 response交换操作... }) .doOnError(error -> handleException(error, exchange)) .doFinally(signalType -> { // 关闭连接或其他清理工作 }); } private void handleException(Throwable exception, ServerWebExchange exchange) { // 处理错误情况... } }; } } ``` 2. **添加过滤器到网关配置**: 在你的`application.yml`或`application.properties`文件中,找到`spring.cloud.gateway.filters`配置,并添加你的自定义过滤器ID: ```yaml spring: cloud: gateway: filters: - Id.of.your.WebSocketFilter: "" ``` 这里的`Id.of.your.WebSocketFilter`需要替换为你在第一步中定义的过滤器的实际名称。 3. **处理入参**: 如果你想修改入参,通常是在`filter`方法内部解析请求体并进行相应处理。注意,WebSocket请求的入参可能存储在`exchange.getAttributes().get(StandardRequestAttributes.FORM_DATA)`等地方。 4. **应用测试**: 配置完成后,重启你的服务,所有经过Spring Cloud Gateway路由的ws请求都将受到新添加的过滤器的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值