浅谈Cookie与Session技术

Cookie与Session技术

一、    什么是状态管理

将客户端与服务器之间多次交互当做一个整体来看,并且将多次交互所涉及的数据(状态)保存下来。

会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选项卡,弹出页面都属于这个会话,且共享同一个session

注意:具体会话和浏览器版本,厂商有关,如IE7及以下,每开一个浏览器都创建一个新的session,而IE8及以上,则实现多个浏览器共享同一个session。因为IE8及以上,都共享同一个进程,只开辟一个内存空间。目前较多主流的浏览器都实现同一台主机上的多个浏览器,共享同一个进程。

二、    如何进行状态管理

方式一:将状态保存在客户端。

方式二:将状态保存在服务器端。

 

三、cookie技术(客户端技术)

(1)什么是cookie

a、       cookie是一种客户端的状态管理技术

b、       当浏览器向服务器发送请求的时候,服务器会将少量的数据以set-cookie

b、息头的方式发送给浏览器,当浏览器再次访问服务器时,会将这些数据以cookie消息头的方式发送给服务器。

(2)如何创建一个cookie

Cookie c = new Cookie(String name,String value);

response.addCookie(c)

默认情况下,cookie保存在浏览器内存中

(3)cookie的查询

Cookie[] request.getCookies();

注意:该方法有可能返回null

String cookie.getName():查找cookie的名字

String cookie.getValue():查找cookie的值

(4)cookie的生存时间

cookie.setMaxAge(int seconds)cookie的保存时间

seconds>0:浏览器会将cookie保存在硬盘上,超过指定时间会删除该cookie

seconds<0:缺省值,只将cookie保存在内存中,只要浏览器不关闭,cookie就一致保存,浏览器一旦关闭,cookie就会被清空。

seconds=0:立即删除cookie,如要删除一个叫userIDcookie,那么可以这么做:

Cookie c = new Cookie("userID","");

c.setMaxAge(0);

response.addCookie(c);

(5)cookie的编码问题

cookie只能保存ascii字符,对于不合法的字符(如中文)需要转换成ascii

例:Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名","utf-8"));

(6)cookie的路径问题

a、       什么是cookie的路径问题?

浏览器在向服务器发送请求时,会比较cookie的路径要与访问的服务器的路径是否匹配,只有匹配的cookie才会发送给服务器。

b、       cookie的默认路径

默认路径等于创建该cookie的组件路径

c、        匹配规则

浏览器要访问的路径必须是cookie的路径或者其子路径时,才会发送对应的cookie

d、       设置cookie的路径

cookie.setPath(String path)

如:cookie.setPath("/appname");这样保证这个cookie可以被整个web应用访问。

(7)cookie

setDomain:设置cookie域,指的是访问某个域的时候,才会带入cookie,访问其他域,不会带入cookie

默认会禁止该设置,因为安全性较差,如,访问baidu.combaidu.com写一个域是google.comcookie,那么访问google.com的时候会带入baidu.comcookie,从而会实现攻击的效果。

(8)cookie的限制

a、       cookie可以被用户禁止

b、       cookie不完全,敏感数据,比如密码、账号等需要加密。

c、        cookie的大小有限制,大约为4K左右

d、       cookie的个数也有限制,大约是300个左右

e、        每个站点最多保存20cookie

f、         cookie只能够保存字符串。

 

四、    session技术(服务器端)

(1)什么是session

a、       session是一种服务器端的状态管理技术。

b、       session是基于cookie的技术。

c、        当浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id号,称之为sessionId)服务器在默认的情况下,会将sessionIdcookie的方式,发送给浏览器,浏览器会将sessionId保存到内存中。当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器依据sessionId就可以找到之间创建的session对象。

(2)如何获取session对象?

方式一:

HttpSession s = request.getSession(boolean flag);

flag=true时,服务器会先查看请求当中有没有sessionId,如果没有,则创建一个session对象。如果有,会依据sessionId查找对应的session对象。如果找到,则返回该session对象,如果找不到,则创建一个新的session对象。

flag=false时,服务器会先查看请求当中有没有sessionId,如果没有则返回null,如果有,会依据sessionId查找对应的session对象。如果找到,则返回该session对象,如果找不到,返回null

 

方式二:

HttpSession s = request.getSession();

等价于request.getSession(true);

(3)常用方法

// 得到sessionID

String serssion.getId();

// obj最好实现序列化Serializable接口,应为服务器在持久化session时,会使用java序列化协议。

session.setAttribute(String name,Object obj);

// 如果name不存在则返回null

session.getAttribute(String name);

// 删除session中的指定属性

session.removeAttribute(String name);

(4)session超时

所谓session的超时,指的是服务器会将空闲时间过长的session对象从内存空间删除掉,原因是过多的session对象会影响程序的正常运行,会占用服务器的内存空间。

大部分服务器都会有一个缺省的超时限制,一般是30分钟,可以修改服务器的缺省超时限制。如修改tomcatsession超时时间,可以在conf/web.xml中的<session-config>中修改。

       <session-config>

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

</session-config>

也可以将以上配置放到某个WEB应用的web.xml中,这样可以特定设置某个WEB应用的session超时时间。

另外,还可以通过session.setMaxInactiveInterval(int seconds);设置session的超时时间。

(5)session的生命周期

session的创建:当用户访问某个可以创建sessionservlet的时候,该servlet才会创建session

session超过默认时间或用户指定的session时间后,session才会消亡。

 

(6)删除session

session.invalidate();

(7)持久化session方案

session默认是存储在浏览器内存中,默认时间是30分钟(根据不同的WEB服务器设置而定)。且session也是通过cookie来实现发送到浏览器内存中的。所以可以考虑用cookie来替换该session。如果用户在中途关闭浏览器的话,那么session就随着浏览器内存的释放而释放,那么如果想持久化session的话,可以考虑使用cookie技术。

Step1、获取sessionID

Step2、通过JSESSIONID,然后将sessionID的值写入cookie,在通过设置保存时间,路径,来持久化该session

(8)URL地址编码(用户禁用cookie的解决办法)

如果用户禁用了cookie,那么在编写超链接的时候,必须使用URL编码,即:response. encodeURL(url);

什么是URL重写?

简单的说,如果某个组件需要session机制的支持,且用户禁止了cookie,则不能直接使用该组件的地址去访问,而应该使用服务器生成的组件的地址(会在组件的地址后面添加sessionId)去访问。

如何重写?

用在连接地址,表单提交地址。

response.encodeURL(String url);

如果是重定向。

sesponse.encodeRedirectURL(“list.jsp”);

这样编译过的URL地址就会自动在后面添加用户sessionid号,那么所有的连接地址就会按如下格式进行输出,即每个地址都记录了用户的信息:href='/JavaWeb/servlet/BuySession;jsessionid=283087307F0E79CC62208BDCF79FC52A'

这种方式不能实现用户数据持久化。

(9)session的相关细节

如果即使用了URL地址编码,也设置了写出cookie,那么第一次访问的时候服务器会即带入cookie同时也进行URL地址编码,当再次访问服务器时,服务器已经判断出了浏览器是否禁用了cookie,如果没有禁用,则使用cookie写入的方式,如果禁用了则使用URL地址编码的方式

(10)      session的优缺点

优点:

1、        session相对安全。

2、        session能够保存的数据类型更丰富。

3、        session能够保存的数据大小没有限制。

 

缺点:

1、        session需要将所有数据写在服务器端,所以服务器会占用过多的内存空间,会影响服务器性能。可以考虑使用cookie或数据库来保存数据。

(11)      session案例

a、    session登录验证

step1、在登录成功以后,在session对象上绑定数据,比如:session.setAttribute(“user”,user)

step2、对需要保护的资源(只有登录成功以后才能访问的资源,比如主页),添加session验证代码:

Object obj = session.getAttribute(“user”);

If(obj==null)就跳转到登录界面

b、    验证码

生成一个验证码,然后将验证码存储到session中,然后从session中取出验证码与客户提交的验证码进行比对,这是一个典型的session应用


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值