• Day42-HttpServletRequest、Cookie


    Day42-HttpServletRequest、Cookie

    HttpServletRequest

    HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息后会被封装到HttpServletRequest,通过这个HttpServletRequest方法,获得客户端的所有信息。

    在这里插入图片描述

    在这里插入图片描述

    获取前端传递的参数,且请求转发

    在这里插入图片描述

    LoginServlet

    package com.xz.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.lang.reflect.Array;
    import java.util.Arrays;
    
    /**
     * @author 小龚
     * @create 2022-09-01 10:43
     */
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");//设置对客户端请求和数据库取值时的编码
            resp.setCharacterEncoding("utf-8");//设置指定服务器响应给浏览器的编码
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String[] hobbys = req.getParameterValues("hobbys");
            //后台接收控制台输出
            System.out.println("用户名:"+username);
            System.out.println("密码:"+password);
            System.out.println("爱好:"+Arrays.toString(hobbys));
            //通过请求转发
            //这里的  /  代表着当前的web应用,/r/success.jsp会转到/r/r/success.jsp,所以会报404错误,找不到路径
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    index

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        登录
    
    
    

    登录

    <%--设置文本居中--%>
    <%--这里表单表示的意思:以post方式提交表单,提交到我们的Login请求--%>
    <%--required设置如果使用该属性,则字段是必填(或必选)的。--%> 用户名:
    密码:
    爱好: <%--checkbox多选框--%> 小羊 小猪 小鱼 小赵
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    success

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        成功
    
    
    

    登录成功

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    web.xml

        <servlet>
            <servlet-name>LoginServletservlet-name>
            <servlet-class>com.xz.servlet.LoginServletservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>LoginServletservlet-name>
            <url-pattern>/loginurl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试

    登录测试

    在这里插入图片描述

    • 请求转发的时候,url不会发生变化 307
    • 重定向的时候,url地址栏会发生变化 302

    在这里插入图片描述

    后台获取信息输出

    在这里插入图片描述

    required测试

    在这里插入图片描述

    Cookie、Session

    会话

    会话:用户打开了一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话

    有状态会话:一个人访问过,下次再来访问,我们就会知道这个同学曾经来过,称之为有状态会话。
    你怎么能证明你是某个学校的学生

    两个对象:你 学校

    1. 学生证 学校给的证明
    2. 学校登记 学校的名单里有你

    那么

    一个网站怎么证明你来过

    两个对象:客户端 服务端

    1. 服务端给客户端一个信件,客户端下次访问的时候带上新建就可以了。cookie
    2. 服务器登记你来过了,下次你来的时候我来匹配你。

    保存会话的两种技术

    cookie

    • 客户端技术(响应、请求)

    session

    • 服务器技术,利用这个技术,可以保存用户的会话信息。我们可以把数据和信息放在session中!

    常见应用:

    • 网站登录之后,下次不用再登录了,第二次访问直接就上去了!

    Cookie

    1. 从请求中拿到cookie信息
    2. 服务器响应给客户端cookie
    Cookie[] cookies = req.getCookies();//获得Cookie
    cookie.getName()//获得Cookie中的key
    cookie.getValue()//获得Cookie中的value
    Cookie cookie = new Cookie();//新建一个Cookie
    cookie.setMaxAge();//设置cookie有效期
    resp.addCookie(cookie);//响应客户端一个Cookie
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    案例

    CookieDemo01

    package com.xz.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;
    import java.io.PrintWriter;
    import java.util.Date;
    
    /**
     * @author 小龚
     * @create 2022-09-01 21:36
     */
    //保存上一次访问的时间
    public class CookieDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //服务器告诉你来的时间,把这个时间封装成一个信件,你下次带着信件来,服务器就知道你来了
    
    
            //解决中文乱码
    
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
    
            PrintWriter out = resp.getWriter();
    
            //Cookie,服务端从客户端获取
            Cookie[] cookies = req.getCookies();//这里返回数组,说明Cookie存在多个
            //判断Cookie是否存在
            if(cookies!=null){
                //如果存在怎么办
                out.write("您上一次访问的时间是:");
                //对cookie进行遍历,找到匹配的cookie
                for (int i = 0; i < cookies.length; i++) {
                    Cookie cookie = cookies[i];
                    //获取cookie的名字
                    if(cookie.getName().equals("lastLoginTime")){
                        //获取cookie中的值
                        long lastLoginTime = Long.parseLong(cookie.getValue());//获取的值通过long转型
                        Date date = new Date(lastLoginTime);
                        out.write(date.toLocaleString());
                    }
                }
            }else {
                out.write("这是您第一次访问该网站");
            }
            //服务端给客户响应一个Cookie
            Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
            //设置cookie有效期
            cookie.setMaxAge(24*60*60);//以秒为单位,时间为一天
    
            resp.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    web.xml

        <servlet>
            <servlet-name>CookieDemo01servlet-name>
            <servlet-class>com.xz.servlet.CookieDemo01servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>CookieDemo01servlet-name>
            <url-pattern>/c1url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试

    在这里插入图片描述

    cookie:一般保存在本地的用户目录下appdata。

    细节:

    • 一个cookie只能保存一个信息
    • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
    • cookie大小有限制(4kb)
    • 浏览器的上限是300个cookie

    删除cookie:

    • 不设置有效期,关闭浏览器自动失效;
    • 设置有效期时间为0

    编码和解码

  • 相关阅读:
    我要给你讲的简单明了,Java就是值传递,不服来辩
    使用Spring Boot双数据源和PageHelper实现无缝分页查询
    【bug】使用mmsegmentaion遇到的问题
    Socket网络编程练习题四:客户端上传文件(多线程版)
    华为云云耀云服务器L实例评测 | 实例评测使用之软件性能评测:华为云云耀云服务器下的 Redis 性能评测
    kafka使用场景与设计原理
    Netty、Kafka中的零拷贝技术到底有多牛?
    像游戏一样办公,赋能OA系统转型
    戊戌数据库对比介绍
    【R语言教程】
  • 原文地址:https://blog.csdn.net/GHY0911/article/details/126653471