[Servlet] 12 Servlet Cookie(含重定向实操)


prtyaa
prtyaa 2023-12-27 15:34:27 48766
分类专栏: 资讯

交互中存在的问题:

不同的请求使用相同的请求数据,但是请求只要结束数据就被销毁了,其他请求需要将公共数据重新书写发送

解决:

以重定向上篇学习的重定向为例子,

首先我们发起第一次请求的时候,服务器解决请求发现是需要使用重定向的

然后告知浏览器需要访问新的servlet来处理,

这时候我们就需要跳转到新的链接去处理

在这个时候,服务器同时也做了一件事,

服务器会根据第一次的请求,告诉浏览器将他下一次请求所需要使用的请求数据保存下来,并在其他请求中附带上这次保存的数据

浏览器知道后,就把服务器告知下次请求需要附带的数据保存起来,并在下次访问的时候使用,也就是下一次请求的时候,会发送(新的请求数据 + 服务器告知保存的数据)

而这里服务器需要浏览器保存并在其他请求附带上的共用请求数据就是Cookie

 

Cookie特点

>浏览器端的数据存储技术

>存储的数据是在服务器端进行声明,并以响应的方式告诉浏览器进行存储在下次发起请求时附带

>存储内容有限,不适合大量数据的存储

>不设置有效期浏览器关闭就会失效

 

Cookie作用:

解决了不同请求之前请求数据共享的问题

 

创建设置发送Cookie

Cookie使用特点:

  1. 如果不设置有效期则默认存储在浏览器的内存里,浏览器关闭即失效。
  2. 如果设置了有效期,则存储到客户端的硬盘里,到期后自动销毁
  3. 如果不设置有效路径则任意项目路径的请求都会附带存储的cookie信息

创建cookie

    Cookie c1 = new Cookie("key", "value");

设置cookie(存活时间):如果不设置,cookie存放在内存中,浏览器关闭,cookie随之消亡

 Cookie c2 = new Cookie("mouse", "Razor");
        // 设置最大存活时间
        // 以秒为单位制定Cookie的最大存活时间
        // 正整数表示Cookie存活的时长
        // 负整数表示不存储Cookie, 当客户端关闭浏览器时Cookie被销毁
        // 0表示立马删除Cookie
        c2.setMaxAge(100); // 10 * 24 * 60 * 60

设置cookie(访问路径):如果不设置,那访问服务器下的所有servlet都会使用cookice,但是设置了,只有访问浏览器下特定的servlet才会携带设置好的cookie

   Cookie c3 = new Cookie("keyboard", "deiog");
        // 设置c3的访问路径
        // 下面路径表名只有当访问当前项目下的demo目录下的所有路径时, 才会携带c3
        c3.setPath(req.getContextPath() + "/demo");

完整代码

package com.bjsxt.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie c1 = new Cookie("computer", "dell");
        // 发送到客户端存储
        // 发送一个响应头, Set-Cookie: computer=dell
        resp.addCookie(c1);
        // 再创建一个Cookie, 用于设置最大存活时间
        Cookie c2 = new Cookie("mouse", "Razor");
        // 设置最大存活时间
        // 以秒为单位制定Cookie的最大存活时间
        // 正整数表示Cookie存活的时长
        // 负整数表示不存储Cookie, 当客户端关闭浏览器时Cookie被销毁
        // 0表示立马删除Cookie
        c2.setMaxAge(100); // 10 * 24 * 60 * 60
        resp.addCookie(c2);
        // 再创建一个Cookie, 用于设置访问路径
        Cookie c3 = new Cookie("keyboard", "deiog");
        // 设置c3的访问路径
        // 下面路径表名只有当访问当前项目下的demo目录下的所有路径时, 才会携带c3
        c3.setPath(req.getContextPath() + "/demo");
        resp.addCookie(c3);
    }
}

重定向实操

servlet1

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;


public class ServletCookie extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 设置请求编码格式
            req.setCharacterEncoding("utf-8");
        //2 设置响应编码格式
            resp.setContentType("text/html;charset=utf-8");
        //3 获取请求信息
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        //4 处理请求信息
        System.out.println(uname+"=="+pwd);
        //5 响应处理结果
              //5.3 响应重定向
            //创建cookie
            Cookie cookie = new Cookie("uname", URLEncoder.encode(uname, "UTF-8") );
            //设置有效时间 单位秒 
            cookie.setMaxAge(3600*24);
            //设置特定访问路径才带上cookie 如果不设置那么访问服务器内的所有servlet都会带上cookie
            cookie.setPath("/cookie2");
            // 发送到客户端存储
            // 发送一个响应头, Set-Cookie: computer=dell
            resp.addCookie(cookie);
            resp.sendRedirect("/cookie2");


    }
}

servlet2

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;


public class ServiceCookie2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        System.out.println("这里是Cookie2");
        //获取cookie数据
        String cook =null;
        Cookie[] cookies = req.getCookies();
        //输出cookie 数据
        for (Cookie cookie : cookies) {

           if ("uname".equals(cookie.getName())) {
               cook = URLDecoder.decode(cookie.getValue(), "UTF-8");
           }
        }
        System.out.println(cook);
    }
}

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31457
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2970
【软件正版化】软件正版化工作要点  2889
统信UOS试玩黑神话:悟空  2862
信刻光盘安全隔离与信息交换系统  2747
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1281
grub引导程序无法找到指定设备和分区  1251
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  169
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  169
点击报名 | 京东2025校招进校行程预告  165
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  161
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!