前言
继续学习JavaWeb,学到Filter过滤器和Listener监听器。
Filter 概念
过滤器是我们JavaWeb的三大组件之一,另外两个是Servlet、Listener
当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
作用一般用于完成通过的操作。如:登录验证、统一编码处理、敏感字符过滤
入门编写过滤器的步骤:
- 定义一个类,实现接口Filter
- 复写方法
- 配置拦截路径
- web.xml
- 注解
创建一个java文件,使其继承于Filter(注意对应包是javax.servlet),其中doFilter方法就是对请求响应的拦截:
//注意,Filter所属包是:javax.servlet
@WebFilter("
Country proxy_cn = (Country)Proxy.newProxyInstance(cn.getClass().getClassLoader(),
cn.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("invoke方法执行了");
//调用真实对象执行该方法
method.invoke(cn);
return null;
}
});
//2.调用方法
proxy_cn.show();
}
}
如同我注释上面写的一样,Proxy.newProxyInstance方法需要三个参数:
- 类加载器:得到真实对象 getClass().getClassLoader()
- 接口数组:确保真实对象和代理对象同样的接口 getClass().getInterfaces()
- 处理器:InvocationHandler(),匿名内部类来实现
学英语:invocation:求助、调用、启用
得到的代理对象调用方法其实是调用了InvocationHandler中的方法invoke,我们在invoke中实现对方法的执行以及其他功能。
invoke方法参数:
- proxy:代理对象
- method:代理对象调用的方法被封装为的对象
- args:代理对象调用方法时,传递的实际参数
这样,我们就可以在invoke中进行各种的增强处理。
过滤敏感词了解了动态代理,我们来实现过滤敏感词汇。
在src目录下创建一个txt文件,每行写一个敏感词,然后创建我们的Filter文件,内容如下:
@WebFilter("
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ContextServlet对象被创建了!");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ContextServlet对象被销毁了!");
}
}
然后我们在WEB-INF下的web.xml中进行配置:
pers.luoluo.web.listener.ContextLoaderListener
这样,我们启动项目和关闭项目(正常关闭),就会分别打印信息。
用途示例那请问这监听器有什么用呢?其实这种类似“生命周期方法”,主要的用处就是进行一些资源的初始化。
我们来举个例子,来加载某个配置文件进入内存,例如在src目录下存在文件applicationContext.xml,然后在web.xml中有设置参数:
contextConfigLocation
/WEB-INF/classes/applicationContext.xml
这个参数键值对可以通过ServletContext访问。
故我们在监听器中,可以通过servletContextEvent得到ServletContext
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//加载资源文件
//1.获取ServletContext对象
ServletContext servletContext=servletContextEvent.getServletContext();
//2.加载资源文件
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
//3.获取真实路径
String realPath = servletContext.getRealPath(contextConfigLocation);
//4.加载进内存
try {
FileInputStream fls=new FileInputStream(realPath);
System.out.println(fls);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("ContextServlet对象被创建了!");
}
当我们启动项目的时候,打印:
java.io.FileInputStream@28ae693f
即说明文件流被成功创建,可以读取文件信息。
商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢



