Session追踪的四种方式
网址重写
网址重写将一个或多个token作为查询字符串添加在url中,token一般就是k-v对
url?k1=v1&k2=v2…&kn=vn
如果token不必在多个url上携带,那么网站重写就比较合适。
网站重写比较大的缺陷就是token是显式的,在url地址栏上可以看到
所有应用网址重写必须token信息不太重要或不太需要隐藏。
隐藏域
将token放在html表单的隐藏域中。相对于网址重写,隐藏域的方式更安全,
传输的数据也更多,因为url限制字符。不需要重新编码。适用情况与网址重写相同。
只有当传输的信息不需要跨越多个页面时,才适用。
<form method="post" action="xxx.do">
<input type="hidden" name="id" value="1"/> <!-- 隐藏域 token信息-->
<table>
<tr>
<td>city</td>
<td><input type="text" name="cityname" value="Miami"/></td>
</tr>
<tr>
<input type="submit" name="submit"/>
</tr>
</table>
<form>
当表单传输到服务端时,就可以知道是哪个用户提交的
Cookie
重写网址和隐藏域都不适用于跨越许多页面的信息。而cookie可以解决这种情况,cookie是自动地在web服务端和浏览器之间来回传递地一小块信息。可以通常servlet添加cookie
public class MyServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie c = new Cookie("username","cyl"); //cookie token也是k-v键值对
c.setMaxAge(60); // 设置cookie的最大存活时间
resp.addCookie(c); //添加cookie在响应体中
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet();
}
}
要注意的的是, 没有getCookieByName方法获得单个cookie,每次只能一次性获得cookie数组。
request.getCookies(); 返回一个cookie数组
HttpSession对象
在所有的session追踪技术中,HttpSession对象是最强大的,也是功能最多的。
HttpSession是用户第一次请求服务器时产生的。每个用户只能访问他自己的httpsession。
request.getSession() 可以获得当前的seesion对象
httpsession通过setAttribute(String name, Object value)方法添加信息。但是httpsession的产生会消耗
服务器内存,因为httpsession在服务端产生,在他的存活时间内,它一直都驻留在服务器内存中,直到
被销毁。所以httpsession不能存储大量的数据,需要谨慎操作。