一、第一阶段是完成注册登录功能。
注册我是利用邮箱注册完成的。
注:关于邮箱注册和手机注册在我另一篇文章中有专门demo介绍。
这个阶段遇到的问题主要是如何保存用户登录信息,也就是状态管理——如何合理使用session和cookie。
二、cookie
1.什么是cookie
服务器临时存放在浏览器端的少量数据,用于跟踪用户状态。
2.cookie的工作原理
当浏览器访问服务器时,服务器会将少量数据以set-cookie消息头形式发送给浏览器,浏览器会保存下来;
当浏览器再次访问服务器时,会将之前保存的这些数据以cookie消息头的形式发送给服务器。
3.如何添加和获取cookie
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();(有可能返回null)
String name = cookie.getName();
String value = cookie.getValue();
4.生存时间
1)默认情况下,cookie保存在内存中,浏览器关闭,cookie就被删除。
2)可以调用cookie.setMaxAge(int seconds);
注:
单位是秒。 365 * 24 * 60 * 60
seconds > 0: 浏览器会将cookie保存在硬盘上(一般是文件的形式),
超过指定的时间,cookie会被删除。
seconds < 0: 默认情况(即保存在内存里面)。
seconds = 0: 删除cookie。
比如,要删除一个名称为username的cookie:
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
5.编码问题
1).cookie只能保存合法的ascii字符,如果是中文,需要转换成对应的ascii字符的形式。
2).可以使用以下方法进行处理
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
3).建议,在添加cookie时,不管是否为中文,统一进行编码处理。
6.路径问题
1).什么是cookie的路径问题?
浏览器访问服务器上的某个地址时,会比较该地址是否符合cookie的路径要求,只有符合条件cookie才会被发送。
2).Cookie的默认路径
默认路径等于添加该cookie的web组件的路径。
比如,/day06/biz01/addCookie.jsp添加了一个cookie,则该cookie默认的路径是"/day06/biz01"。
3).哪一些cookie会被发送?
请求地址等于cookie的路径或者是其子路径,则该cookie会被发送。
比如,cookie的路径是"/day06/biz01",则
"/day06/findCookie1.jsp", 不会被发送;
"/day06/biz01/findCookie2.jsp",会被发送;
"/day06/biz01/sub/findCookie3.jsp",会被发送。
4).修改路径
cookie.setPath(String path);
7.cookie的限制
1).Cookie可以被用户限制
2).不安全
3).保存的数据大小有限制,一般4KB
4).保存的数量也有限制,一般几百个
5).只能存放字符串
三、session
1.什么是session
服务器为了保存用户对象而创建的特殊对象。
2.工作原理
浏览器访问服务器时,服务器创建一个特殊的对象(即session对象,该对象
有一个唯一的id,一般称之为sessionId),服务器将sessionId以cookie的方式发送给浏览器。
当浏览器再次访问服务器,会将sessionId发送过来,服务器依据sessionId就可以找到对应的session对象。
3.如何获得session
HttpSession s = request.getSession(boolean flag);
注:
HttpSession是一个接口,request.getSession方法会返回一个
实现了该接口的对象,该对象我们称之为session对象。
当flag为true时:
先查看请求当中是否有sessionId,如果没有,则创建一个
session对象;如果有sessionId,则依据该sessionId查找
对应的session对象,如果找到了,则返回该对象,找不到,
则创建一个新的session对象。
当flag为false时:
先查看请求当中是否有sessionId,如果没有,返回null;
如果有sessionId,则依据该sessionId查找
对应的session对象,如果找到了,则返回该对象,找不到,
返回null。
HttpSession s = request.getSession(boolean flag) 等价于 request.getSession(true)
4.session对象的常用方法
1).获得sessionId
String session.getId();
2).绑订数据
session.setAttribute(String name,Object obj);
3).依据绑订名获得绑订值
Object session.getAttribute(String name);
注:如果绑订名对应的值不存在,返回null。
4).解除绑订
session.removeAttribute(String name);
虽然服务器会自动绑定sessionID到浏览器cookie,但是我们也可以自己绑定,
Cookie cookie = new Cookie("JSESSIONID", session.getId());
5.session超时
服务器会将空闲时间过长的session对象删除掉。
注:
为了节省内存空间。
服务器默认的超时时长一般是30分钟。
6.修改session超时时间
方式一 修改服务器的配置文件
<session-config>
<session-timeout>30</session-timeout>
</session-config>
方式二 编程的方式
session.setMaxInactiveInterval(int seconds);
注:
设置两次请求之间的最大间隔时间。如果超过这个间隔时间,
session对象会被删除。
7.删除session
session.invalidate();