1、状态管理
(1)状态管理的含义
将浏览器与web服务器之间多次交互当做一个整体来看待,并且将多次交互所涉及的数据(即状态)保存下来。(2)如何进行状态管理
1)将状态保存在客户端将状态存放到浏览器(cookie技术)。
2)将状态保存在服务器端
将状态存放到web服务器(session技术)。
2、cookie
(1)什么是cookie?
属于客户端的状态管理技术。浏览器访问web服务器时,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据保存下来;当浏览器再次访问服务器,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
(2)创建cookie
(即让服务器发送set-cookie消息头给浏览器)Cookie c = new Cookie(String name,String value);
name:cookie的名称
value:cookie的值
response.addCookie(c);
(3)查看cookie
Cookie[] request.getCookies();注意:
该方法有可能返回null。
String cookie.getName();
String cookie.getValue();
(4)编码问题
cookie只能存放合法的ascii字符,如果要保存中文,很显然需要将中文转换成合法的ascii字符。String URLEncoder.encode(String str,"utf-8");
String URLDecoder.decode(String str,"utf-8");
(5)生存时间
cookie.setMaxAge(int seconds);注意
a,单位是秒
b,seconds > 0 : 浏览器会将cookie保存在硬盘上,超过指定时间,会删除这个cookie。
seconds = 0:删除cookie。
比如,要删除一个名称为user的cookie
Cookie c = new Cookie("user","");
c.setMaxAge(0);
response.addCookie(c);
seconds < 0: 默认值,浏览器会将cookie保存在内存里面,只有浏览器不关闭,cookie会一直存在。
(6)路径问题
a,什么是路径问题浏览器在向服务器发请求时,会比较cookie的路径与请求地址是否匹配,只有匹配的cookie才会发送给服务器。
b,cookie的默认路径等于创建cookie的组件的路径。
比如:
/web06_3/sub01/addCookie.jsp,则该jsp创建的cookie的路径等于"/web06_3/sub01"
c,匹配规则
要访问的地址必须是cookie的路径或者其子路径,浏览器才会发送该cookie。
d,设置cookie的路径
cookie.setPath(String path);
经常设置为
cookie.setPath("/appname");
这样,可以保证某个组件所创建的cookie可以被同一个应用内部其他的组件访问到。
(7)cookie的限制
a, cookie可以被用户禁止。b, cookie不安全,如果有敏感数据,最好不要以cookie方式来保存。如果一定要保存,一定要加密。
c, cookie只能够保存少量的数据(大约4k)
d, 浏览器保存的cookie的数量也有限制,大约是300个。
e, cookie只能保存字符串。
3、session(会话)
(1)session是什么?
一种服务器端的状态管理技术(将状态保存在服务器上)
当浏览器访问web服务器时,服务器会创建一个session对象(该对象有一个唯一的id属性值,类似于一个人的身份证号码一样,一般称之为sessionId),接下来服务器在默认情况下,会将sessionId以set-cookie消息头的方式发送给浏览器;
当浏览器再次访问服务器时,会将sessionId以cookie消息头的方式发送过来,服务器依据sessionId就可以找到之前创建的session对象。
注意:如果用户禁止cookie,可以使用其它的方式来发送sessionId。
(2)如何获得session对象(session创建和使用流程剖析)
方式一
HttpSession session = request.getSession(boolean flag);
当flag为true时
服务器会先查看请求当中有没有sessionId,如果没有,服务器会创建一个session对象;如果有,服务器会依据sessionId查找对应的session对象,如果找到了,则返回,找不到,创建一个新的session对象。
当flag为false时
服务器会先查看请求当中有没有sessionId,如果没有,返回null;如果有,服务器会依据sessionId查找对应的session对象,如果找到了,则返回,找不到,返回null。
服务器创建和使用session对象的流程如下:
1-2.浏览器请求Web服务器,服务器生成某个servlet。
3.服务器创建某个session对象,该对象可以在servlet中通过request.getSession(boolean flag);获取。
4.服务器以cookie的方式发送sessionId。
5.浏览器将sessionId保存在浏览器内存中。
6.浏览器再次访问服务器时会携带sessionId(浏览器不能关闭,否则session失效)。
7.session对象存在的情况下,服务器会依据sessionId查找到session对象。如果找不到且flag为true,则生成新session对象。
方式二
HttpSession session = request.getSession();
等价于request.getSession(true)。
(3)常用的方法
String getId();
setAttribute(String name,Object obj);
//如果依据绑订名找不到绑订值,返回null。
Object getAttribute(String name);
//解除绑定
removeAttribute(String name);
(4)session的超时
1).什么是session超时?
服务器会将空闲时间过长的session对象删除掉。
(因为session对象会占用服务器的内存空间,服务器有可能会有大量的session对象需要维护,为了节省内存空间的占用,经常需要删除一些不太活跃的session对象)。
2)服务器默认的超时限制
大部分服务器默认的超时限制是30分钟。
3)修改服务器默认的超时限制
比如,要修改tomcat的超时限制
tomcat_home/conf/web.xml文件
<session-config>
<session-timeout>30</session-timeout>
</session-config>
也可以将上述配置放到某个应用对应的web.xml文件当中,此时,该配置只针对某个应用起作用。
4) setMaxInactiveInterval(int seconds);
设置超时限制,单位是秒。
5)立即删除session对象
invalidate();
(5)用户禁止cookie以后,如何继续使用session?
1)可以使用url重写来解决这个问题
2)什么是url重写?
浏览器向服务器发请求时,要使用这样的地址(在原有的地址后面添加sessionId)。这样一来,浏览器每次向服务器发请求时,服务器就可以依据sessionId找到之前的session对象了。
3)如何进行url重写?
a,链接地址、表单提交
response.encodeURL(String url);
比如:
<a href="<%=response.encodeURL("some")%>">
</a>
<form action="<%=response.encodeURL("add.do")%>">
</form>
b,重定向
response.encodeRedirectURL(String url);
比如:
response.sendRedirect(
response.encodeRedirectURL("abc.jsp"));
c,转发不用考虑。因为转发是服务器内部一个组件通过容器调用另外一个组件,与session无关。
4、session相关的案例
(1)session验证
1),登录模块
step1,建表
create table t_user(
id int primary key auto_increment,
username varchar(50) unique,
pwd varchar(30),
name varchar(255),
gender char(1)
)type=innodb;
insert into t_user(username,pwd,name,gender)
values('kitty','test','hello kitty','m');
unique : 唯一性约束。
step2,创建一个web工程 web07_login
step3,实体类 User
step4, UserDAO
public User findByUsername(String username)
step5,login.jsp
step6,ActionServlet
2),session验证
step1,登录成功以后,在session对象上绑订一些数据。比如
session.setAttribute("user",user);
step2,对于需要保护的资源(登录成功以后才能访问的地址,比如main.jsp),添加session验证代码。比如
Object obj = session.getAttribute("user");
if(obj == null){
//没有登录,跳转到登录页面
response.sendRedirect("login.jsp");
}
如,用户在未登录情况下访问需要登录的界面,服务器处理过程如下图所示:
1-2.浏览器请求Web服务器,服务器生成某个servlet。
3.服务器创建某个session对象,该对象可以在servlet中通过request.getSession(boolean flag);获取。
4.服务器以cookie的方式发送sessionId。
5.浏览器将sessionId保存在浏览器内存中。
7.jsp中判断,若从session中取不到user对象,表示未登录过,则通过服务器发送重定向请求(302状态码)。
8.浏览器重新访问重定向的地址,即登录界面。
......
5、比较session和cookie
相对于cookie,session的优点:
a,安全
b,能够保存更丰富的数据类型
缺点:
session是将状态保存在服务器端,会占用大量的服务器的内存空间(服务器可以将状态临时保存到文件或者数据库)。
转载请注明出处:
http://blog.csdn.net/daijin888888/article/details/51133155