Cookie、Session、Filter、Listener常用方法及应用场景

目录

1.什么是会话跟踪技术

2.Cookie

2.1.什么是cookie(如何记录用户状态)

2.2.Cookie的作用:

2.3.Cookie的应用场景

2.4.Cookie的设置和获取

2.5.删除Cookie

2.6.设置Cookie的有效时间

2.7.Cookie的使用 

3.Session

3.1.什么是Session(如何记录用户状态)

3.2.创建Session的格式

3.3.Session的⽣命周期

3.4.Session常⽤⽅法:

3.5.让session失效的⽅式

3.6.Sesssion的应⽤场景

3.7.Session和Cookie的区别/关系

3.8.Request和Session的区别

4.过滤器(Filter)

1.什么是过滤器

2.过滤器的语法格式

3.使⽤场景

4.注解配置过滤器

5.监听器(Listener)

5.1.什么是监听器

5.2.监听器分类

5.3.监听三⼤域对象的创建与销毁的监听器

 

1.什么是会话跟踪技术

会话跟踪是 Web 程序中常⽤的技术,⽤来 跟踪⽤户的整个会话。保持对⽤户会话期间的数据管理 。常⽤的会话跟踪技术是Cookie Session
 
Cookie 通过 在客户端存储信息确定⽤户身份
 
Session 通过 在服务器端存储信息确定⽤户身份
 

2.Cookie

2.1.什么是cookie(如何记录用户状态)

Cookie 是客户端 ( ⼀般指浏览器 ) 请求服务器后 , 服务器发给客户端的⼀个辨认标识,保存在客户端,当客户端再次向服务器发送请求时,会携带着这个辨认标识,服务器就可以通过这个标识来识别客户端的身份或状态等。

2.2.Cookie的作用:

跟踪会话,记录⼀次会话中用户(Session,⼀次会话可能会有多次请求,当然也可以有多个Cookie来跟踪不同的信息)的信息这样服务器就会知道⽤户的状态,⽐如有没有登录成功,付款时购物⻋中的东⻄等,就相当于贴在客户端脑⻔上的纸条,浏览器看不到,但服务器看得到。

2.3.Cookie的应用场景

保持⽤户登录状态(免登陆)

将⽤户的信息保存到 Cookie中,并发送给浏览器,并且将有效时间设置为⼀个较⻓的时间,这样浏览器在以后访问⽹站时,都会带着该Cookie,服务器以此来辨识⽤户,⽤户就不再需要输⼊⽤户名和密码等信息(不建议将密码存入cookie,注意安全性问题,cookie中建议存放一些不重要的数据,比如浏览记录等)

 

记录⽤户名

⼀旦⽤户登录成功以后,下次再登录时,直接将 Cookie 中的⽤户名读取并显示出来,这样⽤户就不需要再次输⼊⽤户名,只输⼊密码即可。
 

2.4.Cookie的设置和获取

通过HttpServletResponse.addCookie的⽅式设置Cookie

注意 :new Cookie() 时两个参数都是字符串
 
Cookie cookie = new Cookie("jieguo","true");
response.addCookie(cookie);
浏览器中查看cookie的内容
 
 
 
服务端获取客户端携带的cookie:通过HttpServletRequest获取
 
Cookie[] cookies = request.getCookies();
 if(cookies != null)
     for(Cookie c : cookies){
         String name = c.getName();//获取Cookie名称
         if("jieguo".equals(name)){
         String value = c.getValue();//获取Cookie的值
         bool = Boolean.valueOf(value);//将值转为Boolean类型
     }
 }

2.5.删除Cookie

通过设置同名Cookie的最⼤存活时间为0 将cookie发送给浏览器,来替换同名Cookie 删除Cookie 是指使浏览器不再保存 Cookie ,使 Cookie ⽴即失效
 
举例:使 name username Cookie ⽴即失效
 
//1.创建⼀个name为username的Cookie
Cookie cookie = new Cookie("username", "aaa");
//2.设置Cookie的有效时间为0
cookie.setMaxAge(0);//删除cookie的关键
//3.将cookie发送给浏览器,来替换同名Cookie
response.addCookie(cookie);

2.6.设置Cookie的有效时间

Cookie 发送给浏览器以后,浏览器并不会永久保存,也就是到了⼀定的时间以后浏览器会⾃动销毁Cookie。 Cookie 的默认有效时间为⼀次会话 ( ⼀次打开关闭浏览器的过程 ) ,我们也可以⼿动指定 Cookie的有效时间
//setMaxAge⽤来设置Cookie的最⼤有效时间,需要int型的参数,代表有效的秒数
 cookie.setMaxAge(秒数);
 //当参数⼤于0时,会设置为指定的秒数
 cookie.setMaxAge(30);
 //当参数等于0时,浏览器不会保存Cookie,Cookie⽴即失效
 cookie.setMaxAge(0);
 //当参数⼩于0时,和不设置是⼀样,当前会话有效
 cookie.setMaxAge(-100);
 //设置⼀个永久有效的Cookie,并⾮永久,只是使Cookie的⽣命很⻓⽽已
 cookie.setMaxAge(60*60*24*365*10);

2.7.Cookie的使用 

在登录页面中会弹出"是否记住用户名和密码",它是把用户名和密码存入cookie然后将cookie存入本地文件,下次再浏览该网页,就会去本地读取这个cookie,将用户名和密码在数据框中显示。达到记录用户信息效果。

要求:在登录失败后,服务器给浏览器的响应的重定向到登录页面,并把存放用户名的cookie发送浏览器,让页面显示当前的用户名,密码不建议存放到cookie.

index.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      <%
        //1.通过小脚本获取服务器传回的cookie
        Cookie[] cookies = request.getCookies();
        String value=null;
        //2.考虑第一次访问页面时没有cookie,出现空指针异常,给个判断
        if (cookies.length>0){
          for (Cookie cookie : cookies) {
            if (cookie.getName().equals("uname")){
              value = cookie.getValue();
              break;
            }
          }
        }
        //3.JSP页面中必须从域对象中获取动态数据,所以要先存值到域对象
        pageContext.setAttribute("unamecookie",value);
      %>
      <h1>登录</h1>
      <form action="/login" method="post">
        用户名:<input type="text" name="username" value="${unamecookie}"><br>
        密码:  <input type="text" name="password"><br>
        <input type="submit" value="login">
      </form>
  </body>
</html>
error.jsp
 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>请使用表单登录页面</h1>
</body>
</html>

success.jsp

<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>登录成功</h1>
</body>
</html>

LoginServlet

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("admin".equals(username)&&"123456".equals(password)){
            //登录成功,跳转,若不存着,可用重定向
            resp.sendRedirect("success.jsp");
        }else {
            //登录失败
            //1.后台创建cookie
            Cookie uname = new Cookie("uname", username);
            //将cookie返回给前端
            resp.addCookie(uname);
            resp.sendRedirect("index.jsp");
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //未使用表单提交走doGet
        resp.sendRedirect("error.jsp");
    }
}

密码错误,服务器让浏览器重定向到这个登录页面,用户名自动显示出现
 
 
 
 
 
 

3.Session

3.1.什么是Session(如何记录用户状态)

Session 是另⼀种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,⽽ Session 保存在服务器上。 客户端浏览器访问服务器的时候,服务器把客户端信息以session形式记录在服务器上 。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了(比如若有用户信息则表示用户已经登录了)。
 
Session 是由应⽤服务器维持的⼀个服务器端的存储空间,⽤户在连接服务器时,会由 服务器⽣成⼀个唯⼀的SessionID,⽤该SessionID 为标识符来存取服务器端的Session存储空间。⽽SessionID这⼀数据则是保存到客户端,⽤Cookie保存的,⽤户提交⻚⾯时,会将这⼀SessionID提交到服务器端,来存取Session数据 。这⼀过程,是不⽤开发⼈员⼲预的。所以⼀旦客户端禁⽤ Cookie ,那么 Session 也会失效。
 
如果说 Cookie 机制是通过检查客户身上的 通⾏证 来确定客户身份的话,那么 Session 机制就是通过检查服务器上的“ 客户明细表 来确认客户身份。 Session 相当于程序在服务器上建⽴的⼀份客户档案,客户来访的时候只需要查询客户档案表就可以了。
 

3.2.创建Session的格式

Session 对应的类为 javax.servlet.http.HttpSession 类。每个来访者对应⼀个Session对象,该客户的所有状态信息都保存在这个Session对象⾥。 Session对象是在客户端第⼀次请求服务器的时候创建的。
 
Session 也是⼀种 key-value 的属性对,通过 getAttribute(Stringkey) setAttribute(String key, Objectvalue)⽅法读写客户状态信息 Servlet ⾥通过 request.getSession() ⽅法获取该客户的 Session
 
例如:
HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性
out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性

3.3.Session的⽣命周期

Session 保存在服务器端。 为了获得更⾼的存取速度,服务器⼀般把 Session 放在内存⾥。每个⽤户都会有⼀个独⽴的Session 。如果 Session 内容过于复杂,当⼤量客户访问服务器时可能会导致内存溢出。因此,Session ⾥的信息应该尽量精简。

 

Session在⽤户第⼀次访问服务器的时候⾃动创建。 需要注意只有访问 JSP Servlet 等程序时才会创建Session,只访问 HTML IMAGE 等静态资源并不会创建 Session 。如果尚未⽣成 Session ,也可以使 request.getSession(true)强制⽣成 Session
 
Session⽣成后,只要⽤户继续访问,服务器就会更新Session的最后访问时间,并维护该Session 。⽤户每访问服务器⼀次,⽆论是否读写Session ,服务器都认为该⽤户的 Session“ 活跃( active 了⼀次。 由于会有越来越多的⽤户访问服务器,因此Session 也会越来越多。 为防⽌内存溢出,服务器会把⻓时间 内没有活跃的Session从内存删除 。这个时间就是 Session 的超时时间。如果超过了超时时间没访问过服务器,Session 就⾃动失效了
 
Session超时时间 maxInactiveInterval 属性,通过对应的 getMaxInactiveInterval() 获取,通过setMaxInactiveInterval(longinterval)修改。
 
Session 的超时时间也可以在 web.xml 中修改。另外,通过调⽤ Session invalidate() ⽅法可以使 Session失效
 
<session-config> 
 <session-timeout>30</session-timeout>
</session-config>

3.4.Session常⽤⽅法:

HttpSession req.getSession()获取session对象

void setAttribute(String key,Object value) key/value的形式保存对象值,将数据存储在服务器端

Object getAttribute(String key) 通过key获取对象值

void invalidate() 设置session对象失效

String getId() 获取 sessionid, 当第⼀次登录成功后, session会产⽣⼀个唯⼀的id,浏览器之后访问时如果发现id值还是之前id,那么说明 当前访问的属于同⼀个会话
 
void setMaxInactiveInterval(int interval) 设定 session 的⾮活动时间
 
⽅式 1: session.setMaxInactiveInterval(10*60);//设置有效时间为 10 分钟
 
⽅式 2: 修改 web.xml
 
<session-config>
 <session-timeout>10</session-timeout>//单位:分钟
</session-config>
int getMaxInactiveInterval() 获取 session 的有效⾮活动时间 ( 以秒为单位 ) ,默认的有效时间 :30分钟
 
void removeAttribute(String key) session 中删除指定名称 (key) 所对应的对象
 
 

3.5.让session失效的⽅式

1 invalidate() 删除session中所有数据
 
2 removeAttribute("key")删除session中指定数据
 
3 )直接关闭浏览器。不会马上删除session,等到了session非活动时间,session失效。
 
示例 : 使⽤ session 验证⽤户是否登录
 

3.6.Sesssion的应⽤场景

代码演示:(创建Session和消除Session)

1.登录

登录后服务器使用session记录用户名,在页面显示用户名,欢迎您。

2.退出

点击退出链接后,服务器让所有session失效并重定向到登录页面

index.jsp表单登录--/login的servlet验证--跳转到success.jsp(通过session显示用户信息)--退出链接--/loginout的servlet中把session失效然后跳转到登录页面

index.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      <%
        //1.通过小脚本获取服务器传回的cookie
        Cookie[] cookies = request.getCookies();
        String value=null;
        //2.考虑第一次访问页面时没有cookie,出现空指针异常,给个判断
        if (cookies!=null&&cookies.length>0){
          for (Cookie cookie : cookies) {
            if (cookie.getName().equals("uname")){
              value = cookie.getValue();
              break;
            }
          }
        }
        //3.JSP页面中必须从域对象中获取动态数据,所以要先存值到域对象
        pageContext.setAttribute("unamecookie",value);
      %>
      <h1>登录</h1>
      <form action="/login" method="post">
        用户名:<input type="text" name="username" value="${unamecookie}"><br>
        密码:  <input type="text" name="password"><br>
        <input type="submit" value="login">
      </form>
  </body>
</html>

LoginServlet

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("admin".equals(username)&&"123456".equals(password)){
            //session存值
            HttpSession session = req.getSession();
            session.setAttribute("username",username);
            session.setAttribute("password",password);
            //登录成功后设置session超时时间30分钟,也就是登录后,30分钟内没有访问页面动作
            // session失效,用户再访问页面时服务器通过拦截跳转到登录页面重新登录
            session.setMaxInactiveInterval(60*30);//单位是秒,设置session超时时间
            //重定向或者转发时,session数据是不会丢失的,重定向时,request中的数据会丢失
            resp.sendRedirect("success.jsp");
        }else {
            //登录失败
            //1.后台创建cookie
            Cookie uname = new Cookie("uname", username);
            //将cookie返回给前端
            resp.addCookie(uname);
            resp.sendRedirect("index.jsp");
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //未使用表单提交走doGet
        resp.sendRedirect("error.jsp");
    }
}

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>success.jsp</h1>
当前登录用户:${sessionScope.username}<br>
<a href="/loginout">退出</a>
</body>
</html>

LoginOutServlet

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/loginout")
public class LoginOutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.getSession().invalidate();//使session失效
        resp.sendRedirect("index.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);
    }
}

服务器中设置了session的超时时间是30分钟,30分钟内随时访问localhost:8080/success.jsp页面都可以获得用户信息admin,如果设置了拦截器,这个时候是可以直接访问success.jsp,若30分钟内session没有活动,session失效,拦截器没有拿到session,用户再访问localhost:8080/success.jsp时直接跳转到登录页面要求重新登录。

 

3.7.SessionCookie的区别/关系

位置上:Cookie数据保存在客户端,Session数据保存在服务器端。

安全上:Cookie存放不重要的数据,Session存放安全性的数据

关系上:Session的实现靠的是cookie携带的sessionid来识别服务器端的session存储空间。

Session 是由应⽤服务器维持的⼀个服务器端的存储空间,⽤户在连接服务器时,会由服务器⽣成⼀ 个唯⼀的SessionID, ⽤该 SessionID 为标识符来存取服务器端的 Session 存储空间。⽽ SessionID 这⼀数据 则是保存到客户端,⽤Cookie 保存的,⽤户提交⻚⾯时,会将这⼀ SessionID 提交到服务器端,来存取 Session数据。这⼀过程,是不⽤开发⼈员⼲预的。所以⼀旦客户端禁⽤ Cookie ,那么 Session 也会失 效。
 
占用资源:
Cookies 是属于 Session 对象的⼀种。但有不同, Cookies 不会占服务器资源,是存在客服端内存或者⼀个Cookie 的⽂本⽂件中;⽽ Session 则会占⽤服务器资源。所以,尽量不要使⽤ Session ,⽽使⽤ Cookies。但是我们⼀般认为 Cookie 是不可靠的, Cookies 是保存在本机上的,但是其信息的完全可⻅性 且易于本地编辑性,往往可以引起很多的安全问题Session 是可靠地。但是⽬前很多著名的站点也都⽤ Cookie。
 

3.8.Request和Session的区别

request存的值只能在单次请求中保存,保存的数据不能跨⻚⾯,当重定向时,request存的值会丢失

session 的数据可以 在多个⻚⾯中共享 , 即使重定向⻚⾯ , 数据不会丢失
 
会话的概念 : 从打开浏览器到关闭浏览器 , 期间访问服务器就称为⼀次会话
 
session 中可以包含 n request
 

4.过滤器(Filter)

1.什么是过滤器

过滤器实际上就是 对web资源进⾏拦截,做⼀些处理后再交给下⼀个过滤器或servlet处理 ,通常都是⽤来拦截request 进⾏处理的,也可以对返回的 response 进⾏拦截处理

2.过滤器的语法格式

创建⼀个类实现Filter接⼝

public class CharSetFilter implements Filter{}
重写接⼝中的⽅法
 
public void destroy() { //销毁的⽅法}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
 //过滤⽅法 主要是对request和response进⾏⼀些处理,然后交给下⼀个过滤器或Servlet处理
 chain.doFilter(req, resp);
 }
 public void init(FilterConfig config) throws ServletException {
 /*初始化⽅法 接收⼀个FilterConfig类型的参数 该参数是对Filter的⼀些配置*/
 }
web.xml ⽂件中配
<filter>
 <filter-name>过滤器名称</filter-name>
 <filter-class>过滤器所在的路径</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>过滤器名称</filter-name>
 <url-pattern>需要过滤的资源</url-pattern>
</filter-mapping>

先走哪个过滤器?

根据xml中配置的前后顺序

3.使⽤场景

3.1.防⽌⽤户未登录就执⾏后续操作

String name=(String)session.getAttribute("key");
if(name==null){
    //跳转到登录⻚⾯
}
3.2. 设置编码⽅式 -- 统⼀设置编码
 
3.3. 加密解密 ( 密码的加密和解密 )
 
3.4. ⾮法⽂字筛选
 
3.5. 下载资源的限制
 
过滤器的特点 : servlet 之前和之后都会被执⾏

 

下面演示拦截器拦截未登录用户的操作以及给每个servlet统一设置编码

登录页面--过滤器1开始--过滤器2开始--过滤器2结束--过滤器1过滤未登录用户和设置编码后结束--访问通过过滤的链接

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

    <filter>
        <filter-name>f1</filter-name>
        <filter-class>
            util.FirstFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
</web-app>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      <%
        //1.通过小脚本获取服务器传回的cookie
        Cookie[] cookies = request.getCookies();
        String value=null;
        //2.考虑第一次访问页面时没有cookie,出现空指针异常,给个判断
        if (cookies!=null&&cookies.length>0){
          for (Cookie cookie : cookies) {
            if (cookie.getName().equals("uname")){
              value = cookie.getValue();
              break;
            }
          }
        }
        //3.JSP页面中必须从域对象中获取动态数据,所以要先存值到域对象
        pageContext.setAttribute("unamecookie",value);
      %>
      <h1>登录</h1>
      <form action="/login" method="post">
        用户名:<input type="text" name="username" value="${unamecookie}"><br>
        密码:  <input type="text" name="password"><br>
        <input type="submit" value="login">
      </form>
  </body>
</html>

LoginServlet略,见上面

testsession.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>testsession.jsp-只有用户登录以后才能访问本页面</h1>
当前登录用户:${sessionScope.username}<br>
</body>
</html>

FirstFilter

package util;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class FirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化filter1");//当服务器启动时执行init
    }

    @Override   //请求和响应时都会执行这个方法
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器1开始");
        //1.在.xml中设置访问任何路径走的servlet都进行处理乱码
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        HttpServletResponse response=(HttpServletResponse)servletResponse;
        request.setCharacterEncoding("utf-8");

        //2.防止用户在未登录的情况下访问资源
        String requestURI = request.getRequestURI();//获得请求地址
        System.out.println("requestURI="+requestURI);
        Object username = request.getSession().getAttribute("username");
        System.out.println("过滤器获取到的session:"+username);
        //若用户访问testsession.jsp且未登录,则跳转到登录页面,否则继续访问testsession.jsp页面
        if(requestURI.endsWith("testsession.jsp")&&username==null){
            response.sendRedirect("index.jsp");
        }
        //调取下一个过滤器,或者调取servlet
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("过滤器1结束");
    }
    @Override
    public void destroy() {
        System.out.println("销毁filter");
    }
}

LoginOutServlet见上面

若是在过滤器1中发现用户没有登录,则跳转到登录页面

登录后服务器中将用户信息存入session,此时访问http://localhost:8080/testsession.jsp是可以访问到

4.注解配置过滤器

 

 

5.监听器(Listener)

5.1.什么是监听器

监听器就是监听某个域对象的的状态变化的组件
 
监听器的相关概念:
 
事件源:被监听的对象 ( 三个域对象 request session servletContext)
 
监听器:监听事件源对象,事件源对象的状态的变化都会触发监听器
 
注册监听器:将监听器与事件源进⾏绑定
 
响应⾏为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码)

 

5.2.监听器分类

第⼀维度按照被监听的对象划分: ServletRequest 域、 HttpSession 域、 ServletContext
 
第⼆维度按照监听的内容分:监听域对象的创建与销毁的、监听域对象的属性变化的

5.3.监听三⼤域对象的创建与销毁的监听器

监听器的编写步骤(重点)
 
1.编写⼀个监听器类去实现监听器接⼝
 
2.覆盖监听器的⽅法
 
3.需要在 web.xml 中进⾏配置 注册监听器
<listener>
 <listener-class>监听器所在的路径</listener-class> 
</listener>
1.ServletContextListener
 
监听ServletContext域的创建与销毁的监听器
 
Servlet域的⽣命周期
 
何时创建:服务器启动创建
 
何时销毁:服务器关闭销毁
 
2.ServletContextListener监听器的主要作⽤
 
初始化的⼯作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化)
 
加载⼀些初始化的配置⽂件 (spring 的配置⽂件)
 
任务调度 ( 定时器 —Timer/TimerTask
 
3.HttpSessionListener
 
监听 Httpsession 域的创建和销毁的监听器
 
4.HttpSession对象的⽣命周期
 
何时创建:第⼀次调⽤ request.getSession 时创建
何时销毁:服务器关闭销毁、 session 过期(默认 30 分钟,修改默认的 30分钟是在Tomcat web.xml ,修改当      前项⽬的过期时间是在⾃⼰项⽬的 web.xml 中)、⼿动销毁
 
5.HttpSessionListener监听器的主要作⽤:
 
由于每次访问⽹站都会默认创建 session 对象( jsp ⻚⾯中 page 指令中的 session 属性默认为true,即被访问时创建 session ),可以 ⽤于计数⽹站访问过的⼈
 
6.ServletRequestListener
 
监听 ServletRequest 域创建与销毁的监听器
 
ServletRequest的⽣命周期
 
创建:每⼀次请求都会创建 request
 
销毁:请求结束
 
⽤法同上,⽤处不是很⼤
 
演示监听Session域对象的创建销毁以及其属性变化
 
 
 
xml配置
 
    <!--配置监听器-->
    <listener>
        <listener-class>util.SessionListener</listener-class>
    </listener>
    <listener>
        <listener-class>util.AttributeListener</listener-class>
    </listener>

SessionListener

package util;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 监听器
 * 监听session域对象的创建销毁
 */
public class SessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session销毁");
    }
}

AttributeListener

package util;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
 * 监听器
 * 监听session域对象属性的变化
 */
public class AttributeListener implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session存值,"+httpSessionBindingEvent.getName()+","+httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session移除数据");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {

    }
}

index.jsp success.jsp  testsession.jsp LoginServlet LoginOutServlet上面已经有了

需要的包javaee-api-7.0.jar

 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值