您的位置:首页 > 其它

Cookie and Session

2012-05-01 20:20 169 查看
Cookie and Session

1、cookie技术

a, cookie是什么?

浏览器访问服务器时,服务器发送给浏览器

少量的数据,这些数据以set-cookie消息头的

方式发送给浏览器。浏览器会将set-cookie消

息头设置的内容保存下来(内存或者是硬盘)。

当浏览器再次访问服务器时,会将之前保存的数

据以cookie消息头的方式发送给服务器,通过这

种机制,可以将浏览器与服务器之间交互的数据

保存下来。

b, 创建cookie

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

cookie.setMaxAge(int seconds);

response.addCookie(cookie);

c,查询cookie

//如果没有cookie,会返回null

Cookie[] request.getCookies();

String cookie.getName();

String cookie.getValue();

d,编码问题

cookie的值只能是ascii字符,如果出现了非

ascii字符(比如中文),需要将中文转换成

对应的ascii字符表示。

可以使用URLEncoder.encode方法或者

BASE64Encoder.encode方法来实现转换。

要注意:

在查询时,要使用对应的方法来解码。

e, 生存时间

cookie.setMaxAge(int seconds)

单位是秒。

seconds <0: 保存在内存里(默认值),只有

当浏览器关闭,cookie才会删除。

seconds > 0: 以文件的方式保存在硬盘上,

超过这个时间,浏览器会删除cookie。

seconds = 0: 立即删除cookie。

如果要删除一个名叫"username"的cookie:

Cookie cookie = new Cookie("username","");

cookie.setMaxAge(0);

response.addCookie(cookie);

f, 路径问题

浏览器在访问服务器的某个路径时,会

先比较cookie的路径与服务器的路径,只有

符合条件的cookie才会发送给服务器。

cookie如果没有调用setPath方法,则会

有一个默认的路径,这个默认的路径是

创建该cookie的组件的路径(当前路径)。

比如: /web06_3/jsp01/addCookie.jsp

创建了某个cookie,则该cookie的路径是:

/web06_3/jsp01

浏览器会比较cookie的路径与要访问的组件

的路径,只有当要访问的组件的路径是cookie

的路径或者其子路径时,浏览器才会发送该

cookie组服务器。

//设置cookie的路径

cookie.setPath(String str);

比如:

cookie.setPath("/web06_3");这样设置的

作用是,该组件生成的cookie,可以被这个应用

下所有的其它组件访问到。

如果写为cookie.setPath("/"),那么该组件生

成的cookie,可以被所有应用所有的其它组件访问到

练习:

写一个Find_AddCookieServlet,该servlet

先查询有没有一个名叫 userProfile的cookie,如果有,则

显示该cookie的值,如果没有,则创建该cookie。

new Cookie("userProfile","abc")

g, cookie的限制

cookie可以被禁止。

cookie的大小有限制(大约4k左右,跟

浏览器有关系),数量也有限制,浏览器

在本地大约能保存300个左右的cookie。

cookie不安全

cookie的值只能是字符串

2、session技术

(1)什么是session?

浏览器访问服务器时,服务器会创建一个

对象(该对象称为session对象,该对象有一个唯一

的id号,称为sessionId),服务器在默认情况下,

会将这个sessionId以set-cookie消息头的方式

发送给浏览器(即使用cookie机制),浏览器会将

sessionId保存到内存里。当浏览器再次访问服务

器时,会将sessionId发送给服务器。服务器依据

sessionId就可以找到之前创建的session对象。

(2) 如何获得一个session对象?

a, HttpSession session =

request.getSession(boolean flag);

当flag为true:

服务器会检查请求中是否包含sessionId,

如果没有,服务器会创建一个session对象;

如果有,服务器依据sessionId去查找session

对象,如果找到了,则返回,找不到,创建

一个新的session对象。

当flag为false:

服务器会检查请求中是否包含sessionId,

如果没有,返回null;

如果有,服务器依据sessionId去查找session

对象,如果找到了,则返回,找不到,返回

null。

b,HttpSession session =

request.getSession();

该方法完全等价与request.getSession(true)。

(3) session的常用方法:

String session.getId(); //返回sessionId。

session.setAttribute(String name,

Object obj);

//name对应的值不存在,返回null。

Object session.getAttribute(String name);

session.removeAttribute(String name);

(4)session的超时

服务器会将空闲时间过长的session对象

删除掉,称之为session超时。

服务器会有一个缺省的超时限制(一般是

30分钟),这个缺省时间可以修改。

比如tomcat可以修改 conf/web.xml

<session-config>

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

</session-config>

该修改会影响到所有部署在这个服务器上的

应用,一般不要修改。

可以对某个应用,在web.xml文件中,添加

<session-config>

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

</session-config>

可以调用session.setMaxInactiveInterval(int

seconds)设置超时限制。

(5) session的删除

session.invalidate();

案例:

session验证

step1 在登录成功之后,向session对象里

绑订数据:

session.setAttribute("user",user);

step2 对于需要保护的资源(即必须要登录之

后才能访问的资源),添加验证代码:

Object obj = session.getAttribute("user");

if(obj == null){

//没有登录

response.sendRedirect("login.jsp");

}else{

//正常访问

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: