Cookie&Session

Cookie_Session简介

Cookiesession要解决的问题

        cookie_session是用来解决会话问题的.什么是会话呢?在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。

其实这里的会话就是我说的多次请求响应这个过程.但是多次请求响应何时开始何时结束呢?

会话中遇到什么问题了呢?就是我说的希望在多次请求响应之间将一些数据保存在合适的区域.而我们现在对WEB的访问是,发出一次请求,服务端对本次请求响应之后,能够保存数据的那三个区域都无法满足我们的需求.而我们现实生活中浏览某些网站时,这些网站需要记录住我们用户的一些信息的,此时可以利用cookie_session来解决

Cookie

1_Cookie简介(参照PPT)

*_采用cookie之后协议底层的传输方式

GET /test/Servlet01  http/1.1

请求头

请求头

请求头

空行

 

 

http/1.1  200  ok

响应头

响应头

Set-Cookie:

   "k1=v1; Expires=Mon, 19-Jun-2017 01:35:43 GMT; Path=/day37

k2=v2; Expires=Mon, 19-Jun-2017 01:35:43 GMT; Path=/day37"

响应头

空行

响应体

 

POST /test/Servlet01  http/1.1

请求头

请求头

请求头

Cookie:"k1=v1,k2=v2"

空行

请求体

Cookie API

API介绍

*_创建Cookie

Cookie  ck1=new Cookie(“k1”,”v1”);

ck1.setMaxAge(60*60*24*7);

ck1.setPath(“/day38”);

*_发送cookie

response.addCookie(ck1);

*_获取所有cookie

Cookie[] cks=request.getCookies();

for(Cookie ck:cks){

   ck.getName();

   ck.getValue();

}

//获取浏览器发送的指定cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie coo : cookies) {
if("username".equals(coo.getName())){
//打印cookie的名称和值
System.out.println(coo.getName()+":"+coo.getValue());
}
}}

*_删除cookie

   获取到待删除的cookie

   ck.setMaxAge(0);

   ck.setPath(“/test”);

   response.addCookie(ck);

不同的浏览器对Cookie个数有限制,对于单个Cookie的大小也是有限制

Cookie中如何存入中文信息

String value= URLEncoder.encode("张三","utf-8");
Cookie ck=new Cookie("name",value);
response.addCookie(ck);
response.getWriter().print("send cookie ok");
 
Cookie ck=CookieUtil.findCookieByName(request.getCookies(),"name");
if(null!=ck){
    String value=ck.getValue();
    String myName=URLDecoder.decode(value, "utf-8");
    response.setContentType("text/html;charset=utf-8");
    response.getWriter().print("cookie的值是:"+myName);
}

记录用户上次访问时间

public class VisitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
 
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
        /**
         * 1.获得从客户端带过来的所有的Cookie:
         * 2.从所有的Cookie中查找指定名称的Cookie:
         * 3.判断是否是第一次访问:
         *   * 是第一次:显示欢迎
         *   * 不是第一次:显示欢迎 同时显示上次访问时间.
         * 4.记录当前的时间,并且利用Cookie将时间回写到浏览器端.
         */
        // 获得客户端的所有的Cookie:
        Cookie[] cookies = request.getCookies();
        // 从cookies的数组中查找指定名称的Cookie:
        Cookie cookie = CookieUtils.findCookie(cookies, "visitTime");
        // 判断是否是第一次访问:
        response.setContentType("text/html;charset=UTF-8");
        if(cookie == null){
            // 第一次访问
            response.getWriter().println("<h1>欢迎来到本网站!</h1>");
        }else{
            // 不是第一次
            long time = Long.parseLong(cookie.getValue());
            Date date = new Date(time);
            response.getWriter().println("<h1>欢迎来到本网站!您的上次访问时间是:"+date.toLocaleString()+"</h1>");
        }
        // 记录当前的时间,回写到Cookie中.
        Cookie c = new Cookie("visitTime",""+System.currentTimeMillis());
        response.addCookie(c);
    }
 
protected void doPost(HttpServletRequest request, HttpServletResponse
 response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Cookie其它知识 

1_Cookie的分类

#_会话级别的Cookie默认的.关闭了浏览器Cookie就销毁了.

#_持久级别的Cookie:需要设置有效时长的.关闭浏览器也不会销毁的Cookie.

setMaxAge(int expiry);  以秒为单位的时间,超过了该时间后Cookie会自动销毁. setMaxAge(0),手动删除持久性的Cookie(前提:pathname必须一致)

setPath(String uri);  设置Cookie的有效路径.

Session:

API介绍

创建

   request.getSession();

session放入数据

   sess.setAttribute(name,obj)

   sess.getAttribute(name)

   sess.getAttributeNames()

   sess.removeAttribute(name);

销毁session

   sess.invalidate();//销毁session

其他API(了解)

   sess.getLastAccessTime(); //获取上次访问时间

   sess.getCreateTime();//创建时间

   sess.getId();//获取jessionid对应的字符串

域对象简介

作用域:变量/对象在程序中有效范围

前提: WEB项目特殊性(相对JAVASE),

  1_项目启动不会关闭

  2_运行在2个位置,服务端/客户端

  3_基于请求响应模型

我们再访问WEB项目过程中,多次请求响应中,在程序中产生数据,希望把这些数据保存下来.

保存在不同的作用范围内.

希望数据最大范围有效? 放置在ServletContext

希望数据本次请求响应有效放置在request

希望数据本次会话有效放置在session

域对象: servletContext/session/request

Session应用:

1_登录成功之后,用户信息放在session

2_验证码放在session

3_购物车

场景: 各个不同的客户端访问服务端,访问的是各自不同的数据,这些数据经常访问

其它知识点

Cookie/session区别

存储的位置不同:cookie客户端浏览器,session服务端的内存

存储的数据的大小不同:cookie限制,session服务端内存大小限制

安全性:cookie不安全,session安全

发表评论