jsp(11)(cookie 和session的使用,MD5,BASE64)

比如用户在不同页面购买商品,统一结账时候,需要获得选择的商品,这些商品信息应该存放在哪里?
1.常用cookie和session保存用户数据


2.cookie对象

上面方法的意思:
MaxAge:代表cookie的有效时间(秒)。默认浏览器关闭,cookie有效期结束
Path:代表有效路径,即:哪些路径下的访问浏览器会携带cookie。默认是访问是servlet所在目录。
Domain:代表有效域(如:sina.com),即该cookie对访问哪个域名有效,一般浏览器默认做检查,设置非当前网站为cookie域将无效。
浏览器在访问页面的时候会自动携带cookie给服务器:
(过程是首先访问服务器,不存在cookie,服务端在消息头中把cookie发送给客户端,然后客户端第二次访问的时候,浏览器会自动携带cookie(未过期,满足路径的))

cookie细节补充:
1.信息至少包含键值:

2.一个浏览器一般最最多300个cookie,一个网站最多20个cookie,一个cookie最大4k。

3.默认cookie是会话级别,设置maxAge有效时间(秒),值为0 标识删除该cookie

删除一个cookie实例:(也可以在客户端用js删除)
步骤:
1.首先要创建一个与需要删除同名的cookie。 2.设置maxAge为0。 3.path必须和需要删除的cookie一致。 4.将cookie对象添加到response中,服务器发送给浏览器。浏览器会将该信息对应cookie删除。

一个浏览商品记录案例:(cookie常用用户保存登陆,购物商品,浏览商品等)
(将浏览过的商品显示出来,并且只显示3条,并且将最近访问的显示在最前面)
1.访问商品列表页面,获取cookie值,如果不存在,不显示)



2.访问具体商品页面时候(可以用一个servlet根据商品id来显示具体商品信息),分情况:
2.1.cookie不存在,即:第一次访问时,创建cookie,保存商品id
2.2.已经存在cookie,又分情况:该商品是否已经访问过,是否超过纪录的数目,第一访问该商品
如果存在,将cookie列表值里的值去掉,将当前商品Id放入第一个位置。



//得到cookie的字符串,分割成列表进行处理
//将列表还原成字符串作为cookie的值。
session:创建时机是程序调用getSession()方法时才创建!
是针对浏览器一次打开,重新打开浏览器是两个不同会话了。(一般情况)

session的销毁,是在浏览器关闭半小时或者长时间不用服务器自动摧毁。
1.可以通过项目配置WEB-INF/web.xml配置session多长时间销毁:

2.可以代码设置销毁:

session获取的两种方式:

1.表示:如果有,返回已经创建的session,如果没有,就创建。 2.表示:只是返回存在的session,如果没有,不会创建(可以用于:在首页查看session中要购买的商品时候)
session的原理是:
访问服务端获取session时,服务器会创建一个session对象,并且每个session有一个ID,
然后服务器会自动以cookie的形式(名叫JSESSIONiD的cookie)在响应头中给浏览器,下次访问其实根据该cookie取对应的session。
(浏览器在写cookie时候,其实不仅只是设置自定义的数据,还有浏览器自己添加的一些数据,用以浏览器判断当前cookie是哪个浏览哪次浏览器打开后才创建的,这就是默认情况重新打开浏览器会不采用已有cookie的原因,通过自定义时间却不会出现重新打开浏览器不采用已有cookie的情况,如下)
这样有个几个问题:
1.就是默认浏览器关闭cookie销毁,那么session获取不到Id,意味session也变无用了。
解决无意造成浏览器关闭的问题:可以通过设置cookie的有效时间来解决:

用一个同名的新cookie来覆盖原来的cookie
2.当浏览器禁用cookie如何获得session问题
(最好需要用127.0.0.1,测试时用localhost访问设置禁用cookie有可能是不会禁止的【这个跟操作系统有关系,有些是可以】

可以通过URL重写(链接参数的方式带着sessionid),可以用response.encodeURL()方法处理链接。


注意:首先需要获得session对象,然后才会在encodeURL()方法中编入sessionId.
点击该链接,服务端会自动获取其中的sessionId,在获取session时,匹配对应的session对象。
(即:服务器会自动查询cookie名字是sessionId,和链接的sessionId)
补充:关于encodeURL()方法,
当对链接进行了URL编码(加sessionId),如果没有禁用cookie,第一次访问有getsession()的网页时,因为不存在cookie,没有携带cookie,那么encodURL()方法编码返回值会加上sessionId的,同时服务端也会写cookie到浏览器,再访问的时候,服务端判断有cookie传过来,encodeURL()编码后的链接就不会加上sessionID了,
如下未经用cookie,再次访问查看该链接时:

补充:如果采用URL编码的方式,重新打开浏览器,获取到的是一个新的session。(因为你的链接和cookie中都没有sessionId,会分配一个新session)
补充:关于每次浏览器打开对应一个session,也不是绝对,针对不同浏览器也是不同的。(比如IE8,多次打开浏览器使用的仍然是同一个session)
关于使用session还是cookie问题:
大型购物网站一般使用cookie,可以降低服务器压力。
使用session 注意几种情况:
1.没有禁用cookie,默认情况,关闭浏览器session结束,新开浏览器对应新的session 2.没有禁用cookie.设置了cookie有效时间,重新打开浏览器是同一个session 3.禁用cookie,对URL编码携带sessionID的情况。 一般应该是优先 采用cookie,之后用第3种session做补充来保证禁用cookie的情况.
下面是一个简单使用session购物的例子:
1.显示商品页:2种情况
1.1:传统session配合cookie
:
1.2:cookie被禁,采用URL编码来使用session:

补充:使用URL编码,记得先获得session对象!
2.购买业务处理的2种情况:
2.1:使用默认的session配合cookie的支持

2.2:cookie被禁,采用URL编码来使用session:

补充:两个细节:1.转发和常规编码的方法不一样;2.获取项目的名称的方法很有用处。
3.购买结果显示:
;
session登陆的例子:
1.登陆:即,判断,添加登陆标记:

2.注销,即:移除登陆标记:

重复表单提交的问题:
js方式:


服务器方式:
(服务端给表单一个编号(即:令牌,通过md5和base64方式获得)记录起来,等表单提交,对编号进行比较,成功后清除记录的表单号,重复提交(后退或者刷新页面)进行判断,是否表单号匹配)
MD5:数据摘要(数据指纹),一个固定128位(16字节)的数据。
(目的是,所有的数据都会得到一个唯一且统一长度的概要)
md5:应用:
1.对密码进行“加密”(严格来说不算加密,只是得到一份数据指纹),进行保存(一般加入一个随机数到密码中再进行MD5加密)
2.数据的完整性验证,因为它是数据指纹。
base64:将字节转为为值小于64的键盘对应的明文。
一种将3个字节的24位编码成4个字节的编码方式,以每取6位再在前面添加00的方式组成一个8位新的字节(每个字节最大值为63,即:64进制),分4次组成4个字节。这样每个字节都能对应一个键盘上的明文。
作用:
1,网络传输中需要一些特殊的字节来做标记,比如起始,结束标记。标记字节不能和数据字节冲突,那么就可以用前2位非0的字节来表示标记)
2.将数据经过这种处理传输过程都可以iso8859-1的编码方式进行处理,因为它的每个字节都是键盘对应明文,不会出现未知符号的情况。
base64在这个例子的作用是:将md5处理后的字节数组,转换成为字母形式的数据,不用去考虑字节数组和字符串之间转码问题。
登陆servlet重定向到登陆jsp:

jsp表单利用隐藏域放置表单号:
:
验证表单号:

获取令牌方法:

session用于存放验证码的数据存放(略)

浙公网安备 33010602011771号