Filter
Filter(过滤器)就像是哨卡,用户请求需要经过Filter,并且可以有多个过滤器
编写一个简单的Filter
public class FirstFilter implements Filter {
@Override
public void destroy() {
/**销毁时调用*/
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String ip = request.getRemoteAddr();
String url = request.getRequestURL().toString();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = new Date();
String date = sdf.format(d);
System.out.printf("%s %s 访问了 %s%n", date, ip, url);
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
<!--web.xml文件中进行filter的配置-->
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<!--表示所有的访问都会过滤-->
<url-pattern>/*</url-pattern>
<!--表示只过滤jsp-->
<!--<url-pattern>*.jsp</url-pattern>-->
</filter-mapping>
启动tomca过程中出现
严重: Context [] startup failed due to previous errors
常常用于提示Filter启动失败了
Listener
Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。
1.监听Context
web应用即ServletContext对象(jsp的隐式对象application)
除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。
public class ContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("web 应用销毁 ");
}
/*在启动tomcat以及当前web应用重载的时候可以观察到
web应用的自动重载需要蟹盖server.xml中<context>配置的属性reloadable="true",
tomcat在运行状态下会监视class文件的改动,若改动服务器会自动重新加载Web应用。*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("web 应用初始化 ");
}
}
public class ContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent e) {
System.out.println("增加属性 ");
System.out.println("属性是" + e.getName());
System.out.println("值是" + e.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent e) {
// TODO Auto-generated method stub
System.out.println("移除属性 ");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent e) {
// TODO Auto-generated method stub
System.out.println("替换属性");
}
}
<!--web.xml-->
<listener>
<listener-class>listener.ContextListener</listener-class>
</listener>
<listener>
<listener-class>listener.ContextAttributeListener</listener-class>
</listener>
2.监听Session
实现接口 HttpSessionListener
sessionCreated()
表示session创建的时候执行
sessionDestroyed()
表示session销毁的时候执行
实现接口 HttpSessionListener
sessionCreated()
表示session创建的时候执行
sessionDestroyed()
表示session销毁的时候执行
3.监听Request
实现接口 ServletRequestListener和ServletRequestAttributeListener
equestInitialized()
当新创建了一个Request的时候触发,只要访问了服务端的资源,就会创建一个Request,无论是jsp,servlet还是html
requestDestroyed()
当本次请求结束的时候触发
attributeAdded
当有新增属性时触发
attributeReplaced
当有替换属性时触发
attributeRemoved
当有移除属性时触发