会话跟踪技术
会话跟踪技术是Web程序中常用的技术,用于跟踪用户的一次完整会话。
用户打开一个浏览器访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,或者服务器关闭,这整个过程我们称作一次会话。
常用的会话跟踪技术是cookie和session。cookie机制是通过在客户端记录信息确定用户身份,session机制是通过在服务器端记录信息确定用户身份。
cookie机制
cookie是客户端会话技术。
工作流程
客户端浏览器访问服务器端,服务器端建立一个cookie。
服务器通过response(响应头 set-cookie)将cookie返回给浏览器。
cookie保存在浏览器上,等到下一次访问服务器时,通过一定规则携带cookie,通过request(请求头 cookie)携带,服务器就可以拿到cookie值。
cookie机制相关API
new Cookie(String name, Object value);//创建cookie
response.addCookie(Cookie cookie);//将cookie返回给浏览器
Cookie[] request.getCookie();//获取cookie
index.jsp
<%--
Created by IntelliJ IDEA.
User: XJM
Date: 2019/2/10
Time: 11:19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/cookie.jsp">访问网站</a>
</body>
</html>
cookie.jsp
<%@ page import="java.util.Date" %>
<%@ page import="java.text.DateFormat" %><%--
Created by IntelliJ IDEA.
Author: XJM
Date: 2019-02-24
Time: 21:14
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Cookie accountCookie = null;
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
if (cookie.getName().equals("account")) {
accountCookie = cookie;
}
}
}
if (accountCookie == null) {
%>
欢迎访问本网站
<%
} else {
%>
上次访问时间为:${cookie.get("account").value}
<%
}
accountCookie = new Cookie("account", DateFormat.getDateTimeInstance().format(new Date()));
accountCookie.setMaxAge(3600);
response.addCookie(accountCookie);
%>
</body>
</html>
运行结果
第一次访问时:
第二次访问时:
注意:cookie不能跨浏览器,且不支持中文
session机制
session是服务器端会话技术。
工作流程
浏览器向服务器端发送请求,服务器端判断浏览器是否携带了唯一标识
- 若有唯一标识:服务器将在session池中查询该标识
- 若查询到:则可直接使用该session,并将其返回给浏览器存放
- 若未查询到:服务器为其创建一个私有的内存空间,session对象可操作,并将其返回给浏览器存放
- 若无唯一标识:服务器为其创建一个私有的内存空间,session对象可操作,并将其返回给浏览器存放
session相关API
HttpSession session=request.getSession();//获取session
//xxxAttribute()session属性操作
setAttribute(String s, Object o);//设置session属性
getAttribute(String s);//获取session属性值
removeAttribute(String s);//移除session
session生命周期
- session的创建:
Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
- session的销毁:
1. 服务器正常关闭
2. 长时间未使用session,导致超时:Tomcat默认30分钟,也可手动设置
有三种方法:
1. setMaxInactiveInterval(int interval) //单位为秒 interval =-1时永不过期,interval=0时表示删除
2. web.xml中设置
<session-config>
<session-timeout>30</session-timeout>
<!-- 单位为分钟 -->
</session-config>
3.tomcat也可修改,在server.xml中定义context时使用下面的标签来定义:
<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut=“3600”
isWARExpanded=“true” isWARValidated=“false” isInvokerEnabled=“true” isWorkDirPersistent=“false”/>
3. 手动销毁:invalidate()