Filter过滤器
Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、 Listener
过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件
过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求 进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等
使用方式
自定义类实现Filter接口并重写doFilter方法,通过是否调用chain.doFilter(request,response)来进行控制,调用时才会把过滤器的运行交给下一步
public class LoginFilter implements Filter {
@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if () { ... } else {
chain.doFilter(servletRequest, servletResponse) }
}
}
在web.xml文件中配置过滤器
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.test.filter.LoginFilter</filter-class></filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</filter>
Filter接口
javax.servlet.Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作
- void init(FilterConfig filterConfig) 实现过滤器的初始化操作
- void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 执行过滤操作的功能
- void destroy() 实现过滤器的销毁操作
多个过滤器的使用
在web.xml文件中配置过滤器,如果有多个过滤器都满足过滤的条件,按照<filter-mapping>
的顺序从上往下
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.test.filter.LoginFilter</filter-class></filter>
<filter-mapping>
<filter-name>LoginFilter1</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LoginFilter2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LoginFilter3</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping></filter>
Listener监听器
Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理
容器产生的事件分类
- 生命周期相关的事件
- 属性状态相关的事件
- 存值状态相关的事件
基本分类
- javax.servlet.ServletRequestListener 监听request作用域的创建和销毁
- javax.servlet.ServletRequestAttributeListener 监听request作用域的属性状态变化
- javax.servlet.http.HttpSessionListener 监听session作用域的创建和销毁
- javax.servlet.http.HttpSessionAttributeListener 监听session作用域的属性状态变化
- javax.servlet.ServletContextListener 监听application作用域的创建和销毁
- javax.servlet.ServletContextAttributeListener 监听application作用域的属性状态变化
- javax.servlet.http.HttpSessionBindingListener 监听对象与session的绑定和解除
- javax.servlet.http.HttpSessionActivationListener 监听session数值的钝化和活化
ServletRequestListener监听器
在ServletRequest创建和关闭时都会通知ServletRequestListener监听器
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("请求销毁了...");
}
@Override public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("创建请求...");
}
}
ServletRequestAttributeListener监听器
向ServletRequest添加、删除或者替换一个属性的时候,将会通知ServletRequestAttributeListener监听器
public class MyRequestAttributeListener implements ServletRequestAttributeListener {
@Override public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("增加了属性" + servletRequestAttributeEvent.getName());
} @Override public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("属性" + servletRequestAttributeEvent.getName() + "被删除了" );
} @Override public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("修改属性" + servletRequestAttributeEvent.getName());
}
}
HttpSessionListener监听器
当一个HttpSession刚被创建或者失效(invalidate)的时候,将会通知HttpSessionListener监听器
public class MySessionListener implements HttpSessionListener {
@Override public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("创建了session...");
}
@Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session销毁!");
}
}
HttpSessionAttributeListener监听器
HttpSession中添加、删除或者替换一个属性的时候,将会通知HttpSessionAttributeListener监听器
public class MySessionAttributeListener implements HttpSessionAttributeListener {
@Override public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("增加了属性" + httpSessionBindingEvent.getName());
} @Override public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("属性" + httpSessionBindingEvent.getName() + "被删除!");
} @Override public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("修改属性" + httpSessionBindingEvent.getName());
}
}
ServletContextListener监听器
在ServletContext创建和关闭时都会通知ServletContextListener监听器
public class MyContextListener implements ServletContextListener {
@Override public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象创建了...");
}
@Override public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("销毁ServletContext对象...");
}
}
ServletContextAttributeListener监听器
向ServletContext添加、删除或者替换一个属性的时候,将会通知 ServletContextAttributesListener监听器
public class MyContextAttributeListener implements ServletContextAttributeListener {
@Override public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("增加了属性" + servletContextAttributeEvent.getName());
}
@Override public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("属性" + servletContextAttributeEvent.getName() + "被删除!");
}
@Override public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("修改属性" + servletContextAttributeEvent.getName());
}
}
HttpSessionBindingListener监听器
HttpSession中绑定和解除绑定时,将会通知HttpSessionListener监听器
当前对象被放入session或从session移除时触发
public class Person implements HttpSessionBindingListener {
@Override public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("对象绑定到session中了" + httpSessionBindingEvent.getName());
}
@Override public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("解除绑定成功!");
}
}