会话跟踪技术

1.cookie技术

认识Cookie(servlet)

概念:

在程序中 cookie 就是保存在客户端的少量数据,由服务器下发。浏览器的机制是,每次访问某个网站的时候就会把这个网站中所有的cookie自动上传。

(1) 读取cookie

Cookie cks[] = request.getCookies();

if (cks != null) {

for (Cookie cookie : cks) {

System.out.println(cookie.getName() + "-->" + cookie.getValue());

}

}

 

(2) 构建cookie对象

Cookie c = new Cookie("date", new SimpleDateFormat("yyyyMMddHH:mm:ss").format(new Date()));

<1>存活时间

c.setMaxAge(60 * 60 * 24);

A.如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效

Cookie默认的maxAge值为-1

B.如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除

C.ck.setMaxAge(数字);//设置cookie的存活时间 单位为秒(Second)

// 什么路径下访问,cookie每次会被浏览器自动携带到服务器上

// 在服务器的什么路径下可以访问到当前的cookie

        <3>作用域

                c.setDomain("/");

        <2>路径

c.setPath("/");

// 向客户端下发cookie

response.addCookie(c);// 必须要有,否则cookie只存在于服务器内存

创建Cookie

<%@ page language ="java" pageEncoding="UTF-8"%>

<%

      Cookie cookie=new Cookie("UserName","Tom");//创建对象

      cookie.setMaxAge(60*10);//设置存活时间

       response.addCookie(cookie);//将Cookie发送给客户端

%>

 

读取Cookie

<%@ page language="java" pageEncoding="UTF-8"%>

<%

       Cookie [ ] cookies=request.getCookies();

        if(cookies!=null){

               for(int i=0;i<cookies.length;i++){

                       Cookie cookie=cookies[ i];

                        if("UserName".equals(cookie.getName())){

                                out.print(cookie.getValue());

                                 break;

                              }

                        }

                   }

%>

2.session技术

 session与cookie相反,session是存储在服务器端的,session理论上可以存储任意java对象

 

session的获取

HttpSession session=request.getSession();

session的读取数据

session.setAttribute("unameabc", uname);

session.getAttribute("unameabc");

 

session原理

session是基于cookie的。当客户端向服务器端发送请求之后,服务器端获得session的时候,机制是如此的:服务器端会根据客户端的cookie name JSESSIONID获取服务器对应的 session对象,如果没有找到,则创建一个session,并且创建一个JSESSIONID,且将JSESSIONID这个cookie和值下发给客户端。

当客户端下一次请求服务器的时候,客户端会自动上传JSESSIONID这个cookie对象。服务器根据JSESSIONID对应的值找到存储再服务器端内存中的session对象。继而实现会话跟踪。

总之:session是保存再服务端的数据,它是基于cookie技术的。

session是保存再服务器端内存中的数据,session的本质是通过map集合对数据进行管理。

session如果长久驻留内存,则会引发内存泄漏的风险。

 

在servlet中只要获取了session

HttpSession session = request.getSession();

如果客户端有对应的session,则直接返回对应的session。

否则会创建一个新的session,并且下发sessionid值,给一个叫做JSESSIONID的cookie 值就是 session的id。

以后客户端cookie JSESSIONID 与服务器 session进行查找。

因为session是在服务器端内存中的,所以谨慎操作session,因为大数据量如果存放在session中会导致内存溢出。

 

 

session的失效方式:

1.浏览器关闭;

2.服务器关闭;

3.session失效时间设置

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

  <display-name>test</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

   

  </welcome-file-list>

  <session-config>

  <session-timeout>20</session-timeout>

//20单位分钟,设定session的请求最大间隔为20分钟,如果调用session对象的setMaxInterval方法来设定session请求间隔大小,那么将覆盖xml配置的时间

  </session-config>

</web-app>

4.杀会话:

session.invalidate()是杀掉会话

 

 

<%@page contentType="text/html"%>

<%@page pageEncoding="UTF-8"%>

<%

String sessionId=session.getId();

//获得当前session的sessionID

out.print("sessionId:"+sessionId+"<br/>);

if(session.isNew()){

//判断当前session是否是一个新的session

out.print("这是一个新的session");

 

}else{

out.print("这是一个老的session");

}

Date createDate= new Date(session.getCreationTime());

//获得当前session创建时间

Date lastAccessDate=new Date(session.getlastAccessedTime());

//获得客户端最后一次请求服务器的时间

out.print("最后访问的时间为:"+lastAccessDate.toString()+"");

out.print("session 最大请求间隔时间:"+session.getMaxInactiveInterval()+"");

String name=(String)session.getAttribute("name");

//根据key从session中获取对象

session.setAttribute("name","Tom");//存储对象

session.removeAttribute("name");//删除对象

session.invalidate();//强制session过期

%>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值