一个做移动端的,要做服务端的一些工作,没办法,工作还的继续,这就是生活,废话不说,总结一下这一天的东西,逆水行舟,努力,努力。
Java什么是状态管理
一般我们会将浏览器与服务器之间多次的交互当作一个整体来对待,所以将这多次操作所涉及的数据记录保存下来,就是用户状态的一种管理。
Java中状态的管理方式,一般有两种,一种是在cookie的方式,另一种是session的方式。下面就来看看每一种方式都是如何做的。
1.cookie方式:
cookie是浏览器访问服务器的时候,服务器将一些数据以set-cookie形式的消息头发送给浏览器,浏览器会将这些数据保存起来,当下次浏览器访问服务器的时候,会将这些数据以cookie消息头的形式发送给服务器,cookie就是使用这种方式来管理用户状态的。
Java创建一个cookie
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);
查询一个cookie:
Cookie[] cookies = request.getCookies();遍历这个数组,使用下面的方法获取 name和value.如果没有cookie就会返回null.
String name = cookie.getName();
String value = cookie.getValue();
编码问题:
cookie的值只能是ascii编码,如果是中文,需要讲中文转换成ascii字符串。可以使用URLEncode.encode()和URLDecode.decode()方式进行转码和解码。
cookie保存时间:
Java中使用cookie.setMaxAge(int seconds);设置cookie的保存时间
seconds > 0:浏览器会将cookie以文件的形式保存在硬盘上,在超过指点时间后,才会删除文件。
seconds < 0:浏览器会将cookie保存在内存里,当浏览器关闭后,删除。
seconds = 0:立刻删除这个cookie。
所以要删除一个cookie也很容易,譬如删除name为id的cookie只需要这么做就以了
Cookie cookie = new Cookie("id","");
cookie.setMaxAge(0);
response.addCookie(cookie);
cookie的路径问题:
浏览器向服务器发送某个地址请求时,会先进行比较cookie的路径,只有cookie的路径与访问的路径匹配才会发送cookie,cookie的路径可以使用cookie.setPath(String path)的方式来设置。
如果没有设置会,就会有一个缺省路径,缺省路径是生成cookie的组件的路径,譬如:/appname/addCookie保存了一个cookie,则cookie的路径是/appname/addCookie.
一般可以设置setPath(/appname),就表示该应用下所有的地址都会发送cookie。
cookie的限制:
cookie可以被用户禁止
cookie的大小有限制,一般4K左右
cookie的数量也是有限的
cookie的值只能是字符串
cookie不安全
2.session方式:
浏览器访问服务器时,服务器会创建一个 session 对象(该对象有一个唯一的 id, 一般称为 sessionId)。服务器在缺省情况下,会将 sessionId 以 cookie 机制发送给浏览器。当浏览器再次访问服务器时,会将 sessionId 发送给服务器。服务器依据 sessionId 就可以找到对应的 session 对象。通过这种方式,就可以管理用户的状态。
如何获得 session 对象
HttpSession session = request.getSession(boolean flag);
当 flag = true:服务器会先查看请求中是否包含 sessionId,如果没有,则创建一个 session 对象。如果有,则 依据 sessionId 去查找对应的 session 对象,如果找到,则返回,如果找不到,则创建一个新的 session 对象。
flag = false:服务器会先查看请求中是否包含 sessionId,如果没有,返回 null。如果有,则依据 sessionId 去查找对应的 session 对象,如果找到,则返回。如果找不到,返回 null。
HttpSession session = request.getSession(); 和request.getSession(true)等价。
HttpSession 接口提供的一些方法
获得 sessionId
String session.getId();
绑订数据
session.setAttribute(String name,Object obj);
Object session.getAttribute(String name);
如果 name 对应的值丌存在,返回 null。
session.removeAttribute(String name);
session 超时
服务器会将超过指定时间的 session 对象删除(在指定的时间内,该 session 对象没有使用)。
方式一:
session.setMaxInactiveInterval(int seconds);
方式二:
服务器有一个缺省的超时限制,可以通过相应的配置文件来重新设置。比如可以修改 tomcat的 web.xml(tomcat_home/conf 下面)。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
另外,也可以叧修改某个应用的 web.xml。
删除 session
session.invalidate();