Cookie和Session

会话

这些会话里的东西都是针对http协议而言的,而且,对于一个类,如果想被外界访问到,那这个类必须是servlet,因为只有servlet能被外界访问

  1. 会话: 一次会话中包括多次请求和响应,比如说两个人之间交谈,肯定不只有一句话,然后以其中一个人不说话了离开了为结束.
    1. 什么是一次会话呢: 浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开请求连接为止.
    2. 会话的功能: 在一次会话的范围内的多次请求之间来实现共享数据.
    3. java中共享数据的两种方式:
      • 客户端会话技术: cookie
      • 服务器端会话技术: session

Cookie

  1. 概念: 它是客户端会话技术,它将数据保存在客户端.

  2. cookie快速入门

    1. 使用步骤:

      1. 服务器端创建cookie对象,其中cookie是一个类,绑定数据.
        • 通过javax.servlet.http包下的Cookie实体类中的构造方法: public Cookie(String name, String value).
      2. 服务器端发送cookie对象.
        • 通过javax.servlet.http包下的HttpServletResponse接口中的方法: void addCookie(Cookie cookie).
      3. 服务器端获取cookie,拿到数据.
        • 通过javax.servlet.http包下的HttpServletRequest接口中的方法: Cookie[] getCookies().
      4. cookie发送数据代码.
      5. cookie接收数据代码.
      6. 注意,当这个servlet在同一个浏览器运行时,response能够正常获取数据,但是如果不在同一个浏览器运行,就不会获取到数据.
    2. cookie实现原理

      • 基于响应头set-cookie和请求头cookie来实现,这个可以在浏览器运行servlet的时候通过F12查看网络中响应头和请求头的变化知道.
      • 如图: cookie实现原理.
      • 我们要知道不论是发送cookie还是接收,都是以http协议的响应和请求形式来实现交互的.
  3. 一个小技巧:

    • 每次我们在idea中创建servlet时每次都要自己去写urlPattern还要在get方法里面调用post方法,这个就有点麻烦,这个过程是可以省略的,我们可以在idea中设置servlet的模板来解决这个问题.
    • 如图: 设置servlet模板.
  4. cookie的细节内容

    1. 一次可不可以发送多个cookie?

      • 可以
      • 如何做到: 可以创建多个cookie对象,使用response调用多次addCookie()方法即可.
      • 如果,多个servlet发送的cookie的键是相同的,虽然发送会都发送,但是接收的时候只会接收最后一个发送的,
      • 假如两个甚至多个servlet中如果键都是"msg",最后得到的值只有最后发送的一个msg的值.
      • 默认情况下,在浏览器没有关闭前,运行同一个src文件夹下面的某个servlet之后,然后运行其它servlet,我们都会发现前面运行过的servlet中cookie对象中的的键值对也会带过去,而且是在请求头中带过去,哪怕你重启了服务器,只要没有关闭浏览器,下次运行前面的值都还在.
      • 在浏览器中,每个cookie对象只会有一个备份,怎么理解呢,就是说你不管调用多少次某个servlet,在请求头中都只会有一个该servlet中的键值对信息,不会因为你刷新了多次就有多个,这也就侧面验证了假如多个servlet有相同键的cookie,只会保留最后一个的结论.
    2. cookie在浏览器中保存多长时间呢?

      • 默认情况下: 当浏览器关闭后,cookie数据被销毁,说明cookie是存在于浏览器的内存中,也就是说重新打开浏览器就需要重新请求重新响应cookie数据.
      • 设置cookie的生命周期让cookie实现持久化存储
        • 使用cookie对象中的方法setMaxAge(int seconds)其中参数有三种取值:
          • 当参数为正数时: 表示将cookie数据写到硬盘数据中,也就是实现了持久化存储,其中这个参数的大小就表示了cookies对象的存活时间,例如参数为30,表示30秒以后cookie文件就会被自动删除,在30秒内关闭浏览器重新打开再次获取该cookie对象依旧存在.
          • 当参数为负数时: 表示使用默认值.
          • 当参数为0时: 表示删除cookie信息.
          • cookie持久化存储示例案例.
    3. 能不能存中文呢?

      • 在tomcat8之前,cookie中不能直接存储中文数据,在tomcat8之后,cookie支持中文数据存储,但是还是不支持特殊字符.
      • 在cookie中不要使用符号,会报错的.
      • 那么,如果要在tomcat7及之前存储中文数据或者现在在cookie中带特殊符号,如空格,逗号等,就需要将它们进行转码—一般采用URL编码.
      • 怎么实现URL编码呢?下面的记住上一次访问时间案例中有,通过URLEncoder类中的静态方法encode(String s, String enc).
      • cookie存储中文示例代码.
    4. cookie获取的范围是多大呢,即共享问题.

      • 假设在一个tomcat服务器中部署了多个web项目,那么在这些web项目中的cookie能不能共享?
      • 默认情况下是cookie是不能共享的
      • 但是可以通过方法: setPath(String path)来设置cookie获取的范围,默认该方法的参数设置为当前的虚拟目录.
        • 即不调用该方法等同于cookie.setPath("/虚拟目录"),表示只有在该虚拟目录下的资源,才能获取该cookie下的信息.
        • 当我们将方法写成这样的时候: cookie.setPath("/"),这表示在服务器根目录下的所有文件都可以访问该cookie下的信息,其中/表示服务器根路径,即localhost/,后面跟什么都行,例如localhost:8080/cookie/cookieServlet1localhost:8080/cookie1/cookieServlet1都可以访问上面的cookie对象中的信息.
      • 不同的tomcat服务器间cookie共享问题(有印象就行)
        • 通过cookie的方法: setDomain(String path), 如果设置其一级域名相同(如news.baidu.comtieba.baidu.com中的.baidu.com为他们的一级域名,所以他们的cookie数据可以共享),那么多个服务器之间cookie信息就可以共享了.
    5. cookie的特点和作用

      1. 特点

        1. cookie存储数据在客户端浏览器,没有存储在服务器那么安全.
        2. 浏览器对于单个cookie的大小由限制(4KB左右,据浏览器而定),以及对同一个域名下的总cookie数量也有限制.
      2. 作用

        1. cookie一般用于存储少量的不太敏感,不太重要的数据.
        2. 不登录的情况下(登录之后我们的信息都是存储在数据库中)完成服务器对客户端的身份识别,例如我们对百度这个网页设置了不在首页显示天气,当我关闭浏览器下次再打开百度页面的时候,是不会显示天气的,这就是因为我们在设置了不显示天气以后,百度服务器就把这个设置用cookie对象响应给了浏览器并保存到硬盘中,下次我们再打开的时候,就是带着cookie数据打开的,此时该页面会自动读取我所带着的cookie中的数据并进行相应的设置.
  5. cookie案例(记住上一次访问时间)

    1. 需求:

      1. 访问一个servlet,如果是第一次访问,则提示: 您好,欢迎您首次访问.
      2. 如果不是第一次访问,则提示: 欢迎回来,您上次的访问时间为: xxxxxxxxx.
    2. 分析:

      1. 可以采用cookie来完成.
      2. 在服务器中的servlet判断是否有一个名为time的cookie
        1. 有,说明不是第一次访问
          1. 提示: 欢迎回来,您上次的访问时间为: 2019/05/15 16:30:55.
          2. 写回cookie: time=2019/05/15 16:31:00.
        2. 没有,说明是第一次访问
          1. 没有就去响应数据: 您好,欢迎您首次访问.
          2. 写回cookie:time=2019/05/15 16:30:55.
      3. 记住上一次访问时间代码实现.
    3. 一点小问题

      1. 我由于自己不小心在设置response编码格式的时候,把response.setContentType("text/html;charset=Unicode");写成了response.setContentType("content-type:text/html;charset=Unicode");,这样会导致什么问题呢?会导致直接把你要输出的内容下载下来,切记切记!.

JSP入门

  1. 概念: Java Server Pages 即java服务器端页面,可以理解为一个特殊的页面,其中既可以直接定义html标签,又可以定义java代码.

  2. 用于简化书写!!!

  3. 原理

    • jsp本质上就是一个servlet,浏览器通过页面访问服务器的时候,服务器会将jsp转换为java文件,然后编译成.class字节码文件,最后通过字节码文件做出响应.
  4. jsp脚本:jsp定义java代码的方式

    1. <% java代码 %>: 定义的java代码放在jsp文件转换为java文件后中的service方法中.该脚本中可以写所有在servlet的service方法中语句,在方法里面的输出语句是out.print().
    2. <%! java代码%>: 定义的java代码,在jsp转换为java类后的成员位置,可以是成员变量,也可以是成员方法,这种用的不多.
    3. <%= java代码%>: 这就相当于一个输出语句,输出语句中可以定义什么,该脚本中就可以定义什么,如果成员位置和局部位置都有同一个变量,会输出成员变量的值.
  5. jsp内置对象: 指在jsp页面中不需要获取和创建就可以直接使用的对象,比如request对象,一共有9个内置对象,包括request,response,out(字符输出流对象,将数据输出到页面上和response.getWriter()类似)等,具体的后面再写.

    • response.getWriter()和out.write()的区别: out对象定义在哪个位置就在哪个位置输出,而response.getWriter()对象不论定义在哪里,都会先于out对象输出,因为tomcat在给客户端做出响应前,会先找response缓冲区数据,再找out缓冲区数据.
    • 我们用的时候尽量都要out就可以了.
  6. jsp改造记住上一次访问时间代码.

Session(接口)

  1. 概念: 服务器会话技术,在**一次会话(表示session的范围)**的多次请求间共享数据,将数据保存在服务器端的对象中—HttpSession,session也是域对象.

    • 什么是一次会话呢,就比如我现在有两个servlet,通过session共享数据,当我把浏览器关闭后,这次会话就结束了,再打开浏览器就是一个新的会话,如果此时访问获取数据的servlet就会报错,就说明session的作用范围是一次会话.
  2. 快速入门

    1. 获取session对象: HttpSession session = request.getSession().
    2. 使用session对象: 即HttpSession对象
      1. Object getAttribute(String name).
      2. void setAttribute(String name,Object value).
      3. void removeAttribute(String name).
      4. 域对象都有这几个方法…
    3. session快速入门发送数据代码.
    4. session快速入门接收数据代码.
  3. 原理: session的实现是依赖于cookie的

    1. 当我们第一次请求,服务器创建了session对象后,只有本次会话没有结束,后面一直都不会再创建新的session对象了,也就是说,你没有关闭浏览器之前,虽然多次运行发送请求的servlet网址,响应头也不会再有带session的id的键值对了.
    2. 原理图: session原理图.
  4. session的细节

    1. 当客户端关闭,服务器不关闭后,两次获取的session是否是同一个?

      • 默认情况下,不是同一个.
      • 那么我希望客户端关闭重新打开后后,session也能相同,而且可以直接获取session的数据,应该怎么做呢?
        • 在获取session的servlet中创建一个cookie,键为JSESSIONID,值为session的id值,通过response的响应头set-cookie将其发送给浏览器,同时让cookie实现持久化存储.
          Cookie cookie = new Cookie(“JSESSIONID”, session.getId());
          cookie.setMaxAge(60*60);
          response.addCookie(cookie);
    2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

      • 服务器关闭了,session对象就被销毁了,因为内存被释放了,所以说不是同一个.
      • 因为对象不是同一个,所以说,原来的session对象中的数据我们是访问不到的,这就产生了数据丢失,这肯定是不希望看到的,所以这里需要提到两个点.
        1. session的钝化: 即在服务器正常关闭之前,将session对象序列化到硬盘上.
        2. session的活化: 即在服务器启动后,就session文件转化为内存中的session对象.
        3. 上面的两个功能tomcat已经为我们实现了,找到上述项目编译后的保存位置,放在tomcat保存目录下的webapps目录下,然后通过tomcat的lib目录启动tomcat,可以正常访问servlet,然后通过tomcat的lib目录正常关闭tomcat,我们会发现在tomcat的work目录会多一个session.ser的文件,里面就保存着session的id,重新正常启动tomcat之后,那个文件就会自动被删除,我们再次读取session的值的时候,它会自动把session的id通过请求头传递给服务器,所以我们可以正常读取session中的值.
        4. idea可以实现钝化,但是不可以实现活化的操作,重新启动服务器它会直接删除work目录然后新建一个,所以读取不到原session的数据.
    3. session的失效时间,即session什么时候被销毁

      1. 服务器关闭,session被销毁.
      2. session对象调用invalidate()方法自己销毁自己.
      3. session默认失效时间为30分钟,可以在apache-tomcat-9.0.19\conf\web.xml中查看到.
  5. session的特点:

    1. session用于存储一次会话的多次请求的数据,存储在服务器端.
    2. session可以存储任意类型,任意大小的数据.
  6. session与cookie的区别

    1. session存储数据在服务器端,而cookie在客户端.
    2. session没有数据大小限制,而cookie有.
    3. session数据安全,cookie相对不安全.
    4. session可以存储任意类型的数据,而cookie只能存储string类型的,通过session.setAttribute()和新建cookie对象时可以知道.

案例:验证码

  1. 需求:

    1. 访问一个带有验证码的登录页面login.jsp.
    2. 用户输入用户名,密码以及验证码.
      • 如果用户名和密码输入有误,跳转登录页面,提示: 用户名或密码错误.
      • 如果验证码输入有误,跳转登录页面,提示: 验证码错误.
      • 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您!
  2. 验证码案例代码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值