会话技术cookie

会话概念

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个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
    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处理

你可能感兴趣的:(servlet)