javaweb之Listener和Filter

一、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即可自动登

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值