Listener和Filter详解

目录

监听器

servlet上下文的监听器

域的生命周期问题

request

session

监听的作用

监听属性状态的变更

监听session存值状态的变更

序列化和反序列化

设置序列化时机

过滤器

多个过滤器

配置dispatcher

自动登录案例

技术分析

过滤器的作用

在servlet里

在过滤器里


前言

Listener监听器和Filter过滤器,这里只会讲解如何应用

基础知识 https://blog.csdn.net/bestmy/article/details/81046177

监听器

监听的原理就是实现监听接口的函数,由接口在适合的时机调用我们实现的函数

Listener工作上写的比较少,用的最多可能就是钝化和活化

servlet上下文的监听器

还需要注册监听器,因为我们要把实现了接口的类传给监听器,这样监听器才知道调用哪个子类

在xml里注册监听器

域的生命周期问题

request

访问html  jsp servlet都会创建request

响应完后就会销毁

session

session只有调用getSession的时候才会创建,在jsp的源码里

有getSession,所以jsp里有9个内置对象其中就包含session

我们在servlet里可以通过request.getSession,这样session就会创建

监听的作用

监听属性状态的变更

实现HttpSessionAttrubuteListener

在jsp里写上用作测试

监听session存值状态的变更

setAttribute("list",list),也就是监视list里的数据变化

这类监听器不需要注册,因为是Bean来实现它的接口,不是servlet

写一个Bean去实现HttpSessionBindingListener

setAttribute就是对象的绑定,也是属于属性的变更,setName是值被改变

序列化和反序列化

也是在Bean去实现接口,需要注册

序列化就是内存中的数据放到硬盘当中去了,反序列化就是硬盘的数据到内存, 序列化正常关闭服务器的时候才会被调用,

重启服务器的时候会反序列化

还需要再实现一个序列化的接口才能够活化

设置序列化时机

每次钝化和活化都需要关闭重启服务器肯定是不行的,所以还需要设置

在上面3个地方都设置下面2句话

设置之后,钝化不需要关闭服务器,1分钟就钝化,当然肯定要判断条件的,比如我们用户没有操作的,活化只需要重新刷新这个页面即可活化

<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
    <Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</Context>

过滤器

写一个类继承Filter类

注册filter

和Servlet的注册是一模一样的,只不过名称有点不一样,这个和servlet一样也可以放置参数,不过一般不用

如果放置了参数,那么就要用这个filterConfig.getinitParamxxxxx来取

多个过滤器

如果有多个过滤器,那么过滤的顺序和filter-mapping在xml的放置顺序有关

/*代表所有的请求都会执行我们的过滤器

如果是下面这样的,那么就是指定访问哪个目录的时候才会执行过滤

配置dispatcher

一般可能对跳转和错误页面进行拦截

自动登录案例

技术分析

写一个过滤器,去拦截cookie

过滤器的作用

表单页面

导入beanutils的jar,自动将页面传递过来的参数填充到页面

这里只是暂时用一下

在servlet里

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		 try
		{
			//使用beanutils自动装填参数
			 Map map=request.getParameterMap();
			 UserBean userBean=new UserBean();
			 BeanUtils.populate(userBean, map);
			 
			 //复选框选了接受的是on,没选中是off
			 String isOn=request.getParameter("auto_login");
			 
			 //查询信息
			 QueryRunner runner=new QueryRunner(JDBCUtil.getDataSource());
			 String sql="select * from user where username=? and password=?";
			 userBean=runner.query(sql, new BeanHandler<UserBean>(UserBean.class),userBean.getUsername(),userBean.getPassword());
			 
			 //设置cookie
			 if (userBean!=null)
			{
				//判断提交的时候是否选中了自动登录
				 if ("on".equals(isOn))
				{
					//发送Cookie给客户端
					 Cookie cookie=new Cookie("auto_login",userBean.getUsername()+"#lover"+userBean.getPassword());
					
					 //60秒有效期
					 cookie.setMaxAge(60); 
					 
					 //加入cookie
					 response.addCookie(cookie);
				}
				 
				 //把用户信息放入页面
				 request.getSession().setAttribute("userBean", userBean);
				 response.sendRedirect("index.jsp");
			}
			 
			 
			
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}

在过滤器里

public class AutoLoginServlet implements Filter {
	public void destroy() {
	}

	public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException
	{
		 System.out.println("访问了过滤器");
		try
		{
			//ServletRequest是HttpServletRequest的父类
			//我们需要用到子类特有的方法(和Servlet一样的request),所以需要强转
			HttpServletRequest request = (HttpServletRequest)req;
			
			//先判断现在的Session有没有userBean也就是用户信息
			UserBean userBean=(UserBean)request.getSession().getAttribute("userBean");
			if (userBean!=null)
			{
				System.out.println("放行1");
				//放行,到页面的时候肯定会检测,如果session有userBean,那么就是已经登录了的
				chain.doFilter(request, response);
			}
			else
			{
				 //如果Session失效那么就获取Cookie,看Cookie有没有存,达到自动登录的情况
				//因为Session失效了可能是30分钟没有操作页面或者关闭页面,
				 Cookie[] cookies=request.getCookies();
				 Cookie cookie=CookieUtil.findCookie(cookies, "auto_login");
				 
			   if (cookie==null)
				{
					//第一次来肯定要放行,然后到了某个页面后肯定会叫你先登录
				   //登录的时候就会设置Cookie
				   System.out.println("放行2");
					chain.doFilter(request, response);
				}
			   else
			   {
					//如果不是第一次,但是Session失效了,那么先获取Cookie的数值
					String value=cookie.getValue();
					String username=value.split("#")[0];
					String password=value.split("#")[1];	
					
					 System.out.println("Cookie的帐号"+username+"   密码"+password);
					
					//到数据库去找这个人并且登录
					 QueryRunner runner=new QueryRunner(JDBCUtil.getDataSource());
					 String sql="select * from user where username=? and password=?";
					 UserBean user1=runner.query(sql, new BeanHandler<UserBean>(UserBean.class),userBean.getUsername(),userBean.getPassword());
					
					
					System.out.println(user1.toString());
					
					//把用户信息存到Session里
					request.getSession().setAttribute("userBean", user1);

					System.out.println("放行3");
					//然后放行
					chain.doFilter(req, response);
				}
			}
			
		} catch (SQLException e)
		{
			e.printStackTrace();
			//放行
			chain.doFilter(req, response);
		}
		
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}
}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/88426225