【Servlet】 四

本文主要介绍了cookie和session的区别和联系 . 

一.cookie

1.cookie是浏览器在本地持久化存储数据的一种机制

  • cookie的数据从哪里来

服务器返回给浏览器的

 

  • cookie的数据什么样

cookie中是键值对结构的数据,并且这里的键值对都是程序员自定义的

  • cookie有什么作用

cookie可以在浏览器存储一些临时性数据,其中最典型的一种是用方式,就是永存存储身份标识

  • cookie到哪里去

cookie的内容会在下次访问该网站的时候,自动被带到http请求中

  • cookie怎么存的

浏览器按照不同的域名分别存储cookie , 域名和域名之间的cookie是不能干扰的  ; cookie存储在硬盘上,一般会有一个超时时间

二.结合servlet的实战操作

结合Servlet, 进一步针对cookie和session进行一些实战操作

1.cookie操作

  • HttpServletRequest

Cookies getCookies( )

获取到请求中所有Cookie内容 .

返回一个数组,每个元素是一个cookie对象每个cookie对象都有键和值.

  • * Cookie类中的方法

getName()

返回cookie的键

getValue()

返回cookie的值

setValue()

修改cookie的值

  • HttpServletResponse类的相关方法

addCookie(Cookie cookie)

把指定的cookie添加到响应中

示例:访问setcookie请求,代码中就会构造cookie放到响应头

查看响应 . 

cookie怎么传输回浏览器?

在http响应里面就会带有header,每一个set-cookie里面都是一个键值对 , 也就是通过这样一个响应头返回给浏览器了,于是浏览器就会持久化保存

后续再次发送请求的时候,cookie的内容就会出现在请求中, 一旦返回给浏览器,就可以在浏览器(edge)查看

后续再次发送请求的时候,cookie的内容就会出现在请求中

访问getcookie , 来查看cookie的内容. 

访问getcookie,抓取请求报文 , cookie的内容已经包含在请求头中了  (注意,访问hellosrvlet中的任意一个,请求报文中都会带有该cookie . 

getcookie请求报文

1.1.cookie的工作流程

服务器调用相关的api就可以往响应里面添加setCookie字段,setCookie里面会包含一些程序员自定义的键值对,浏览器收到这样的字段就会将他们保存在本地,后续再往网站发送请求,就会把这样的键值对请求自动地带到header里面,这也就是cookie的基本流程.

注意:cookie里的数据只是在浏览器暂时歇歇脚,实际上真正发挥作用的,还得是在服务器这边的逻辑中生效 !

2.session操作

使用cookie结合session实现登陆效果,此时就可以更清楚的看到cookie的工作流程了 .

servlet也提供session相关的支持实现登陆功能,不需要直接使用cookie api,直接使用session 的api就可以了

2.1cookie的工作流程

  • HttpServletRequest相关方法

HttpSession getSession()

在服务器中获取会话 . 最最核心的api 

  • 参数为true(登陆使用)

1.如果没有sessison,就会创建除新ession

2.如果已经有了session,就能够查询到session

  • 参数为false(跳转,检查登陆状态)

1.不存在会话就返回null

2.存在会话就直接查询

1.先读取请求中的cookie,看cookie中是否有jsessionid(sessioid)属性,以及值是什么;

  • 如果没有,就认为需要创建新会话;
  • 如果有,就会拿着这个sessionid去查询看当前的session是否存在.(要是session存在,就直接返回该session; 要是session不存在就创建会话)

2.如果确实需要创建会话,就会创建一个session对象,同时生成一个唯一的jsessionid, 以jsessionid为键,以session对象为值,把这个键值对插入到服务器上的哈希表中

3.刚才生成的jsessionid又会通过addcookie方法,加入到响应中,此时响应中就会带有set-cookie字段,这里的值就是jsessionid=****,通过响应,就把jsessionid返回到浏览器了.

HttpSeesion类中的方法

getAttribute(String name)

返回该session会话中具有指定名称的对象

setAttribute(String name,Object value)

使用一个指定的名称绑定到一个对象到该session会话

session存在的意义,也是为了让用户保存一些自定义的数据,此处session更像是一个Map<String , Object>  ,此时程序员想保存什么样的键值对,就可以直接进行设置

在服务器上存有很多session,每个用户都有一个自己的session,一个服务器同时会有多个session,服务器就会使用Map的方式来组织多个session

( 每个session对象,又可以存储键值对 )

三.登陆页面

通过编写一个登陆页面,来使用上述api,进一步体会cookie和session之间的关系和作用

1.login.html

一个form表单,用户点击登陆,如果输入正确,就会发起一个http请求,服务器就会根据这个请求做出响应 (后面)

2.LoginServlet.java

服务器对客户端的登陆请求计算响应,  HttpSession session= req.getSession(true) 将getSession的参数设置为true , 如果该请求存在session就查询并返回该session对象 ; 如果不存在session就创建新的session对象 , 同时还可以通过setAttribute设置一些自定义数据 . 

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取到用户名和密码
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        if(username==null || password==null ||username.equals("") || password.equals("")){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("请求的参数不完整");
            return;
        }

        //2.验证用户名密码是否正确
        if(!username.equals("zhangsan")){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("用户名错误");
            return;
        }

        if(!password.equals("123")){
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("密码错误");
            return;
        }

        //3.登陆成功 此时就可以给这个用户创建回话
        //如果存在session就查询到它 , 如果不存在session就创建新session
        HttpSession session= req.getSession(true);

        //在会话中,可以顺便保存点自定义数据,比如保存一个登陆的时间戳
        session.setAttribute("username",username);
        session.setAttribute("time",System.currentTimeMillis());

        //4.让页面自动跳转到网站主页
        resp.sendRedirect("index");
    }
}

3.IndexServlet.java

主页需要使用getSession的false参数先验证用户的登陆状态, 如果存在session就返回会话,如果不存在就返回nul , 同时还可以通过getAttribute方法根据key 获得value.

登陆成功之后,后续再访问主页,请求头的cookie中就会自动带上JSESSIONID, 验证身份的时候就可以获取到这个session对象 , 也就实现了自动登陆效果了. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值