JavaWeb学习笔记(8)__Cookie篇

Cookie

本文章基于B站UP主:楠哥教你学Java 的课程《Java Web从入门到实战【完整版】》进行整理补充,本文章仅用于个人学习交流使用。

1.基本概念

Cookie是存储在浏览器里面的一个东西,不属于JSP内置对象,是一个全新的内容。

实现会话的一种机制,Cookie存储在客户端/浏览器,seeion存储在服务端。

Cookie 是服务端在 HTTP 响应中附带传给浏览器的⼀个⼩⽂本⽂件,⼀旦浏览器保存了某个 Cookie,在之后的请求和响应过程中,会将此 Cookie 来回传递,这样就可以通过 Cookie 这个载体完成客户端和服务端的数据交互。

用 key-value 的方式存储。

2.创建使用
  • 创建cookie
Cookie cookie=new Cookie("name","zhangsan");//创建
response.addCookie(cookie);//响应到客户端
  • 读取cookie
Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
        for (Cookie cookie2:cookies){
            out.write(cookie2.toString()+"<br/>");
            out.write(cookie2.getName()+"<br/>");//读取key
            out.write(cookie2.getValue()+"<br/>");//读取value
            out.write("---------"+"<br/>");
        }

现在cookie只存储在打开当前项目的浏览器中,如果用新的浏览器打开 cookie.jsp 会报空指针异常,因为不同的浏览器都有着自己的cookie。如果关闭浏览器,再打开,cookie信息不会显示,因为默认情况下cookie的生命周期直到当前浏览器关闭。

3.常用方法

void setMaxAge(int age) 设置 Cookie 的有效时间,单位为秒

int getMaxAge() 获取 Cookie 的有效时间

String getName() 获取 Cookie 的 name

String getValue() 获取 Cookie 的 value

Cookie[] cookies=request.getCookies();
        out.write(cookies[0].getMaxAge());//?输出一个奇怪的符号 
        System.out.println(cookies[0].getMaxAge());//-1 默认值 直到浏览器关闭
4.Cookie 和 Session 的区别
session:
保存在服务器

保存的数据是 Object

会随着会话的结束⽽销毁

保存重要信息 **例如:**账号密码信息,如果保存在cookie,能通过cookie的本地文件获取到

cookie:
保存在浏览器

保存的数据是 String

可以⻓期保存在浏览器中,⽆会话⽆关

保存不重要信息 **例如:**视频观看记录,再次打开上一次没看完的视频时会从断点处播放

存储⽤户信息方面:

session:

setAttribute(“name”,“admin”)

getAttribute(“name”)

⽣命周期:

服务端:只要 WEB 应⽤重启就销毁,

客户端:只要浏览器关闭就销毁。

退出登录: session.invalidate()

cookie:

response.addCookie(new Cookie(name,“admin”))

取:

Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
        for (Cookie cookie:cookies){  //只能通过遍历+条件判断的方式获取
            if (cookie.getName().equals("name"))
                out.write("用户名:"+cookie.getValue()+"<br/>");
        }

⽣命周期:

不随服务端的重启⽽销毁,

客户端:默认是只要关闭浏览器就销毁,我们通过 setMaxAge()⽅法设置有效期,⼀旦设置了有效期,则不随浏览器的关闭⽽销毁,⽽是由设置的时间来决定。

退出登录: setMaxAge(0)

5.登录案例

描述:用cookie实现用户登录验证,使浏览器能够保存用户信息,即关闭浏览器再回到 welcome 界面时能够正常显示,并实现登出功能,即销毁session.

  • 登录界面:cookie_login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/cookielogin" method="post">
    <table>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"/></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td><input type="submit" value="登录"></td>
            <td><input type="reset" value="重置"></td>
        </tr>

    </table>
</form>
</body>
</html>

  • 登录验证:验证用户名密码并设置cookie CookieLoginServlet.java
package com.lut.session;

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


@WebServlet("/cookielogin")
public class CookieLoginServlet extends HttpServlet {

    private String myusername="admin";
    private String mypassword="123456";

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        if (username.equals(myusername)&&password.equals(mypassword)){
            Cookie cookie=new Cookie("name",username);
            Cookie cookie1=new Cookie("password",password);
            cookie.setMaxAge(60*60*24);//生命周期设为1day
            cookie1.setMaxAge(60*60*24);
            resp.addCookie(cookie);
            resp.addCookie(cookie1);
            resp.sendRedirect("cookie_welcome.jsp");
        }else {
            resp.sendRedirect("cookie_login.jsp");
        }

    }
}
  • 欢迎界面:接收cookie信息,显示欢迎信息----cookie_welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>欢迎回来</h1>
    <%

        Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
        for (Cookie cookie:cookies){  //只能通过遍历+条件判断的方式获取
            if (cookie.getName().equals("name")){
                out.write("用户名:"+cookie.getValue()+"<br/>");
            }
            if (cookie.getName().equals("password")){
                out.write("密  码:"+cookie.getValue()+"<br/>");
            }
        }
    %>

    <a href="cookielogout">退出登录</a>

</body>
</html>

注: 登出功能跳转时发生405异常,等待处理…

  • 登出设置:销毁cookie,回到主界面----CookieLoginServlet.java
package com.lut.session;

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


@WebServlet("/cookielogin")
public class CookieLoginServlet extends HttpServlet {

    private String myusername="admin";
    private String mypassword="123456";

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        if (username.equals(myusername)&&password.equals(mypassword)){
            Cookie cookie=new Cookie("name",username);
            Cookie cookie1=new Cookie("password",password);
            cookie.setMaxAge(60*60*24);//生命周期设为1day
            cookie1.setMaxAge(60*60*24);
            resp.addCookie(cookie);
            resp.addCookie(cookie1);
            resp.sendRedirect("cookie_welcome.jsp");
        }else {
            resp.sendRedirect("cookie_login.jsp");
        }

    }
}
  • 界面展示

注: 从cookie数组获取信息时,每一次cookie的顺序不一定相同,即下一次有可能先显示 用户名,后显示 密码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值