会话技术知识详解

概述

在这里插入图片描述

会话技术-Cookie

cookie的实现原理

在浏览器第一次发送请求的时候,携带一个参数,这个参数到达服务器,在服务器响应过程中以set-cookie响应头的形式传输到浏览器中并且保存在浏览器中(cookie信息)。发送第二次请求时,请求会自动携带cookie请求头,请求头中数据就是之前存储在浏览器中cookie信息。


Cookie特点:擅长于存储较长时间的数据,安全性较差。

代码实现【利用cookie实现返回上一次访问页面的时间】

在这里插入图片描述

//利用cookie实现返回上一次访问页面的时间
@WebServlet("/servlet/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //乱码
        request.setCharacterEncoding("utf8");
        response.setContentType("text/html;charset=utf8");

        //生成时间
        String time = new Date().toLocaleString();

        //设置响应头(set-cookie)
        response.setHeader("set-cookie","time="+time);
        //cookie信息在cookie请求头中,需要request对象来获取
        String cookie = request.getHeader("cookie");
        //因为第一次没有cookie
        if(cookie==null){
            response.getWriter().write("您是初始访问页面!!!");
        }else {
            response.getWriter().write("上次访问时间:"+cookie);
        }

    }

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

Cookie类

Cookie类是由sun公司提供一个Cookie技术开发类,通过创建Cookie类的对象,可以设置Cookie对象身上的有效路径、最大生命时长等等。
在这里插入图片描述

代码一【通过Cookie类实现访问上一次页面的时间】

在这里插入图片描述

@WebServlet("/servlet/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        //乱码问题
        request.setCharacterEncoding("utf8");
        response.setContentType("text/html;charset=utf8");
        //提供时间
        String time = new Date().toLocaleString();
        //创建Cookie对象,指定Cookie对象的名称和值
        Cookie cookie=new Cookie("time",time);
        //设置Cookie对象的最大生命时长(单位秒)
        cookie.setMaxAge(60*60*24);
        //指定Cookie对象有些路径(一般指定到当前web应用)
        cookie.setPath(request.getContextPath()+"/");
        //发送Cookie
        response.addCookie(cookie);
        //通过请求对象获取Cookie对象
        //浏览器端所有的Cookie对象都存在这个数组里
        Cookie[] cookies = request.getCookies();
        //第一次请求没有Cookie
        if(cookies!=null){
            //遍历数组---所有的Cookie对象
            for(Cookie c:cookies){
                //根据Cookie对象名称来查找指定的Cookie对象
                if("time".equals(c.getName())){
                    response.getWriter().write("上次访问时间:"+c.getValue());
                }
            }
        }else {
            response.getWriter().write("第一次访问");
        }
    }

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

代码二【删除cookie】

在这里插入图片描述

@WebServlet("/servlet/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        //创建Cookie对象
        Cookie cookie=new Cookie("time","");
        cookie.setMaxAge(0);//生命时长为0
        cookie.setPath(request.getContextPath()+"/");
        response.addCookie(cookie);
    }

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

会话技术-session

session的实现原理

由于浏览器端存储数据不安全,所以考虑把数据存储在服务器端就可以提升数据的安全性—session
在这里插入图片描述
在浏览器访问服务器之后,如果有session对象创建的语句执行则会在服务器中创建session对象,这个session对象存储当前浏览器的信息,多个浏览器会各自在服务器中保存对应的session对象,多个session对象是JSESSIONID来进行区分的。session是一个基于Cookie工作的对象,本质就是一个Cookie。在浏览器端会保留一个名词为JSESSIONID的
Cookie,用于存储session对象的ID。

注意:
request只能在服务器端操作
response只能在浏览器端操作

session对象的创建

在这里插入图片描述
session的特点:擅长于服务器端存储数据,时间较短,安全性较高

session功能一 域对象

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

@WebServlet("/servlet/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        //获取session对象---域对象
        HttpSession session = request.getSession();
        //设置域属性
        session.setAttribute("name","马云");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        doPost(request, response);
    }
}

@WebServlet("/servlet/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        //获取session对象---域对象
        HttpSession session = request.getSession();
        //获取域属性的值
        Object name = session.getAttribute("name");
        System.out.println(name);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        doPost(request, response);
    }
}

生命周期

在这里插入图片描述

	一个会话指的是:浏览器从打开到关闭

购物车案例

在这里插入图片描述

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

/*购物车*/
@WebServlet("/servlet/BuyServlet")
public class BuyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //乱码问题
        request.setCharacterEncoding("utf8");
        response.setContentType("text/html;charset=utf8");
        //获取参数--商品信息
        String prod = request.getParameter("prod");
        //创建session对象
        HttpSession session = request.getSession();

        //把JSSSIONID存储在Cookie对象指定最大生命时长
        Cookie cookie=new Cookie("JSESSIONID",session.getId());//指定session对象的ID
        cookie.setPath(request.getContextPath()+"/");
        cookie.setMaxAge(60*60*24*30);//即使关闭浏览器也有JSESSIONID的值
        response.addCookie(cookie);

        //设置域属性--商品信息
        session.setAttribute("prod",prod);
        //响应信息
        response.getWriter().write("恭喜,商品【"+prod+"】已经添加到购物车");
    }

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


@WebServlet("/servlet/PayServlet")
public class PayServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //乱码问题
        request.setCharacterEncoding("utf8");
        response.setContentType("text/html;charset=utf8");
        //创建session对象
        HttpSession session = request.getSession();
        //获取域属性--商品信息(如果没有添加商品到购物车域属性值就是null值)
        Object prod = session.getAttribute("prod");
        //
        if(prod!=null){
            response.getWriter().write("已为商品【"+prod+"】付款1000");
        }else {
            response.getWriter().write("您尚未选择任何商品");
        }
    }

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sparky*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值