过滤器
基本的知识在菜鸟教程中有详细的介绍
<!--配制第一个过滤器-->
<filter>
<filter-name>Filter1</filter-name>
<filter-class>com.servlet.filter.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配制第一个过滤器-->
<filter>
<filter-name>Filter2</filter-name>
<filter-class>com.servlet.filter.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter2</filter-name>
<url-pattern>/*ed</url-pattern>
</filter-mapping>
<!--配制第一个过滤器-->
<filter>
<filter-name>Filter3</filter-name>
<filter-class>com.servlet.filter.Filter3</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter3</filter-name>
<url-pattern>/filtertest</url-pattern>
</filter-mapping>
package com.servlet.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 过滤器的使用:
* 作用:对服务器接受的请求资源和响应给浏览器的资源进行管理
* 保护servlet
* 使用:
* 创建了一个实现Filter接口的普通java类
* 覆写接口中的方法:init doFilter destory
* 在web.xml中配置过滤器过滤器
* 注意:
* url-pattern: /*
* 表示阻拦所有的请求
* url-pattern: /*.ed
* 表示阻拦以ed为结尾的的请求
* url-pattern: /filtertest
* 表示阻拦具体servlet的请求‘
* 过滤器的生命周期:
* 浏览器开启——》浏览器关闭
* 总结:
* 过滤器程序员声明和配置,服务器根据请求中的uri调用
* 执行:
* 浏览器发起请求到服务器,服务器接收到请求后,根据在URI信息在web。xml中找到相对应过滤器执行doFilter方法,该方法
* 对此请求处理后符合则放行,放行后如何有符合过滤器要的继续过滤,找到servlet进行请求处理,servlet对请求完毕后,也就是
* service方法结束, ,还应该继续返回执行相应的doFilter方法中的代码
*
* 案例:
* 1.统一编码格式
* 2.session的处理
* 3.权限管理
* 4.资源管理(统一水印,和谐词汇等等)
*
*/
public class Filter1 implements Filter{
@Override
public void destroy() {
System.out.println("第一个过滤器被初始化了");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
//统一编码格式
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//session处理 ;如果session数据过期或者不存在,我们就让其从新保存session
HttpSession hs = ((HttpServletRequest)req).getSession();
if(hs.getAttribute("user")==null){
//重定向
((HttpServletResponse)resp).sendRedirect("/Users/login.jsp");
}else{
System.out.println("我是第一个过滤器");
chain.doFilter(req, resp);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("第一个过滤器死了");
}
}
package com.servlet.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter2 implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("执行第二个过滤器");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
package com.servlet.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter3 implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("执行第三个过滤器");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
监听器
问题:在 Servlet 技 术 中 我 们 学 习 了 request、session、 application 作用域对象,其主要作用是实现数据的在不同场景中的灵活流转。但是数据的具体流转过程我们是看不到的,比如作用域对象是什么时候创建和销毁的,数据是什么时候存取,改变和删除的。因为具体的流转过程看不到,所以也就无法再指定的时机对数据和对象进行操作, 比如 session 销毁的时候,在线人数-1。
解决:使用监听器
概念:Servlet 监听器是 Servlet 规范中定义的一种特殊类,用 于监听 ServletContext、HttpSession 和 ServletRequest 等域
对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
监听对象:Request、 Session 、 Application
监听内容:创建、销毁、属性改变事件
监听作用:在事件发生之前,之后进行一些处理,比如统计在线人数
使用:监听 request 监听 session 监听 application
案例:统计网站在线人数。
package com.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 监听器的作用:
* 作用:
* 监听作用域对象request、session、application的创建,销毁,和内容的改变
* 使用:
* web配置 <listener><listener-class>
* 创建一个实现了指定接口的java类
* Request
* 1.监听request==> ServletRequestListener 监听request的销毁和初始化
* 2.监听request==> ServletRequestAttributeListener 监听request作用域数据的更改
* 形参
* getName() 获取监听数据的键
* getValue() 获取监听数据的值
*
* Session
* 1.监听session==> HttpSessionListener
* 2.监听session==> HttpSessionAttributeListener
* 形参
* getName()
* getValue()
* Application
* 1.监听ServletContextListener==> HttpSessionListener
* 2.监听ServletContextAttributeListener==> HttpSessionAttributeListener
* 形参
* getName()
* getValue()
*
*
*
*
*
*
*
*
*
* @Desciption :
* @date :2019-4-3 下午6:53:09
* @author :田坤
*/
public class Listener implements ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("reuest被销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("request初始化");
}
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("request中添加了属性:"+arg0.getName()+"--"+arg0.getValue());
}
/******************SESSION******************************************/
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("Session被初始化了");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("Session被销毁了");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("Session添加了属性:"+arg0.getName()+"---"+arg0.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
/****************Application*********************/
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("application被销毁了");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("application被初始化了");
}
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("Application添加了属性:"+arg0.getName()+"---"+arg0.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
}
}