HTTP协议(Protocol)本身是一种无状态协议,浏览器用HTTP向服务器请求一个文件,服务器就将要求的文件传回,然后连线中断,当浏览器发出
另一个请求时,它与上一个请求并无关联,服务器不会知道任何有关上一次请求的任何信息,这对于静态网页来说是很自然的处理方式且并不会有问题,然而对于
Web应用程序来说就是一个难题,如果页面之间没有关系,则上一个页面所挑选的商品,在下一个页面中并不会被得知。 即然HTTP本身是无状态协议,为了要在下一次请求中,让服务器能处理上一次请求中的一些信息,最自然的方法,就是将上一次请求结果中的一些信息,在下一次请求时一并传送给服务器,基于这种方式,传统上通常会有三种作法:隐藏表单栏位信息、URL rewriting或是使用Cookie。 隐藏表单栏位基本方式很简单,就是将下次所需要的讯息发回给客户端,在客户端设置一个表单并包括隐藏栏位,这样客户端下次发送讯息时,会一并发送隐藏栏位 中的数据,如此就可以维护状态方面的讯息,这个方法的缺点是状态讯息不断的在客户端与伺服端之间来回,较耗费网路频宽,并且客户端可以藉由检视网页原始码 来发现讯息,保密性上有相当的顾虑。 URL rewriting的例子在 session(2) 中有提到一些,您可以直接引用该篇主题的内容。 Cookie是储存客户端讯息的一种方式,它储存在客户端电脑上,您可以设定给它一个存活期限,保留一些有用的讯息在客户端,即使是在客户端关闭浏览器之 后,再次连接服务器时若Cookie仍在有效期限中,就可以再利用Cookie中储存的讯息,一个常见的应用就是设定表单的自动登入讯息。 cookie是JSP中用来操作Cookie的隐含对象,来看一个实际的例子:
<%@page contentType="text/html;charset=Big5"%> 这个JSP网页会试着使用 request 隐含对象的getCookies()方法取得所有可用的Cookie对象,如果没有取得,表示客户端目前没有可用的Cookie,此时您新增 Cookie对象,并指定name-value给它,并使用 response 隐含对象的addCookie()方法,将新建立的Cookie对象加入,之后Cookie对象的讯息会以Cookie的方式发回至客户端并储存。 如果客户端有可用的Cookie,则使用循环一一将其取出,藉此得到客户端中可用的状态或相关讯息,您可以使用getName()方法取得Cookie的 名称,getValue()取得其中的值,如果是上面的JSP网页,则getName()会取得 "user" ,而getValue()会取得 "caterpillar"。 Cookie对象有其生命期限,基本上始于建立Cookie时,而关闭浏览器之后,自动清除Cookie对象,您也可以设定Cookie的生命期限,让它 储存在客户端久一些,这样即使关闭浏览器,Cookie也不会被清除,您可以使用Cookie的setMaxAge()来设定生命期限,设定单位是秒,例 如: Cookie userCookie =
new Cookie("user", "caterpillar"); userCookie.setMaxAge(3600); response.addCookie(userCookie); 如果想要直接删除使用中的Cookie,则可以设定setMaxAge()方法的参数为 0,即生命期限为 0,就相当于立即让 Cookie失效。 |