一、Listener
监听器:就是接口回调
1、接口回调(多态):事先把一个接口的实现类传递给A,当A中执行到某个事件时,通过传过来的这个接口的实现类B,来调用B中的方法。A、B之间通过接口联系。
2、web监听器:①定义一个监听器接口的实现类②web.xml中注册/配置监听器
总共有8个 划分三种类型
一、 监听三个作用域的创建和销毁
pageContext
*request -----httpServletRequest -----ServletRequestListener
*session -----httpSession ---------httpSessionListener
*application --ServletContext --------ServletContextListener
1、ServletContextListener:利用他来在ServletContext创建时:①完成自己想要的初始化工作②执行自定义任务调度(执行某一个任务)
ServletContext创建:启动服务器的时候
ServletContext:销毁:关闭服务器、从服务器中移除项目
public class MyServletContextListner implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Servlet创建了。。。");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Servlet销毁了。。。");
}
}
web.xml中:
<listener>
<listener-class>com.listner.MyServletContextListner</listener-class>
</listener>
2、ServletRequestListener
request创建:访问服务器上任意资源都会有请求出现
request销毁:服务器已经对这次请求做出了响应
3、HttpSessionListener:统计在线人数
session的创建:只要调用了getSession
html:不会
jsp:会自动创建
servlet:会,但只有调用getSession()时才创建
session的销毁:超时、非正常关闭
二、监听三个作用域属性状态变量
可以监听在作用域中值 添加/替换/移除 的动作。
*request -----httpServletRequest -----ServletRequestAttributerListener
*session -----httpSession ---------httpSessionAttributerListener
*application – ServletContext --------ServletContextAttributerListener
public class MySeSSIonAttributerListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("属性添加了");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("属性移除了");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("属性替换了");
}
}
web.xml同上一样配置
三、监听httpSession里面存值的状态变量:这一类监听器不用注册,需要创建的实体类实现接口
*HttpSessionBindingListener:监听对象与session绑定和解除绑定的动作
*HttpSessionActivationListener:监听现在session的值是 钝化(序列化) 还是 活化(反序列化) 的动作
钝化:把内存中的数据存储到硬盘上
活化:把硬盘中的数据读取到硬盘上
session钝化活化的用意:session中的值可能很多,并且我们有很长时间不使用这个内存中的值,那么可以考虑把session的值存储到硬盘上【钝化】,等下一次在使用的时候,从硬盘中提取出来【活化】
如何让session在一定时间内钝化:
1、在tomcat里面的 conf/context.xml 里面配置,对所有运行在这个服务器的项目生效
2、在conf/Catalina/localhost/context.xml配置
3、在自己的web工程项目中的 META-INF/context.xml,只对当前项目有效
配置内容:
<?xml version="1.0" ?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="cjq" />
</Manager>
</Context>
其中 maxIdleSwap:代表多久不用被钝化。 directory:代表钝化生成的文件存放的文件夹名称。(钝化到tomcat里面的work/Catalina/localhos/项目文件夹/)
二、Filter
Filter:过滤器就是对客户端发出来的请求进行过滤。浏览器发出,然后服务器派servlet处理,在中间就可以过滤,其实过滤器起到的就是拦截的作用。
作用:
1、对一些敏感词汇过滤
2、统一设置编码
3、自动登录…
如何使用Filter:
1、定义一个类,实现Filter接口
2、在web.xml中注册过滤器,注册与servllet基本一样
生命周期:创建在服务器启动时,销毁在服务器停止时
拦截的执行顺序:
客户端访问服务端时:按照web.xml中注册的顺序执行多个拦截器,若其中一个未放行,则后面拦截器不会执行。
服务端返回客户端时:顺序相反
拦截器放行:为拦截器类中doFilter方法中第三个参数类的 doFilter(servletRequest,servletResponse) 方法
针对中的设置:
4个参数:REQUEST:只要请求过来,都拦截,默认的就是这个
FORWARD:只要是转发都拦截
ERROR:页面出错发生跳转
INCLUDE:包含页面的时候就拦截
三、利用Filter、Cookie、Session实现一个用户自动登录逻辑设计。
登陆页面:
1、用户名、密码是否正确;
2、在用户不为空的情况下判断是否勾选自动登录checkbox
3、选中自动登陆后,将用户名和密码传给Cookie(记得用户名和密码拼接时中间加个特殊符号方便分割)。且将该用户传给session
4、未选中则不做处理重新返回登陆界面
拦截器Filter中:
1、通过session取那个用户,判断取到的用户是否为空,若不为空,则说明已经登陆过,此时直接放行即可,此时到达的是首页界面(通过Session去用户时要注意要通过HttpServletRequest取,强转一下)
2、用户为空时,可能存在已经登陆过,但是关闭了浏览器的原因,此时开始判断Cookie,从浏览器存储的Cookie数组中取出存放用户信息的那个Cookie,若此Cookie为空则说明未选择过自动登录或者从未登陆过,此时直接放行,返回的是登陆页面。
3、若此Cookie不为空,则说明已经登陆而且设置了自动登录,所以此时将Cookie里面的对应的用户信息取出并赋值给用户,再将此用户写入Session即可自动登