标签:
HTTP本身时无状态通信协议,要进行会话管理的基本原理,就是将需要维持的状态回应给浏览器,有浏览器在下次请求时主动发送状态信息,package com.zghw.servlet.demo;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie的原理 由于HTTP是无状态的,访问一次后,无法记得上一次访问的客户端浏览器是否和这一次访问的是同一客户端浏览器。
* 为了实现认识同一客户端浏览器做一些业务需要,比如浏览历史商品记录,可以使用Servlet提供的cookie技术来实现。
*
* 当客户端浏览器发送一个请求过来以后,经过业务处理,可以响应给客户端浏览器一个cookie,这个值设置在响应首部的set-cookie
* 中,客户端浏览器收到这个set-cookie会把它以文件的方式存储在计算机上。这个文件就成为Cookie。
*
* 当客户端浏览器发送一个请求过来时,同时也会将存在于该网站的Cookie通过请求首部的set-cookie一并发送过来,服务器可以循环Cookie
* 集合来查询需要的Cookie进行处理。
*
* Cookie限制,一个浏览器最多放入300cookies,一个web站点,最多20cookie,而且一个cookie大小限制在4k
*
*/
@WebServlet("/MyCookiesServlet")
public class MyCookiesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String lastTime = "lasttime";
/**
* 模拟最近一次访问时间
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
boolean isFirst = true;
// 通过request请求取得客户端浏览器发送过来的cookie集合
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (lastTime.equals(cookie.getName())) {
// 更新上次访问时间,当客户端已经存在该cookie,新的cookie值会覆盖该cookie值
addCookieLastTime(response);
isFirst = false;
out.print("上次访问时间:" + cookie.getValue());
}
}
}
if (isFirst) {
addCookieLastTime(response);
out.print("你是第一次访问!");
}
}
private void addCookieLastTime(HttpServletResponse response) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = sdf.format(new Date());
// 创建Cookie对象
Cookie cookie = new Cookie(lastTime, now);
// 设置Cookie的存活时间,为0则永远存在
cookie.setMaxAge(3600 * 24 * 7);
// 设置到响应response对象,把Cookie发送给客户端浏览器,让其保存在客户端文件中
response.addCookie(cookie);
}
/**
*
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package com.zghw.servlet.demo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Session的使用示例 尝试运行HTTPServletRequest的getSession()时,Web容器会创建HttpSession对象,关键在于
* 每个HttpSession对象都会有个特殊的ID,称为SessinoID,你可以执行HttpSession的getId()来取得SessionID。
* 这个SessionID默认会使用Cookie存放在浏览器中。
* 在Tomcat中,Cookie的名称是JSESSIONID,数值则是getId()所取得的SessionID。
* 由于Web容器本身是执行于JVM中的一个JAVA程序
* ,通过getSession()取得HttpSession对象,HttpSession中存放的属性,自然也就存放于服务器端的Web容器中。每一个
* HttpSession各有一个特殊的SessionID,当浏览器请求应用程序时,会将Cookie中存放的SessionID一并发给应用程序,
* Web容器会根据SessionID来找出对应的HttpSession 对象,这样就可以取得各浏览器对应的会话数据。
* 所以使用HttpSession来进行会话管理时
* ,设定为属性的对象是存储在服务器端,而SessionID默认使用Cookie存放于浏览器端。Web容器存储在SessionID的Cookie“默认”为
* 关闭浏览器就失效,所以重启浏览器请求应用程序时,通过getSession()取得的是新的HttpSession对象。
*/
@WebServlet("/mySessionServlet")
public class MySessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
// 通过request获取HttpSession对象
HttpSession session = (HttpSession) request.getSession();
// 得到存储在HttpSession对象中的值
Integer in = (Integer) session.getAttribute("count");
if (in == null) {
// 每次重新打开一个浏览器会重新得到新的session对象,该对象对应新的sessionID,保存在浏览器端的Cookie中,
// 只要浏览器不关闭,则这个SessionID一直存在直到过期时间结束对象。
in = 0;
pw.print("从session中第一次访问 ");
} else {
in++;
pw.print("从session中第" + in + "次访问");
}
pw.print("sessionID=" + session.getId());
// session对象的创建时间
long createTime = session.getCreationTime();
// session对象是否是第一次创建
boolean isnew = session.isNew();
pw.print("当前session对象是否是第一次:" + isnew);
pw.print("当前session对象的第一次创建时间:" + createTime);
// 设置HttpSession中的值
session.setAttribute("count", in);
// 设置session的过期时间单位为秒 0为永远不失效,除非调用invalidate,或关闭浏览器
session.setMaxInactiveInterval(1800);
// session对象销毁
// session.invalidate();
//用户禁用cookie时,每次都会创建一个新的session对象
//如果不使用response.encodeURL来产生超链接的URL,在浏览器禁用Cookie的情况下,这个程序将会失败,也就是重符但即递增链接,
//计数器也不会递增
//如果执行encodeURL(),在浏览器第一次请求网站时,容器并不知道浏览器时否禁用Cookie,所以容器的作法时Cookie(发送set-cookie标头)与
//URL重写的方式,因此若Servlet有以下语句,无论浏览器是否有禁用Cookie,第一次请求时,都会显示在SessionID的URL:
//reqeust.getSession();response.encodeURL("mySessionServlet")
//
pw.print("<a href='"+response.encodeURL("mySessionServlet")+"'>递增</a>");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
标签:
原文地址:http://blog.csdn.net/zghwaicsdn/article/details/51138745