您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
14_Filter_案例2_过滤敏感词汇_实现(动态代理设计模式的应用)
发布时间:2022-09-30 11:21:17编辑:雪饮阅读()
在src下建立用来过滤敏感词的词汇库
敏感词汇.txt:
笨蛋
坏蛋
建立被访问的servlet,假定在url中传参敏感词汇的方式来访问,则该被访问的servlet实现如:
package package3;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ServletTest")
public class ServletTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet被执行");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(request.getParameter("word"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
为被访问的servlet添加过滤器,在过滤器上应用动态代理设计模式(简化版)实现敏感词汇过滤实现如:
package package3;
import org.omg.CORBA.portable.InvokeHandler;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
@WebFilter("/*")
public class Filter17 implements Filter {
public void destroy() {
}
//敏感词汇集合,放全局变量,为了防止每次都从io中读取敏感词汇造成的io消耗(cpu消耗)
private List<String> list=new ArrayList<String>();
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filter被执行");
final ServletRequest freq=req;
ServletRequest proxy_req=(ServletRequest) Proxy.newProxyInstance(freq.getClass().getClassLoader(),freq.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断是获取请求参数的方法就将获取的参数过滤下敏感词汇
String value=null;
System.out.println("method_name:"+method.getName());
if(method.getName().equals("getParameter")){
//相当于执行了request.getParameter("xxx")
value=(String) method.invoke(freq,args);
System.out.println("过滤前的值:"+value);
if(value!=null){
for(String str:list){
if(value.contains(str)){
value=value.replaceAll(str,"***");
}
}
}
}
else{
//请求所关联的其它java方法,像是isAsyncSupported就直接原样执行
return method.invoke(freq,args);
}
System.out.println("过滤之后的值:"+value);
return value;
}
});
//过滤后放行
chain.doFilter(proxy_req, resp);
}
//初始化时候就从io中拿到敏感词汇集合
public void init(FilterConfig config) throws ServletException {
try{
//获取文件真实路径
ServletContext servletContext=config.getServletContext();
//src下面的文件最终都会部署到WEB-INF/classes下面
String realPath=servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
//直接FileReader可能会导致中文路径时候抛出java.io.FileNotFoundException异常
//BufferedReader br=new BufferedReader(new FileReader(realPath));
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(realPath)),"UTF-8");
BufferedReader br=new BufferedReader(isr);
String line=null;
while((line=br.readLine())!=null){
list.add(line);
}
br.close();
System.out.println("list:"+list);
}
catch(Exception e){
e.printStackTrace();
}
}
}
过滤敏感词汇测试
访问url如:
http://localhost:8080/SensitiveWordFilter2_war_exploded/ServletTest?word=笨蛋
页面返回有“***”就代表测试通过
注意:
相关编码这里都统一使用utf-8,涉及到相关编写的文件的编码和文件内容的编码,以及部署到tomcat上的编码。
相关编码设置参考:
(1)File=>Settings…=>Editor=>File Encodings
(2)Run=>Edit Configurations...=>Tomcat Server(没有就新增)=>Tomcat8.5.82(具体根据自己配置的)=>右侧=>Server=>VM options(可以配置如:-Dfile.encoding=UTF-8)
第二个设置的地方有时候不配置,像是servlet和filter由于是要部署到tomcat上运行的,所以后面运行过程中可以看到output控制台中若有中文会乱码,即便已经配置了相关文件的内容编码和文件编码以及第一个配置处的编码。
关键字词:Filter,案例2,过滤敏感词汇,实现,动态代理设计模式的应用
上一篇:13_动态代理2_增强方法(invoke的调用与方法入参与方法体和方法出参增强)
下一篇:16_Listener_ServletContextListener使用(servlet容器创建时加载相关配置文件)
相关文章
- 12_动态代理1_基本实现步骤(动态代理设计模式)
- 10_Filter_案例1_登录验证_代码实现(过滤器中过滤请求
- 8_Filter_细节_过滤器链(多个过滤器)(相同拦截规则时候
- 7_Filter_细节_过滤器拦截方式配置(区分拦截浏览器直接
- 6_Filter_细节_过滤器拦截路径配置(servlet拦截与目录
- 5_Filter_细节_执行流程&生命周期(filter创建模板与生
- 4_Filter_细节_web.xml配置方式
- 3_Filter_快速入门(类似php中常用的中间件)
- 19_JSTL_练习(实现foreach遍历表格并隔行换色)
- 24_案例_验证码_代码实现(equalsIgnoreCase在比较字符