Session&Cookie

  Session for Java                            

session是什么?

HTTP 协议是一种无状态协议。 客户向服务器发出请求 request,然后服务器返回响应 response,连接就被关闭了。在服
务器端不保留连接的有关信息,因此当下一次连接时,服务器端已没有以前的连接信息了,无法判断这一次连接和以前
的连接是否属于同一个客户。因此,必须使用会话记录有关连接的信息。
从客户打开浏览器连接到服务器,到客户关闭浏览器离开这个服务器,称做一个 会话。当客户访问服务器时,可能会反
复连接这个服务器上的几个页面、反复刷新一个页面或不断地向一个页面提交信息等,服务器应当通过某种方法知道这
是同一个客户,这时就需要 session 对象。
Session(会话)是 Servlet 规范里用来解决 Http 协议无状态这个问题而提出的服务器端解决方案。
Session 对象存在于服务器 HttpSession,服务器为每个会话创建一个 HttpSession 对象,每个会话对象都有
一个唯一的 ID,把用户的数据保存在相应的 HttpSession 对象。
Session 是服务器端技术,利用这个技术服务器在运行时可以为每一个用户的浏览器创建一个独享
的 session 对象,由于 session 为用户独享,所以用户在访问服务器的 web 资源时,可以把各自的数据
放在各自己的 session 中,当用户再去访问服务器中的其它 web 资源时,其它 web 资源再从用户各自
的 session 中取出数据为用户服务。
session 对象用于在会话范围内,记录每个客户端的访问状态,以便于跟踪每个客户端的操作状
态。在会话中存储的信息,在浏览器发出后续请求时可以获取这些会话的有效数据。
在 jsp 页面中可以直接使用 session 对象,也可以通过 pageContext.getSession()或
request.getSession()方法重新获取 session 对象。
session 对象可以保存用户的登录信息,实现购物车功能等。

session的工作原理

客户首次访问服务器的一个页面时,服务器就会为该客户分配一个 session 对象,同时为该 session 对象指定一个唯一
的 ID,并且将该 ID 号发送到客户端并写入到 cookie 中,使得客户端与服务器端的 session 建立一一对应关系。
当客户继续访问服务器上的其他资源时,服务器不再为该客户分配新的 session 对象,直到客户端浏览器关闭、超时
或调用 session 的 invalidate()方法使其失效,客户端与服务器的会话结束。
当客户重新打开浏览器访问网站时,服务器会重新为客户分配一个 session 对象,并重新分配 sessionID。

要点:Session 是存放在服务器的内存中。一个用户浏览器(客户
端),独享一个 session 域对象。Session 的生命周期默认为
30 分钟。

session对象的生命周期

    session的创建

        浏览器访问服务器时,服务器为每个浏览器创建不同的 session 对象

    session的关闭    

        调用 session. invalidate()方法,使 session 对象失效

        访问时间间隔大于非活动时间间隔, session 对象失效

        关闭浏览器时,session 对象失效

创建(获取)session对象

    HttpSession session = request.getSession();

 session常用的方法

方法 说明
request.getSession(true)

返回与当前请求关联的会话,如果有那么就返回该会话,如果没有就创
建一个新会话

request.getSession()  request.getSession(true)的简写版
request.getSession(false) 返回与当前请求关联的会话,如果有就返回该会话,如果没有就返回 null

void setAttribute(String
name,Object object)

设定指定名字的属性的值,并将它添加到 session 会话范围内,如果这个
属性是会话范围内存在,则更改该属性的值。

Object getAttribute(String
name)

 

在会话范围内获取指定名字的属性的值,返回值类型为 object,如果该属
性不存在,则返回 null。

 

void removeAttribute(String
name)

 删除指定名字的 session 属性,若该属性不存在,则出现异常
 String getId()  

获取当前的会话 ID。每个会话在服务器端都存在一个唯一的标示
sessionID,session 对象发送到浏览器的唯一数据就是 sessionID,它一般
存储在 cookie 中。

 void invalidate()   

使 session 失效。可以立即使当前会话失效,原来会话中存储的所有对象
都不能再被访问。

boolean isNew()  判断 session 是否新创建的

public void
setMaxInactiveInterval(int
interval)

设置会话的最大持续时间,单位是秒,负数表明会话永不失效。

int max = session.getMaxInactiveInterval();

获取会话的最大持续时间

long t = session.getCreationTime();

获取回话创建的时间

long lt = session.getLastAccessedTime();

获取上次访问的时间

 session小结

1. session是存在服务器的内存中的

2. 一个用户浏览器独享一个session域对象

3. session中的属性的默认生命周期是30min,可以通过在web.xml中修改

4. 3中session生命周期的设置

    (1) 一个地方是 tomcat/conf/web.xml

        <session-config>
            <session-timeout>30</session-timeout>//表示 30 分钟的意思
        </session-config>

        对所有的 web 应用生效

    (2) 另外一个地方,就是在单个 web 应用的下去修改 web.xml

        <session-config>
            <session-timeout>30</session-timeout>session
        </session-config>
        如果发生冲突,则以自己的 web 应用优先级高

    (3) session.setMaxInactiveinterval(60) 六十秒后 session 失效

5. session中可以存放多个属性

6. session可以存放对象

7. 如果 session.setAttribute("name", val); 如果名字重复则会替换掉该属性

  Cookie for Java                                  

Cookie概述

服务器在客户端保存用户的信息,比如登录名,密码等,就是 cookie。Cookie(小甜饼)是客户端技
术,服务器把每个用户的数据以 cookie 的形式写给用户各浏览器。当用户使用浏览器再去访问 web 资
源时,就会带着各自的数据去。这样 web 资源处理的就是用户各自的数据了。
Cookie 是一种应用已经很久的技术了。所谓的 Cookie 是一个小的文本文件,它以 key=value 的形
式将上下文的状态信息记录下来,然后这个小的文本文件将保存到客户端的存储器上去。
Cookie 的工作机制与上面两种基本相同,也是在发送下一个请求的时候,将这些状态信息发送给
服务器,以达到维护上下文状态的功能。但是 与前面两种用法不同的是 Cookie 的信息是放到 HTTP 协
议的报头中进行传送的。也就是说 Cookie 信息是服务器利用 HTTP 响应的报头把一些键值对 发送给浏
览器,浏览器再将这些信息存储到一个临时的文本文件中,等到浏览器每次请求这个服务器的时候,
就会把 Cookie 的信息发给服务器,让服务器通过 这些信息来维护上下文的状态。

创建Cookie对象

Cookie c = new Cookie("user", "timo");    // Cookie的名字跟值都不能包含空白字符和下列字符:, " / ? @ : ;

Cookie对象的常用方法

方法 说明
getComment/setComment 获取/设置 Cookie 的注释
getDomain/setDomain

获取/设置 Cookie 适用的域。一般地,Cookie 只返回给与发送它的服务器名字
完全相同的服务器。使用这里的方法可以指示浏览器把 Cookie 返回给同一域
内的其他服务器。

getMaxAge/setMaxAge

获取/设置 Cookie 过期之前的时间,以秒计。如果不设置该值,则 Cookie 只在
当前会话内有效,即在用户关闭浏览器之前有效,而且这些 Cookie 不会保存
到磁盘上

getName/setName  获取/设置 Cookie 的名字
getValue/setValue  获取/设置 Cookie 的值

服务器端把 Cookie 发送给浏览器可以使用下面的示例代码:

1 Cookie userCookie = new Cookie("user", "timo");   // name =》 timo
2 userCookie.setMaxAge(60*60*24);    // 设置cookie过期时间
3 response.addCookie(userCookie);

当服务器收到客户端的请求的时候可以采用下面方法获取Cookie

1 Cookie[] cookies = request.getCookies();

request.getCookies()方法返回的是 Cookie 类型的数组。在这个数组中包含了客户端发送过来的所有 Cookie。如果浏览器
发送过来的请求没有 Cookie,得到的 Cookie 类型的数组为 null。
Cookie 使用上仍然有一些问题需要解决。比如:Cookie 的安全性问题。因为 Cookie 强大且具有持续性,因此可以长时
间追踪用户,甚至是一个用户的每次请求。这种能力能够在用户没有任何察觉的情况下,掌握用户的一举一动。有些人
不想让别人掌握自己的浏览行为,在浏览器的设置中可以轻易地选择不接受任何 Cookie。一旦用户这样设置了,那么就
没有办法使用 Cookie 来进行会话跟踪了。

cookie.setPath & cookie.setDomain

javax.servlet.http.Cookie 有两个比较重要的方法:setDomain()、setPath()
正常的 cookie 只能在一个应用中共享,即一个 cookie 只能由创建它的应用获得。

1.可在同一应用服务器内共享方法:设置 cookie.setPath("/");
本机 tomcat/webapp 下面有两个应用:webapp_a 和 webapp_b,
    1)原来在 webapp_a 下面设置的 cookie,在 webapp_b 下面获取不到,path 默认是产生 cookie 的应用的路径。
    2)若在 webapp_a 下面设置 cookie 的时候,增加一条 cookie.setPath("/");或者 cookie.setPath("/webapp_b/");
         就可以在 webapp_b 下面获取到 cas 设置的 cookie 了。
    3)此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如 tomcat 下面的 webapp),因此
         cookie.setPath("/"); 之后,可以在 webapp 文件夹下的所有应用共享 cookie,而 cookie.setPath("/webapp_b/");
         是指 cas 应用设置的 cookie 只能在 webapp_b 应用下的获得,即便是产生这个 cookie 的 webapp_a 应用也不可以。

    4)设置 cookie.setPath("/webapp_b/jsp")或者 cookie.setPath("/webapp_b/jsp/")的时候,只 有在 webapp_b/jsp
         下面可以获得 cookie,在 webapp_b 下面但是在 jsp 文件夹外的都不能获得 cookie。
    5)设置 cookie.setPath("/webapp_b");,是指在 webapp_b 下面才可以使用 cookie,这样就不可以在产生 cookie 的应
         用 webapp_a 下面获取 cookie 了
    6)有多条 cookie.setPath("XXX");语句的时候,起作用的以最后一条为准。

2. 跨域共享 e cookie  的方法:设置 cookie.setDomain(");

    A 机所在的域:hom,A 有应用 webapp_a
    B 机所在的域:jszx.com,B 有应用 webapp_b
    1)在 webapp_a 下面设置 cookie 的时候,增加 cookie.setDomain(");,这样在 webapp_b 下面就可以取到 cookie。
    2)输入 url 访问 webapp_b 的时候,必须输入域名才能解析。比如说在 A 机器输入:,可以获取 webapp_a 在客户端设置
         的 cookie,而 B 机器访问本机的应用,输入:http://localhost:8080/webapp_b 则不可以获得 cookie。
    3)设置了 cookie.setDomain(");,还可以在默认的 hom 下面共享

cookie的缺点

① 保存在客户端的 Cookies 会在每个 HTTP 请求中都要附带发送,导致网络传输数据增大,影响性能。
② 在 HTTP 请求以明文发送 Cookies,除非使用安全协议(HTTPS),否则会有安全问题。
③ Cookies 的大小限制在 4KB(新版本放松至 8 KB)左右,难以保存复杂的会话跟踪信息。
④ 用户可以改变浏览器的设置,启用或禁用 Cookies。如果用户禁用 Cookies,服务器就无法将 Cookies 保存至客户端,
从而无法使用 Cookies 来跟踪会话状态。
⑤ 安装在客户端的 Cookies 具有安全缺陷。一些浏览器自带或安装开发者工具包允许用户查看、修改或删除特定网站的
Cookies 信息。黑客可能采用跨站点脚本技术盗取用户的 Cookies 信息,可能给用户造成经济或其他损失。

cookie小结

1. cookie是在服务端创建

2. cookie是保存在浏览器端

3. cookie的生命周期可以通过 coolie.setMaxAge(2000) 设置,如果不设置,则当浏览器关闭时就消亡

4. cookie可以被多个浏览器共享(与session的区别)

5. 一个web应用可以保存多个cookie,但保存在同一个cookie文本的客户端浏览器下

7. cokie存放时以明文存放,安全性较低

cookie和session的联系

区别

1、cookie 数据存放在客户的浏览器上,文件里面,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗
考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,
应当使用 COOKIE。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。

联系

session 是通过 cookie 来工作的
session 和 cookie 之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道 session 的
id,从而获取到其他的信息。
在购物网站中通常将用户加入购物车的商品联通 session_id 记录到数据库中,当用户再次访问是,通过 sessionid 就
可以查找到用户上次加入购物车的商品。因为 sessionid 是唯一的,记录到数据库中就可以根据这个查找了。

猜你喜欢

转载自www.cnblogs.com/Myarticles/p/8997430.html