首先来讲一下代理设计模式
假设有这样一个卖东西的接口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<String> 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=敏感词就可以在网页看到过滤后的输出了