Cookie是什么?
cookie是Web服务器通过浏览器保存在WWW用户端的硬盘上面的一个文本文件,当中包含了一些用户的信息。
cookie有什么作用?
cookie可以解决浏览器用户与服务器之间的无状态通信的问题。
cookie的代码实现:
构造器
Cookie(java.lang.String name, java.lang.String value)
//构造一个具有指定名字和数值的 cookie.
Cookie c = new Cookie("key","value")
//这里是创建了一个cookie对象,一般我们要需要设置cookie对象的有效期,如下:
c.setMaxAge(int expiry);
//参数是给一个整型的值,指定以秒计的cookie的最大存活时间。
还有很多的方法去设置cookie,根据需要去设置,具体的方法可以参考:
java EE 的帮助文档中的“javax.servlet.http.Cookie”这个类。
设置好了cookie以后要做最后一步,也是最重要的一步,就是要把cookie保存到客户端的硬盘上面,实现原理是:
通过服务器把这个cookie发送给客户端浏览器,然后客户端的浏览器就通过内置功能把cookie对象保存到本地硬盘上面,就完成了一个cookie对象的记录。具体调用:“HttpServletResponse”这个接口中的public void addCookie(Cookie cookie)方法。如:
response.addCookie(c);
//这下就彻底完成了cookie对象的保存,下次用户在来请求的时候,我们就可以查询或获得上次该用户请求的信息。
虽然cookie可以有以上的优点,但是cookie也是有自己的缺点的,比如cookie保存的数据是文本文件,所以用户是可以篡改和删除的,另外一个缺点就是它保存数据是有限制的,最多4KB,所以给我们开发带来了很大的障碍。为了解决这些问题,为了更好的实现浏览器用户与服务器之间的无状态通信的问题,就推出了“会话(session)”。
会话是什么?
会话是记录浏览器与服务器多次交互想要保存的信息,更好解决了浏览器用户与服务器之间的无状态通信的问题。
那更好在那里呢?
主要是通过两点来反映:1.服务器会为每个来请求的客户端分配一块空间。2.这些信息不再是保存到浏览器用户的硬盘上了,而是保存到服务器端的内存里面,这样用户就不能直接性的删除或修改了。
会话(session)的代码实现:
HttpSession是一个接口,不能直接实例化,要得到它的实例,可以通过“HttpServletRequest”中的getSession()或getSession(boolean create)来得到,其中带参数的是传递一个boolean类型的值,当传false的时候,就不创建一个HttpSession,如果是传一个true值,就表示会创建一个新的会话,调用无参的getSession和带参数的getSession传true值是一样的。
以下是几个常用的方法,是属于HttpSession接口中的。
setAttribute(java.lang.String name, java.lang.Object value)
// 用指定的名字将一个对象绑定到一个会话。
getAttribute(java.lang.String name)
//返回在本会话中绑定了指定名字的对象,当没有所要求的对象时,返回一个空值。
getAttributeNames()
//返回一个包含所有的绑定到会话的 对象名称的字符串对象的集合。
invalidate()
//调用了这个方法以后会手动终止会话。
getMaxInactiveInterval()
//设置会话的最大生存时间,以秒计时。
removeAttribute(java.lang.String name)
//从会话中删除绑定到指定名字的对象。
setMaxInactiveInterval(int interval)
//设置会话的最大生存时间,以秒计的时间。
更多的方法可以参考:
“javax.servlet.http”包中的HttpSession接口。
会话结束。
有三种方式:
1.浏览器关闭。
2.主动关闭。
3.会话超时。
其中主动关闭是调用invalidate()这个方法 来实现的,而会话超时是通过调用setMaxInactiveInterval(int interval)这个方法来设置会话的生存时间来实现的。
下面谈谈会话的底层的实现方式:
会话的底层实现方式有两种:
1.cookie。
上面这幅图片表现的是cookie实现会话的底层原理。
由于不同的浏览器所保存的会话信息对象和地址空间是不同的,所以需要有一个类似于套接字编程中端口号的东西来区分不同的浏览器所保存的会话对象。在会话现实中是利用的一个session ID来区分的,见上面这幅图可知,服务器没产生一个session对象的时候就会给该对象生成一个session ID,由于这个ID需要长久的储存起来,所以最好的实现方式就是把他保存在客户端浏览器的cookie里面(储存的时候cookie的key叫做jsessionid,vlues当然就session ID了),这样当每次浏览器来请求的时候就会附加上这个session ID,然后服务器会根据这个ID查找,如果找到了,就根据ID可以获得ID对象。对应的值,这个值就是session对象的名称,既然获得了session对象的名称就可以获得该对象所储存的所有信息了,这就是利用cookie来实现会话的原理。
2.URL重写。
但是我们考虑一下,利用cookie实现会有一个问题,我们知道cookie是可以设置禁止的,如果cookie被用户禁止使用了,那怎么办?
为了解决这个问题,还提供了一种实现的方式那就是URL重写。
其实原理很简单,如果cookie被关闭了,那么我们可以在请求的URL后面跟一个jsessionid来区分不同的浏览器需要访问相应的会话对象。例如:
http://localhost:/8088/test/login.html;jsessionid=EUDJGH73KDF93SS2
不过注意的是这个jsessionid不是我们来写,而是服务器来帮我们,我们只需要调用HttpServletResponse 中已经封装好了的一个方法就可以了。方法代码:
encodeURL(java.lang.String url);
其中传的参数是你要重写的URL地址。
encodeRedirectURL(java.lang.String url)
这个方法也是重写URL地址的,作用是如果我们有一个重定向的URL,我们想重定向以后还是同一个会话,我们就可以采用这个方法来重写该重定向的URL。