Cookie&&Session学习

一、会话及会话跟踪

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"); 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空圆小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值