一、会话跟踪机制(session与cookie)
Session:Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。
Cookie:Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
二、Cookie机制
1.为什么要使用Cookie?
网站为了辨别用户身份而储存在用户电脑上的数据。可以让用户不用二次输入就直接登录,也可以让用户看到之前的一些记录。
2.Cookie实现原理?
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
3.Cookie具体使用场景?
1.账号自动登录 2. 最近浏览(购物足迹)
三、cookie的常用方法
序号 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) 设置cookie的域名,比如w3cschool.cc |
2 | public String getDomain() 获取cookie的域名,比如w3cschool.cc |
3 | public void setMaxAge(int expiry) 设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间 |
4 | public int getMaxAge() 获取cookie有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止 |
5 | public String getName() 返回 cookie的名称,名称创建后将不能被修改 |
6 | public void setValue(String newValue) 设置 cookie的值 |
7 | public String getValue() 获取cookie的值 |
8 | public void setPath(String uri) 设置cookie 的路径,默认为当前页面目录下的所有URL,还有此目录下的所有子目录 |
9 | public String getPath() 获取cookie 的路径 |
10 | public void setSecure(boolean flag) 指明cookie是否要加密传输 |
11 | public void setComment(String purpose) 设置注释描述 cookie的目的。当浏览器将cookie展现给用户时,注释将会变得非常有用 |
12 | public String getComment() 返回描述cookie目的的注释,若没有则返回null |
四、经典示例
示例一(自动登录):
login.jsp页
<h1>登陆页面</h1>
<form action="index.jsp" method="post">
用户名:<input type="text" name="uname"><br/>
密码:<input type="password" name="upass"><br/>
用户名:<input type="submit" value="登陆"><br/>
</form>
index.jsp页面
<%
//获取用户名和密码
String uname=request.getParameter("uname");
String upass=request.getParameter("upass");
//判断用户名密码是否正确
if("admin".equals(uname)&&"123456".equals(upass)){
//如果正确则保存进cookie
Cookie cookieName=new Cookie("uname",uname);
Cookie cookiePass=new Cookie("upass",upass);
//设置时间
cookieName.setMaxAge(30);
cookiePass.setMaxAge(30);
//添加
response.addCookie(cookieName);
response.addCookie(cookiePass);
}else{
//再次进来
Cookie cookies[]=request.getCookies();
if(cookies!=null&&cookies.length>0){
for(Cookie c:cookies){
if("uname".equals(c.getName())){
uname=c.getValue();
}
if("upass".equals(c.getName())){
upass=c.getValue();
}
}
}
}
if("admin".equals(uname)&&"123456".equals(upass)){
//则打印信息
out.println("你好"+uname);
}else{
response.sendRedirect("login.jsp");
}
%>
示例二(浏览足迹)(需要设置session为false不可用):
test1.jsp
<body>
<h1>展示页面</h1>
<a href="test2.jsp?name=a">a</a><br/>
<a href="test2.jsp?name=b">b</a><br/>
<a href="test2.jsp?name=c">c</a><br/>
<a href="test2.jsp?name=d">d</a><br/>
<a href="test2.jsp?name=e">e</a><br/>
<a href="test2.jsp?name=f">f</a><br/>
<a href="test2.jsp?name=g">g</a><br/>
<pre>
</pre>
<h2>最近浏览</h2>
<%
Cookie cookies[]=request.getCookies();
if(cookies!=null&&cookies.length>0){
for(Cookie c:cookies){
out.println(c.getValue()+"<br/>");
}
}
%>
test2.jsp
<h1>详细页面</h1>
商品名:<%=request.getParameter("name")%>
<a href="test1.jsp">返回展示页面</a>
<%
String title=request.getParameter("name");
Cookie cookie=new Cookie("name"+title,title);
response.addCookie(cookie);
%>