web核心 5-cookie & session 域对象 request servletContext session

内容介绍

会话技术
    cookie
    session

会话技术

概述

会话

当打开一个浏览器的时候,意味着会话开始了
在开始和结束间,浏览器和服务器可以进行N次的交互
当关闭了该浏览器的时候,意味着会话结束了

作用

用来存储浏览器和服务器交互产生的N多数据(cookie或者session)

会话技术的分类:cookie和session

cookie(浏览器端的会话技术):浏览器和服务器交互的数据可以存储在cookie,整个cookie在浏览器端

session(服务器端的会话技术):浏览器和服务器交互的数据可以存储在session,整个session在服务器端

什么情况下我们会选择使用cookie或session去存储浏览器和服务器交互中产生的数据?

当用户的私有数据需要在多个Servlet之间传递的时候,可以使用会话技术解决(cookie&session)     

涉及到多个servlet之间的数据共享,此时用request和servletContext不行。
用户购买商品加购物车和结账是两个行为,两次请求, 不能用request域对象。一次请求可以用request。
当多人购买商品时,域对象servletContext中存的是多人购买的商品清单,结账时会出现问题。
用cooker和session互不影响。
在这里插入图片描述

客户端的会话技术:cookie

概述

cookie: 小纸条
作用:存储并且传递数据 (浏览器和服务器交互的数据)

特点

1 数据都在浏览器方
2 cookie是由服务器创建交给浏览器保存

cookie的使用(key和value的形式)

在这里插入图片描述
服务器如何创建cookie

Cookie cookie=new Cookie(String,String); 

服务器如果把cookie传递给客户端

response.addCookie(cookie);

在这里插入图片描述
tomcat 运行后,在浏览器端设置中查看Cookie信息。

注意:服务器可以给浏览器传递多个cookie,浏览器都会保存 但存在key值覆盖

服务器端如何获取到浏览器传递的cookie信息

Cookie[] request.getCookies(); //自动从请求头中 获取cookie信息 并且切割并封装成多个cookie对象

在这里插入图片描述

服务器获取浏览器端传递的Cookie
在这里插入图片描述

cookie的常用API

getName();   返回值String,返回的是cookie的key
getValue();  返回值String,返回的是cookie的value

cookie的整个使用过程

服务器创建cookie存储数据--->把整个cookie传递给浏览器 response.addCookie(cookie) ---->浏览器端自动保存cookie

浏览器会自动将保存的cookie传递服务器--->服务器获取传递的cookie数据  request.getCookies()--->使用数据

cookie的细节

在这里插入图片描述

会话级别的cookie(默认方式)和持久化级别的cookie

在这里插入图片描述
也可以在浏览器上清空cookie

会话级别的cookie:浏览器关闭当前会话默认会把保存的cookie全部销毁(默认)
持久化级别的cookie:可以让浏览器在一定时间不论开关都会保留cookie
		方法:setMaxAge(秒)
	  			 >0: 有效时间
	   			 =0:过期(清除)
		特点:设置的时间如果到期了,浏览器会自动把过期的cookie销毁

在这里插入图片描述

cookie的路径:通过设置cookie的路径 设置该cookie在哪些资源下有效

在这里插入图片描述
在这里插入图片描述

方法api:setPath(“路径”)
 /day10/cs5   只在访问/day10/cs5资源才带
 /day10      访问整个day10项目下的资源都带(企业中常用)
 /	         访问整个服务器上的项目资源都带	
 默认	       当前servlet访问路径的上一级
 				访问到当前servlet的上一级路径才带
				例如:Servlet: /demo/sd1==访问/demo下的资源才携带	

cookie的注意点:

cookie中不能出现特殊符号 例如:空格 分号 逗号  
cookie存入的数据有大小限制 4kb 

案例:案例–记录用户最新访问时间 且输出用户的上次访问时间

在这里插入图片描述
在这里插入图片描述

public class ServletDemo6 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //获取当前用户的访问时间
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = simpleDateFormat.format(date);
        time = URLEncoder.encode(time, "utf-8");
        System.out.println(time);
        //2 将访问时间放入cookie中写给浏览器
        Cookie cookie = new Cookie("lastTime", time);
        cookie.setMaxAge(60 * 60 * 24);
        cookie.setPath("/day_04Zhang");
        response.addCookie(cookie);
        //3 获取该用户的上次访问时间
        Cookie[] cookies = request.getCookies();
        if (cookie != null) {
            for (Cookie ck : cookies) {
                if("lastTime".equals(ck.getName())){
                    String value = URLDecoder.decode(ck.getValue(),"utf-8");
                    response.getWriter().print("你上次的访问时间是:"+value);
                }

            }
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

服务器端的会话技术:session

概述

session是保存在服务器端的会话技术
作用:也是为了保存会话中产生的数据
特点

1 保存在session中的数据在服务器端
2 session其实就是一个域对象  xxxAttribute()存储数据的方法

session的使用

session获取:request.getSession() (在一次会话中)
存:
在这里插入图片描述
取:
在这里插入图片描述

作用范围:

数据在一次会话中共享(浏览器关闭,会话关闭)
因为在一次会话中,访问多少个servlet,获取到的session都是同一个
但是如果不在一次会话中,多个servlet中产生的不再是同一个session对象

session的剖析(理解)

在这里插入图片描述

为什么在一次会话中,使用的都是同一个session对象

Cookie:JSESSIONID=C573A3AF2DDF0491AE6FB31608525641
因为jsessionid相同,根据jsessionid获取的session是同一个

在这里插入图片描述

为什么浏览器关闭以后(不在一个会话了),使用的就不是同一个对象了

浏览器一关闭   Cookie销毁了 cookie中的JSESSIONID也就没有

session的执行流程

在这里插入图片描述

当执行到调用getSession方法时,首先判断cookie中是否有jsessionid。
如果不存在jsessionid:那么直接创建一个新的session对象返回给你,并且向响应头中写一个新的jsessionid存放cookie给浏览器保存
如果存在jsessionid:从服务器内存中去获取对应的session对象继续使用
(浏览器关闭)
再次判断cookie中是否有jsessionid,如果没有,那么直接创建一个新的session对象返回给你,并且向响应头中写一个新的jsessionid存放cookie给浏览器

session和cookie的区别?(面试题)

 session:服务器端的会话技术 数据都在服务器
 cookie:客户端的会话技术 数据都在浏览器
 session:存储的内容没有大小限制
 cookie:只能存储4kb的内容
 session:存储的数据安全    
 cookie:存储的数据不安全

作业:案例—使用session判断验证码完成登录功能
在这里插入图片描述
在两个servlet中传递数据,只能用session。
共有的数据用servletContext
私有的数据用cookie,Session (购物车)

在这里插入图片描述

/*
* 先判断验证码
*       正确: 在获取用户名和密码去数据库匹配()
*       错误: 不匹配了  直接放回友情提示
*
*
* */

public class ServletDemo9 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //获取用户输入文本框的验证码
        String yzm = request.getParameter("yzm");
        HttpSession session = request.getSession();
        String codeyzm = (String) session.getAttribute("codeyzm");
        //对比判断
        if(codeyzm.equalsIgnoreCase(yzm)==false){
            request.setAttribute("msg", "验证码输入错误...");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }else{
            response.getWriter().print("作业:获取用户名和密码去和数据库匹配...");
        }

    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

补充知识:
jsp是一个能写java代码的html页面。html能做的事,jsp都可以做。
在这里插入图片描述
当验证码输入错误后,直接在页面显示验证码错误。
在这里插入图片描述在这里插入图片描述
效果如下:
在这里插入图片描述

域对象的总结

哪些技术可以在多个servlet/jsp之间进行数据传递:servletContext request cookie session

域对象:servletContext request session 都在服务器端 都有xxxAttribute方法

Request

创建:请求一次 创建一个request对象
销毁:响应回去,就销毁
数据作用范围:一次请求,多次跳转中,使用的是同一个request对象
(只要是在一个servlet中,request就是同一个对象,响应回去,request对象就销毁了,数据消失。请求多个setvlet,创建多个request对象)

ServletContext

创建:服务器启动,就创建且只创建一个ServletContext对象
销毁:服务器关闭销毁
数据作用范围:整个项目所有人共用(所有人都可以访问到此资源)

在这里插入图片描述
Session

创建:java认为在会话的第一次访问到request.getSession方法创建session对象
销毁
	 1 被动销毁:30分钟不使用自动从内存中移出  (可在tomcat中web.xml中修改时间)
	 2 主动销毁:session.invalidate()     (不常用)
	 3 服务器非正常关闭   (强制关闭服务器)
	
数据作用范围:一次会话中 因为一次会话中使用的是同一个session对象
只要多个servlet/jsp之间做数据传递和共享了,都要想到以上域对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值