cookie&session

1会话的概述

1.1什么是会话

Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程。例如,一个用户在某网站上的整个购物过程就是一个会话。

1.2什么是cookie

    在Web应用中,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中。这样,当该浏览器再次访问服务器时,都会在请求头中将cookie发送给服务器,方便服务器对浏览器做出正确的响应。

    服务器向客户端发送cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段。Set-Cookie头字段中设置的cookie遵循一定的语法格式:Set-Cookie: user=itcast; Path=/;

User表示Cookie的名称,itcast表示Cookie的值,Path表示Cookie的属性。注意:Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号;和空格分隔。

当用户第一次访问浏览器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器。一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存在浏览器的缓冲区中,这样,当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie的形式发送给Web服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。

 

1.3 Cookie的基本使用

Cookie是将用户的信息保存到客户端浏览器的一个技术,当下次访问的时候,浏览器会自动携带Cookie的信息发送到服务器端。

Cookie的基本使用如下:

创建cookie:

New Cookie(name, value)  javax.servlet.http.Cookie

将cookie发送给浏览器:

HttpServletResponse.addCookie(javax.servlet.http.Cookie)

接收浏览器携带的所有cookie:

HttpServletRequest.getCookies( )

1.4 Cookie的分类

会话级别的Cookie:默认的。关闭了浏览器Cookie就销毁了。

持久级别的Cookie:需要设置有效时长。关闭浏览器也不会销毁。

setMaxAge(int expiry); 以秒为单位的时间,超过了该时间后Cookie会自动销毁。setMaxAge(0);手动删除持久性的Cookie(前提:path和name必须一致)   setPath(String uri); 设置Cookie的有效路径。

Cookie唯一标识:

domain+path+name

domain域名,不同的网站使用的是不同的域名,cookie不同

path路径,通过cookie.setPath(...)设置的内容

name是cookie的名称,通过new Cookie(name, ...)确定的内容

以下表示的是两个cookie,可以同时存在

/web/a/b/cookieName

/web/a/cookieName

如果路径和名称一样,两次addCookie(),后者将覆盖前者。

1.5 Cookie的API

方法名

描述

getName()

获得cookie名称

getValue()

获得cookie的值

setMaxAge(int expiry)

设置cookie的有效时间

如果没有设置,cookie只缓存在浏览器缓存中,浏览器关闭则cookie删除。

如果设置有效时间,在时间范围内,cookie被写入到浏览器端,关闭浏览器下次访问仍可获得,直到过期。

setPath(java.lang.String uri)

设置cookie允许被访问的路径。设置的路径以及子路径都被允许访问     常见设置:setPath(“/”);当前tomcat下的所有web项目都可以访问

 

2 session的概述

2.1什么是session

当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。

注意:由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。

2.2为什么要使用会话

使用servlet生成验证码时,我们需要在服务器记录一份生成的随机字符,当用户提交填写的数据时,将用户输入的数据和服务器缓存的数据进行对比。

(1)如果将数据放到ServletContext中,多个用户共享一个验证码。

(2)如果将数据放到request作用域中,多次请求不能共享数据。

所以将数据存到ServletContext或request是存在问题的,此时需要使用会话技术保存用户的私有信息。

2.3 cookie和session的选取

Cookie是有大小和个数的限制的,Session是存到服务器端的技术,没有大小和个数的限制。

Cookie相对于Session来讲不安全。

2.4如何使用Session

Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式,具体如下:

public HttpSession getSession(boolean create)

Public HttpSession getSession()

上述重载的两个方法都用于返回与当前请求相关的HttpSession对象。不同的是,第一个getSession()方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。第二个getSession()方法在相关的HttpSession对象不存在时总是创建新的HttpSession对象。

HttpSession接口中的常用方法:

String getId() 用于返回与当前HttpSession对象关联的会话标识号。

long getCreationTime()返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式。

long getLastAccessedTime()返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式。

void setMaxInactiveInterval(int interval)用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔。

boolean isNew()判断当前HttpSession对象是否是新创建的。

void invalidate()用于强制使Session对象无效。

ServletContext getServletContext()用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象。

void setAttribute(String name, Object value)用于将一个对象与一个名称关联后存储到当前的HttpSession对象中。

String getAttribute()用于从当前HttpSession对象中返回指定名称的属性对象。

Void removeAttribute(String name)用于从当前HttpSession对象中删除指定名称的属性。

 

3 Servlet三个作用域的总结

3.1 Servlet针对一个WEB应用

一个WEB应用只有一个ServletContext对象,使用该对象保存的数据在整个WEB应用中都有效。

创建:服务器启动的时候

销毁:服务器关闭的时候或者项目被移除的时候

3.2 HttpSession针对一次会话

使用该对象保存数据,一次会话(多次请求)内数据有效。

创建:服务器第一次调用getSession()方法的时候,服务器创建session对象。

销毁:(1)非正常关闭服务器(正常关闭:Session被序列化)

(2)Session过期了。默认时间是30分钟

(3)手动调用Session的invalidate()方法

3.3 HttpServletRequest针对一次请求

使用该对象保存数据,一次请求(一个页面,如果是请求转发多个页面)内数据有效。

创建:客户端向服务器发送一次请求

销毁:服务器为这次请求做出响应之后,销毁request

3.4三个作用域对象操作的API相同

存放数据:setAttribute(name, value);

获取数据:getAttribute(name);

删除数据:removeAttribute(name);

 

转载于:https://my.oschina.net/jinyeyaonitian/blog/826806

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值