会话概念
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
保存会话数据的两种技术
cookie机制
1.Cookie是客户端技术。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
2.而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
3.Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
session机制
Session是服务器端技术。服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
cookie应用
//cookie中文处理
String name=java.net.URLEncoder.encode("黄鑫","utf-8");
//创建cookie
Cookie cookie=new Cookie("name",name);
//设置cookie的生命周期
cookie.setMaxAge(3600);
//把cookie信息回写给浏览器,响应头Set-Cookie中内容
response.addCookie(cookie);
//读取所有cookie信息再筛选
Cookie cookies[]=request.getCookies();
for(int i=0;i<cookies.length;i++){
Cookie cookie=cookies[i];
if(cookie.getName().equals("name")){
//对中文进行解码
String val=java.net.URLDecoder.decode(cookie.getValue(),"utf-8");
out.println(cookie.getName()+" "+val);
}
}
具体代码请参考:
Github地址:创建cookie
Github地址:读取cookie
1.
public void setMaxAge(int expiry)
这个方法是设置Cookie的最大保存时间,即cookie的有效期。
2.当服务器给浏览器回送一个cookie时,如果在服务器端没有调用setMaxAge方法设置cookie的有效期,那么cookie的有效期只在一次会话过程中有效,当用户关闭浏览器,会话就结束了,此时cookie就会失效。
3.如果在服务器端使用setMaxAge方法设置了cookie的有效期,比如设置了30分钟,那么当服务器把cookie发送给浏览器时,此时cookie就会在客户端的硬盘上存储30分钟,在30分钟内,即使浏览器关了,cookie依然存在,在30分钟内,打开浏览器访问服务器时,浏览器都会把cookie一起带上,这样就可以在服务器端获取到客户端浏览器传递过来的cookie里面的信息了。
案例:存储上一次访问时间
Cookie[] cookies=request.getCookies();
boolean b=false;//假设没有此cookie
if(cookies!=null){
for(Cookie cookie:cookies){
String name=cookie.getName();
if("lasttime".equals(name)){
out.println("您上次登录的时间:"+cookie.getValue());
//更新
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = simpleDateFormat.format(new java.util.Date());
//Cookie mycookie=new Cookie("lasttime",nowTime);
cookie.setValue(nowTime);
cookie.setMaxAge(3600);
response.addCookie(cookie);
b=true;
break;
}
}
}
if(b==false){
out.println("first");
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime = simpleDateFormat.format(new java.util.Date());
Cookie cookie=new Cookie("lasttime",nowTime);
cookie.setMaxAge(3600);
response.addCookie(cookie);
}
具体代码请参考:
Github地址:存取上一次访问时间
案例:cookie登陆
String value = request.getParameter("iskeepinfo");
String id = request.getParameter("id");
if(value!=null&&value.equals("keep")){
//保存id
//创建cookie保存到登录用户的机器上
Cookie cookie=new Cookie("id",id);
cookie.setMaxAge(3600);
response.addCookie(cookie);
request.getRequestDispatcher("/Ok").forward(request, response);
}else if(value!=null&&value.equals("nokeep")){
Cookie[] cookies=request.getCookies();
for(Cookie cookie:cookies){
if(cookie.getName().equals("id")){
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}else{
request.getRequestDispatcher("/Ok").forward(request, response);
}
删除cookiecookie.setMaxAge(0)
即可
具体代码请参考:
Github地址:登陆页面
Github地址:cookie处理