过滤器Filter
JSP中的过滤器是一个实现了javax.servlet.Filter接口的java类。用于拦截请求和响应,相对的可以对请求或者响应的内容作出修改。多个过滤器一起可组合成一个过滤链。
过滤器常见用途
身份验证过滤器(Authentication Filters)。
数据压缩过滤器(Data compression Filters)。
加密过滤器(Encryption Filters)。
触发资源访问事件过滤器。
图像转换过滤器(Image Conversion Filters)。
日志记录和审核过滤器(Logging and Auditing Filters)。
MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
标记化过滤器(Tokenizing Filters)。
XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
实现一个过滤器
public class MyFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("filter...destory");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("拦截请求");
//放行请求和响应
chain.doFilter(request, response);
System.out.println("拦截响应");
}
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("filter...init");
}
}
配置web.xml
方法与配置servlet类似:
<filter>
<filter-name>MyServlet</filter-name>
<filter-class>filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyServlet</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
映射中值为要拦截的请求路径,*通配符表示对所有路径的请求进行拦截。
<dispatcher>
指定过滤器所拦截的资源被 Servlet 容器调用的方式,有四种值,默认为REQUEST:
- REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用
- FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
- INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
- ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
过滤链
多个过滤器组成过滤链,web容器应用过滤器的先后顺序与在web.xml中<filter-maping>
的顺序有关。
监听器
jsp中监听器用来监听 request 、session 、 application 三个对象
与过滤器一样,不同的监听器需要实现不同的接口
按功能分两种:
- 监听对象的创建和销毁
request :ServletRequestListener
session:HttpSessionListener
application:ServletContextListener
public class ContextSessionRequestListener implements ServletRequestListener,HttpSessionListener,ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听ServletContext 销毁对象"+sce);
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听ServletContext 创建对象"+sce);
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("监听HttpSession 创建对象"+se);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("监听HttpSession 销毁对象"+se);
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("监听ServletRequest 销毁对象"+sre);
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("监听ServletRequest 创建对象"+sre);
}
}
- 监听对象中属性的变更
request :ServletRequestAttributeListener
session :HttpSessionAttributeListener
application:ServletContextAttributeListener
可通过getName和getAttribute方法获得属性名和属性值。
每种对象对应三种方法,分别监听属性增加时,修改属性值时,移除属性时。
/**
* 监听属性的变化
* @author 1
*
*/
public class AttributeListener implements ServletRequestAttributeListener,HttpSessionAttributeListener,ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
// TODO Auto-generated method stub
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
// TODO Auto-generated method stub
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
}
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
//获得增加的属性名和属性值
String name = srae.getName();
Object attribute = srae.getServletRequest().getAttribute(name);
System.out.println("新增属性:name-"+name+" value-"+attribute);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
String name = srae.getName();
System.out.println("移除属性"+name);
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
//获得修改的属性名和属性值
String name = srae.getName();
Object attribute = srae.getServletRequest().getAttribute(name);
System.out.println("修改后:name-"+name+" value-"+attribute);
}
}