一、会话及会话跟踪
1.1会话
Cookie和Session同属于会话跟踪技术,所谓会话就是指一个用户对某一个服务器的来回请求和响应,不同的用户对同一个服务器的请求是分别不同的会话,例如我在某个网页上点击了一个超链接,然后这个超链接通过servlet技术向服务器提交请求之后由服务器跳转到另一个页面,然后我在这个新的页面又点击了一个超链接向服务器提交申请,这样的过程就称之为会话,且属于同一个会话,在例如用户a和用户b分别向服务器提交请求,这则是两个不同的会话。
1.2会话跟踪
会话跟踪是Web中常用的一个技术,用来记录用户和服务器的会话中的一些数据内容,我们今天讲的cookie和session就是会话跟踪的常用技术。
二、Cookie机制
2.1 什么是cookie?
Cookie中文意思是饼干,是W3C组织提出的一种机制。其实它就是一份数据,由服务器产生并且保存在客户端上,这个数据就是在会话过程当中产生的。
2.2 Cookie的产生
由于我们日常使用的HTTP协议是一种无状态协议,所谓无状态就是指在我们第二次访问服务器的时候,服务器根本不知道我们之前是否来访问过。为了弥补http协议的缺陷和更好的提高用户的体验以及更好的交互,于是有了Cookie,对公司来说它可以方便收集用户的习惯。
2.3 Cookie的分类
- 会话Cookie-------关闭浏览器,cookie就删除,失效。
- 持久Cookie-------在指定时间内,都一直有效。
2.4Cookie的应用场景
- 自动登录
- 浏览记录
- 记录某一服务器的访问次数
- 记录最近访问的时间
2.5 Cookie的简单使用
给客户端添加cookie:
Cookie cookie=new Cookie("aa","bb");//创建Cookie对象,他的值可以理解为Key-Value的形式
response.add(cookie)//通过response返回给客户端
这时候我们用httpwatch工具抓取服务器返回给客户端的http数据中就多了这个cookie
获取客户端发送给服务器的cookie:
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
String cookieName=c.getName();
String cookieValue=c.getValue();
System.out.println(cookieName+"=="+cookieVallue);
}
}
2.6 Cookie的常用的API
-
cookie.setMaxAge()------设置有效期
默认情况下,在没有设置参数的时,关闭浏览器后cookie就没有了。
正值表示这个秒数过后就会失效
负值表示关闭浏览器之后就会失效
cookie.setMaxAg(606024*7)//有效期为七天 -
cookie.setValue(newValue)-----设置新的值
-
cookie.setDomain(".baidu.com")-----设置可以访问该Cookie的域名
用于指定只有请求了指定的域名,才会带上该cookie -
cookie.setPath("/CookieDemo")-----
设置只有访问该域名底下的cookieDemo才会带上cookie -
cookie.setSecure(true)
设置安全属性,这样浏览器只会在HTTPS和SSL等安全协议中传输这个cookie, -
Cookie中不提供修改和删除的API,所以想要修改某个Cookie,只需要将它的值设置为空(cookie.setValue("");)并且将有效期置0即可。
2.7 例子–上次访问时间
if("admin".equals(userName)&&"123".equals(password)){
//获取cookie
Cookie[] cookies=request.getCookies();
//从数组里面找出我们想要的cookie
Cookie cookie=CookieUtil.findCookie(cookies,"last");
//当第一次登录
if(cookie==null){
Cookie c=new Cookie("last",System.currentTimeMillis()+"");
c.setMaxAge(60*60)
response.addCookie(c);
response.getWrite.write("欢迎您",+username);
}else{
//第二次登录
long lastVisitTime=Long.parseLong)cookie.getVallue());
/输出到页面
rsponse.getWriter.write("欢迎您,"+userName+",上次来访时间是:"+new Date(lastVisitTime));
//重置登录时间
cookie.setValue(System.currentTimeMills()+"");
response.addCookie(cookie);
}
}else{
response.getWriter.write("登录失败");
}
2.8 例子–清除上次访问时间
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtil.findCookie(cookies, "last");
cookie.setValue("");
cookie.setMaxAge(0);
response.addCookie(cookie);
response.getWriter().write("清除成功!");
三、Session机制
3.1什么是Session
session中文指会话,是基于Cookie的一种会话机制,Cookie是服务器返回给客户端的一小部分数据,并且存放在客户端上,而Session是存放在服务器。
3.2 Session的作用
可以用来记录客户端的状态,是服务器使用的记录客户端的一种机制但是由于它存储在服务器上,所以对服务器增加了存储的压力。
3.3 常用的API
- 获取Session对象:HttpSession session=request.getSession();
- 得到会话的id:String id=session.getId();
- 存值:session.setAttribute(name,value);
- 取值:session.getAttribute(name);
- 移除值:session.removeAttribute(name);
3.4 Session的生命周期
何时创建
在servlet中调用了request.getSession();
何时销毁
-
session是存放在服务器的内存中的一份数据,可以持久化,即使关闭了浏览器session也不会销毁
-
关闭服务器
-
session会话的时间过期,有效期过了,在tomcat中默认的有效期是30分钟。
3.5例子,添加购物车
response.setContentType("text/html;charset=utf-8");
//1. 获取要添加到购物车的商品id
int id = Integer.parseInt(request.getParameter("id")); // 0 - 1- 2 -3 -4
String [] names = {"Iphone7","小米6","三星Note8","魅族7" , "华为9"};
//取到id对应的商品名称
String name = names[id];
//2. 获取购物车存放东西的session Map<String , Integer> iphoen7 3
//把一个map对象存放到session里面去,并且保证只存一次。
Map<String, Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
//session里面没有存放过任何东西。
if(map == null){
map = new LinkedHashMap<String , Integer>(); request.getSession().setAttribute("cart", map);
}
//3. 判断购物车里面有没有该商品
if(map.containsKey(name)){
//在原来的值基础上 + 1
map.put(name, map.get(name) + 1 );
}else{
//没有购买过该商品,当前数量为1 。
map.put(name, 1);
}
//4. 输出界面。(跳转)
response.getWriter().write("<a href='product_list.jsp'><h3>继续购物</h3></a><br>"); response.getWriter().write("<a href='cart.jsp'><h3>去购物车结算</h3></a>");
移除Session中的元素
//强制干掉会话,里面存放的任何数据就都没有了。
session.invalidate();
//从session中移除某一个数据
//session.removeAttribute("cart");