会话跟踪技术(cookie和session)

发布于:2023-01-13 ⋅ 阅读:(417) ⋅ 点赞:(0)

目录

1.什么是会话跟踪技术

2.会话路径技术使用Cookie或session完成

3.Cookie

3.1 Cookie概述

3.2Cookie规范: 

3.3Cookie的使用:

3.4.Cookie的生命

3.5 cookie的路径

3.6Cookie默认无法存放中文

4.HttpSession

4.1HttpSesssion概述

4.2 获取HttpSession对象

4.3HttpSesssion域方法

  4.4session的实现原理

4.5 session其他常用API


1.什么是会话跟踪技术

  客户端与服务器会话的开始与结束 ,在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。

  在一个会话的多个请求中共享数据,这就是会话跟踪技术。

2.会话路径技术使用Cookie或session完成

  我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!

  在JavaWeb中,使用session来完成会话跟踪,session底层依赖Cookie技术。

3.Cookie

3.1 Cookie概述

  特征: cookie在服务器端创建的, 保存在客户端浏览器上, cookie存储数据的结构: key/value

  随着响应对象,保存到客户端浏览器上. 当后面请求, 浏览器把cookie带回到服务器, 通过请求头, cookie加请求头上

  Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端浏览器会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

3.2Cookie规范: 

  • Cookie大小上限为4KB;

  • 一个服务器最多在客户端浏览器上保存20个Cookie;

  • 一个浏览器最多保存300个Cookie;

(cookie不能跨浏览器, Chrome浏览器存放的cookie, 不能在IE浏览器使用)

3.3Cookie的使用:

cookie存:

  //在服务器创建
        Cookie cookie = new Cookie("name","zhangsan");
        //保存到客户端, 通过响应
        response.addCookie(cookie);

cookie取:  

  //获取cookie  获取服务器存放在客户端所有cookie
        Cookie[] cookies = request.getCookies();
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie: cookies){
                //获取name ,value
               // String value = cookie.getValue();
                String key = cookie.getName();
                if("name".equals(key)){
                    String value = cookie.getValue();
                    System.out.println("key:"+key+",value:"+value);
                }

            }
        }

cookie改:

如果浏览器存在一个相同的key, 把value覆盖

 例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

cookie的删除:

把cookie的maxAge设置为0

cookie的存活时间

默认的存活时间: -1 关闭浏览器之后, 删除cookie

设置cookie存活时间:

setMaxAge(int ) 设置cookie最大存活时间

n > 0, 这个cookie最大存活时间: n秒,

setMaxAge(60): 这个cookie最大存活60秒, 一达到时间, 浏览器会自动把过期cookie删除

n == 0, 这个cookie最大存活时间:0秒, 表示立即删除cookie

cookie的获取:

3.4.Cookie的生命

  Cookie生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。

  • cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。

  • cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时;

  • cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。

3.5 cookie的路径

存三个cookie:

a:cookieA的path: /hello

b:cookieB的path:/hello/servlet

c:cookieC的path: /hello/jsp

cookie设置路径:setPath()

如果没有设置Cookie的路径,那么Cookie路径的默认值当前访问资源所在路径,例如:

  • 请求A时,会在请求中包含a;

  • 请求B时,会在请求中包含a、b;

  • 请求C时,会在请求中包含a、c;  

 设置Cookie的路径需要使用setPath()方法,例如:

cookie.setPath(“/cookietest/servlet”);

判断cookie是否同一个?

1) 判断key 是否一样

2) 判断path是否一样

在实际开发中,我们的cookie的path 设置为/项目, 访问该项目下任何一个资源, 都会把所有的cookie带回到服务器

3.6Cookie默认无法存放中文

早期浏览器cookie不能使用中文, 现在浏览器支持

在实际开发中,不推荐使用cookie存放中文, 想存放中文, 使用URL编码把中文编码,再存到客户端浏览器

编码: URLEncoder

 向客户端响应中添加Cookie :

//使用URL编码
String name = URLEncoder.encode("姓名", "UTF-8");
String value = URLEncoder.encode("张三", "UTF-8");
//编码后的字符串保存到Cookie中
Cookie c = new Cookie(name, value);
c.setMaxAge(3600);
response.addCookie(c);

 从客户端请求中获取Cookie:

response.setContentType("text/html;charset=utf-8");
Cookie[] cs = request.getCookies();
if(cs != null) {
    for(Cookie c : cs) {
        //把Cookie的name和value使用URL解码后再打印
        String name = URLDecoder.decode(c.getName(), "UTF-8");
        String value = URLDecoder.decode(c.getValue(), "UTF-8");
        String s = name + ": " + value + "<br/>";
        response.getWriter().print(s);
    }
}

4.HttpSession

4.1HttpSesssion概述

  HttpSession是Javaweb四大域之一,javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!

4.2 获取HttpSession对象

  • HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回;

  • HttpSession request.getSession(boolean):当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在session则返回,不存在返回null;

4.3HttpSesssion域方法

  我们已经学习过HttpServletRequest、ServletContext,它们都是域对象,现在我们又学习了一个HttpSession,它也是域对象。它们三个是Servlet中可以使用的域对象,而JSP中可以使用一个Page域对象

  • HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据;

  • ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不启动服务器,那么ServletContext中的数据就可以共享;

  • HttpSession:一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;

下面是session的域方法:

  • void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

  • Object getAttribute(String name):用来获取session中的数据,当前在获取之前需要先去存储才行,例如:String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性;

  • void removeAttribute(String name):用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

  • Enumeration getAttributeNames():获取所有域属性的名称;

  4.4session的实现原理

  session底层是依赖Cookie的!

  当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。

  当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。

4.5 session其他常用API

  • String getId():获取sessionId

  • int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session;

  • void setMaxInactiveInterval(int interval):设置session允许的最大不活动时间(秒),如果设置为1秒,那么只要session在1秒内不被使用,那么session就会被移除;

  • long getCreationTime():返回session的创建时间,返回值为当前时间的毫秒值;

  • long getLastAccessedTime():返回session的最后活动时间,返回值为当前时间的毫秒值;

  • void invalidate():让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的sessionId;

  • boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。


网站公告

今日签到

点亮在社区的每一天
去签到