博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb中filter实现敏感词过滤的一个小案例
阅读量:3898 次
发布时间:2019-05-23

本文共 3980 字,大约阅读时间需要 13 分钟。

首先来讲一下代理设计模式

假设有这样一个卖东西的接口Sale

public interface Sale {
String sale(double money);}

然后有一个该接口的实现类 专门卖外星人笔记本的类Alienware

public class Alienware implements Sale {
@Override public String sale(double money) {
System.out.println("花"+money+"元买了一台外星人"); return "外星人笔记本"; }}

然后一个测试类Test 在主方法中用以下代码测试:

System.out.println("you get:"+alienware.sale(8000));

得到输出:

花8000.0元买了一台外星人
you get:外星人笔记本

生活中一般我们都是通过代理来购买商品的,创建一个代理:

其中生成代理的语法为:
Proxy.newProxyInstance(真实类.getClass().getClassLoader(),真实类.getClass.getInterfaces,new InvocationHandler(){//增强内容})
真实类在本例中就是卖外星人笔记本的原厂商,接受该返回值的store就是代理类的实例对象

Sale store = (Sale)Proxy.newProxyInstance(alienware.getClass().getClassLoader(), alienware.getClass().getInterfaces(), new InvocationHandler() {
@Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//如果是sale方法则增强该方法 if(method.getName().equals("sale")){
double money=(double)objects[0]*0.9; //增强返回值 return (String)method.invoke(alienware, money)+"鼠标垫"; }else {
//否则返回原方法 return method.invoke(alienware,objects); } } });

然后用以下代码测试:

String s = store.sale(8000);System.out.println("you get:"+s);

得到结果:

花7200.0元买了一台外星人
you get:外星人笔记本鼠标垫

然后接下来讲fiter实现敏感词过滤的小案例

他的原理就是通过代理增强了request中的getParameter方法
将原先获得到的信息进行处理再次提交
首先创建一个filter过滤器类
其中doFilter方法的代码如下;

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//代理 ServletRequest newReq=(ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//如果是getParamter方法则增强 if(method.getName().equals("getParameter")){
//获取原有数据 String receiveStr= (String) method.invoke(req, objects); //遍历list集合,该集合存储了敏感词 for (String s : list) {
//若包含敏感词则替换 if(receiveStr.contains(s)){
receiveStr=receiveStr.replaceAll(s,"**"); } } //返回处理后的字符串 return receiveStr; } //否则返回原有的servletrequst对象 return method.invoke(req,objects); } }); //放行 chain.doFilter(newReq,resp); }

init中的代码:

//创建一个list集合List
list=new ArrayList<>(); public void init(FilterConfig config) throws ServletException {
try {
//获取敏感字符的真实路径 ServletContext servletContext = config.getServletContext(); String contextPath = servletContext.getRealPath("/WEB-INF/classes/word.txt"); //建立一个输入流 BufferedReader bufferedReader = new BufferedReader(new FileReader(contextPath)); String line; //不为空则写入list集合 while ((line = bufferedReader.readLine()) != null) {
list.add(line); } bufferedReader.close(); }catch (Exception e){
e.printStackTrace(); } }

最后写一个测试类的servlet:

@WebServlet("/test")public class test extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name"); String word = request.getParameter("word"); response.getWriter().write(name+":"+word); }}

然后运行tomcat服务器,在servlet地址后加上?name=xxxx&word=敏感词就可以在网页看到过滤后的输出了

转载地址:http://eqyen.baihongyu.com/

你可能感兴趣的文章
WebKit之HTMLConstructionSite类组成
查看>>
Linux之so加载原理分析
查看>>
C之基于signal信号的交互式的测试功能模块(触发时机)
查看>>
Linux之libevent的编译&测试
查看>>
Linux之kc.cfg文件参数详解
查看>>
MySql之简单SQL用法整理
查看>>
PHP之thinkphp的数据库操作代码段汇总
查看>>
Linux之tcpdump用法汇总整理
查看>>
Linux之tcp的结构分析
查看>>
WebKit之WebSocket模块的代码层初步分析
查看>>
WIFI之Agent调度关系
查看>>
WIFI之升级协议列表
查看>>
MCU之STM32可用硬件(外部接口)一览表
查看>>
MySql之设备管理的数据表设计列表
查看>>
WIFI之系统启动的脚本配置
查看>>
Python之服务器模块设计学习
查看>>
WIFI之3GControl模块调度草图
查看>>
WIFI之系统部署环境
查看>>
C++之UML关系说明图
查看>>
网络之Snmp的学习总结
查看>>