小甜饼cookie是干什么的呢,首先它是由网络服务器生成,并发送给浏览器,小cookie可以记录用户名和密码,跟踪重复的用户,就像你吃下的小甜饼中有元素标记一样,会一直跟踪你,这时候你的信息会以key/value形式存在客户端的指定目录。
cookie地方法getcookies()可以获取到所有的cookie对象集合,然后对象的getName可以获得指定名称的cookie,getValue可以获取到cookie对象的值,我们将它们发送至客户端使用response对象的addCookie。这时候我们做一个小小实验,看浏览器是否能捕捉到是不是同一个用户上线,避免每次登陆都要输入密码,或者无法识别同一用户,已让人家蒙混过关。
<% Cookie[] cookies = request.getCookies(); //从request中获得Cookie对象的集合 String user = ""; //登录用户 String date = ""; //注册的时间 if (cookies != null) { for (int i = 0; i < cookies.length; i++) { //遍历cookie对象的集合 //如果cookie对象的名称为mrCookie if (cookies[i].getName().equals("mrCookie")) { //获取用户名 user = URLDecoder.decode(cookies[i].getValue().split("#")[0]); date = cookies[i].getValue().split("#")[1]; //获取注册时间 } } } if ("".equals(user) && "".equals(date)) { //如果没有注册 %>
这里就是创建index.jsp用于遍历cookies,如果存在,则输出再次光临,如果不是输入初次光临则,跳入deal.jsp向cookie写入注册信息。
<% request.setCharacterEncoding("UTF-8"); //设置请求的编译为UTF-8 String user=URLEncoder.encode(request.getParameter("user"),"UTF-8");//获取用户名 Cookie cookie = new Cookie("mrCookie", user+"#"+new java.util.Date().toLocaleString());//创建并实例化cookie对象 cookie.setMaxAge(60*60*24*30); //设置cookie有效期30天 response.addCookie(cookie); //保存cookie %>
我们看下这段代码,将用户user名存入cookie,并且实现保存多少天的功能,这就是我们平时登录一个网站时,一个浏览器提醒你是否要保存用户名和密码,以方便于下次登录,当然像淘宝网等也是这样,在你的浏览器一打开就是你的登录名,当然你的密码过了一段时间失效了,这就是以上代码的cookie.setMaxAge(60*60*24*30); 60秒=一分钟 60分钟=1小时,24小时=1天,30天=1个月,我们程序就是为了保存一个月的用户名,之后你在同一个浏览器登录都是再次登录的界面。
还没做到怎么退出账户,所以要有一个月都在这个页面页了。当你不设置销毁时间时,默认浏览器关闭就销毁cookie。session和cookie一定区别是cookie是保存在客户端,session是保存在服务器端,当然sessionid是保存在客户端,对session不知道的我们往下看。
Session
之所以叫会话,我们可以做一个想象,打电话,只要不挂断电话双方交谈就会一直持续下去,但是在网络中,HTTP是一种无状态协议,一次请求连接一次结束,客户端请求与服务器合作,服务器接受返回响应,然后,就没有然后了,他们的合作到此为止,服务器才不会去保存相关用户信息,服务器管的是大部分自己的资源。这样为了弥补这样的缺点衍生了session,用户在肆意的跳转web页面时保存用户状态,使得整个用户会话一直保存下去,但是在会话中客户端长时间不向服务器发出请求,tomcat服务器是等待30分钟,session对象就会自动消失,这里可以通过编写程序定时发送请求,这里讲一个安全性问题:
在一个有密码保护的web应用中,正确处理用户退出过程并不仅仅只需调用httpsession的invalidate()方法。现在大部分浏览器 上都有后退和前进按钮,允许用户后退或前进到一个页面。就像我经常进入付款页面然后发现我前面订单下错了了,于是点后退按钮,退回到我原来界面,这时候我之前填写的信息还在,这是session在起作用,这时候如果我付款完闭,退出账户,则页面转到登录界面,但是没有关闭浏览器,离开这个公用电脑,另
一个用户使用电脑时点击后退按钮,则不应该再出现我之前的信息,如果出现我应该要很担心我的信息安全问题,事实上,很多web应用为了安全则强制用户关闭浏览器,我记得以前有家网上银行就是这么做的,首先不能直接关闭页面,要退出账户,然后关闭浏
览器。
一个比较好理解的是我之前参加了很多次机试,老师再三要求答完一个页面的题记得点保存再按下一页,也就是需要用户点击保存才会有session来保存你的数据,当然这种情况下也有小伙伴被坑的忘记点保存,之后只好在最后几秒,秒选凭记忆,真正好的机试系统应该能保证在机器断电情况下,换一台电脑继续答题,因为我实在见多了很多小伙伴踢掉了考场的电脑的电源,然后又没保存黯然离场。所以我想说的是真正的web应用要考虑到各方面因素,既要考虑到保存用户信息,也要及时销毁用户信息避免消息泄露,这就是项目和产品的一个区别,产品更要去为用户考虑。
所以及时手动销毁session也是必要的,而不是等到session失效,session对象有一个session.invalidate()来销毁对象,销毁后再次调用这个对象,就会报异常。
接下来我们要区别一下application应用对象:
这个对象用于保存应用程序中所有公用数据,服务器启动时自动创建,服务器停止时自动销毁,所有用户都可以共享application,与session相比,application是公有,这个其实有点像我们定义java 的private 和public,application生命周期更长,类似于系统中的全局变量。
在web应用中,用到application最多的是网页计数器或者聊天室,我们进入聊天室显示此时在线用户多少人就是利用application对象。
通常我们用360清楚网页的缓存时候会看到清楚cookie信息,这个大家可以注意一下,手机端缓存也是一样的存在客户端的cookie,我们会发现偶尔app会要求重新登录,这是cookie已经失效,另一个方法就是进设置对应用程序清除缓存,这时候你也需要重新登录,登陆后保存在服务器端的session会把数据更新到app上。
具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识
(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来
使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相
关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应
中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给
服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时
仍然能够把session id传递回服务器。
。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时
仍然能够把session id传递回服务器。
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器
会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。