|
会话跟踪:
Java Servlet API使用Session来跟踪会话和管理会话内的状态通过在每一个请求和响应中包含SessionID,服务器就可将用户分开。
在Servlet规范中,有三种机制用于会话跟踪:
1、SSL(secure socket layer)会话
2、Cookies
3、URL重写
1、Cookies:
Cookies是一种由服务器发给客户的片段信息,存储在客户端浏览器的内存中或硬盘上,在客户对服务器的请求中发送它。
Cookies以键-值对的方式记录会话跟踪的内容,服务器利用响应报头Set-Cookie来发送Cookie信息。在JavaServletAPI中,提供了javax.servlet.http.Cookie类,用于创建Cookie。
基于Cookies的会话跟踪:
在JavaServletAPI,javax.servlet.http.HttpSession接口封装了Session的概念,Servlet容器提供这个接口的实现。
当请求一个会话的时候,Servlet容器就创建一个HttpSession对象,并为该对象分配一个唯一的Session ID,将其作为Cookie发送给浏览器,浏览器在内存中保存这个Cookie。
2、基于URL重写的会话跟踪:
当客户端不接受Cookie的时候,可以使用URL重写的机制来跟踪用户的会话。URL重写就是在URL中附加标识客户的SessionID,Servlet容器解释URL,取出SessionID,根据它将请求与特定的Session关联。SessionID被编码为URL字符串中的路径参数,这个参数的名字必须是jsessionid。
服务器将SessionID作为URL的一部分发给客户端,客户端在请求URL中再传回来。
服务器将所有发往客户端的URL进行编码,可以通过HttpServletResponse接口中的encodeURL方法和encodeRedirectURL方法实现。
3、SSL(secure socket layer 安全套接字层):
SSL(secure socket layer 安全套接字层)是一种运行在TCP/IP之上像HTTP这种应用层协议之下的加密技术。SSL是在HTTPS协议中使用的加密技术。SSL可以让采用SSL的服务器认证采用SSL客户端,并却在客户端和服务器之间保持一种加密的联系。在建立了加密连接的过程中,客户和服务器都可以产生名叫“会话密钥”的东西,它是一种用于加密和解密消息的对称密钥。基于HTTPS协议的服务器可以使用这个客户端的对称密钥来建立会话。
基于cookies的会话跟踪的java代码:
SetCookies.java:
public class SetCookies extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 向客户端写入Cookie,共6个
for(int i = 0; i < 3; i++) {
// 3个没有设置时间的Cookie,属于本窗口及其子窗口
Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value-S" + i);
response.addCookie(cookie);
// 以下3个Cookie设置了时间(3600秒,1小时),属于文本,别的窗口也可以访问到这些Cookie
cookie = new Cookie("Persistent-Cookie-" + i, "Cookie-Value-P" + i);
cookie.setMaxAge(3600);
response.addCookie(cookie);
}
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
String title = "Setting Cookies";
out.println("<html><head><title>设置Cookie</title></head>"
+ "<body>" + title + "<br>"
+ "There are six cookies associates with this page.<br>"
+ "to see them,visit the <a href=ShowCookies>"
+ "ShowCookies servlet</a>"
+ "</body></html>");
}
}
ShowCookies:
public class ShowCookies extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
PrintWriter pw = response.getWriter();
String title = "Active Cookies";
pw.println("init");
pw.println("<html><head><title>读取客户端</title></head>"
+ title
+ "\n" + "<table border=1 align=center>\n"
+ "<TH>Cookie Name<TH>Cookie Value" + "<br>");
// 读取客户端的所有Cookie
Cookie[] cookies = request.getCookies();
if(cookies != null) {
Cookie cookie;
for(int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
pw.println("<tr>\n" + "<td>" + cookie.getName() +"</td>\n"
+ "<td>" + cookie.getValue() +"</td></tr>\n");
}
}
pw.println("</table>\n<body><html>");
}
} 配置web.xml
<servlet>
<servlet-name>SetCookies</servlet-name>
<servlet-class>SetCookies</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SetCookies</servlet-name>
<url-pattern>/SetCookies</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ShowCookies</servlet-name>
<servlet-class>ShowCookies</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowCookies</servlet-name>
<url-pattern>/ShowCookies</url-pattern>
</servlet-mapping>
|