本文共 3980 字,大约阅读时间需要 13 分钟。
首先来讲一下代理设计模式
假设有这样一个卖东西的接口Salepublic 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集合Listlist=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/