会话管理技术之Cookie

Cookie(曲奇饼干)
Cookie是一种客户端的会话管理技术
Cookie由服务器端生成,存放到客户端的小型文本文件,用于存储一些少量的数据
一个Cookie只能存放一项信息,以名称-值对的形式存储数据,名称和值都是字符串。
Cookie和响应一起发送到客户端,Cookie是作为响应报头/标头被发送到客户端,所以必须调用响应对象的addCookie(Cookie c)方法将Cookie对象添加到响应对象,Cookie才会被存到客户端
默认一个Cookie在浏览器关闭后被清除,默认是浏览器会话结束清除Cookie
每个主机只能获取自己存放的Cookie,一个主机/一个域名存放的Cookie只能自己读取,其他主机/域名不能读取这些Cookie,如百度存放的Cookie只能百度读取,网易的Cookie只能网易用。
一旦存放了Cookie,则下次向该程序发送请求的时候,Cookie会跟着请求一起被发送到服务器端。Cookie作为请求的报头和请求一起发送到服务器端。
一个Cookie只能包含一项标记信息,以键-值对的形式存放。
Cookie不安全,容易被攻击或篡改,不宜存放机密数据,cookie信息不应太大,否则发送数据量大,影响传输。Cookie适合存放少量非机密信息在客户端。如访问时间,浏览历史,会话id等
Cookie可被客户端删除或禁用。
Cookie的数量、大小限制等因浏览器而不同。一些浏览器限制每个域名不超过30-50个Cookie,一个Cookie大小不超过4kb,但具体因浏览器不同。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>登录首页</title>
        <link rel="stylesheet" href="css/bootstrap.min.css"/>
        <link rel="stylesheet" href="css/style.css"/>
        <style>
            label:hover{
                cursor: pointer;
                text-decoration: underline;
            }
        </style>
    </head>
    <body>  

        <div class="container">
            
            <br>

            <p class="text-danger">
                * 本程序没有连接数据库,使用账户anna和密码1234可以通过登录验证 <br>
                * 本程序使用Cookie实现记住用户密码的功能
            </p>
            
            <%
                //JSP提供隐式对象request,表示该页面收到的请求
                //通过请求对象可以获取到该程序放的所有Cookie,以Cookie数组的形式返回
                Cookie[] cks=request.getCookies();
                //也可能一个Cookie都没有,则无需遍历Cookie数组,直接返回
                if(null==cks) return;
                
                //定义两个变量,用于存储Cookie的值
                String uname="";
                String upwd="";
                
                //如果有Cookie,则遍历Cookie数组,读取Cookie的值即可
                for(Cookie c:cks){ //对于数组cks中的每个Cookie对象
                    //如果当前遍历的cookie的名称是username
                    if("username".equals(c.getName()))
                        uname=c.getValue(); //获取其值,存储到变量uname中
                    else if("userpwd".equals(c.getName())) //如果当前遍历的cookie的名称是userpwd
                        upwd=c.getValue();  //获取其值,存储到变量upwd中
                }
            %>

            <!--            
            这里将两个文本框的值分别设置为两个Cookie的值
            如果有对应的Cookie值,则会显示在文本框中
            如果没有对应的Cookie值,则显示空白,也就是记住密码的功能
            -->
            
            <form action="ls" class="form-inline text-center loginForm bg-primary">
                <h1 class="text-center">用户登录</h1>
                <hr>
                <br>&nbsp;号: <input type="text" name="username" value="<%=uname%>" class="form-control">
                <br><br>&nbsp;码: <input type="password" name="password" value="<%=upwd%>" class="form-control">
                <br><br>
                <input type="checkbox" id="remember" name="rem" value="Y">
                <label for="remember">记住密码</label>
                &nbsp;&nbsp;
                <input type="submit" value="登录" class="btn btn-sm btn-default">
            </form>

        </div>
    </body>
</html>

对应servelet代码:

package com.qdu.servlet;

import java.io.IOException;
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;

@WebServlet("/ls")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String uname = req.getParameter("username");
        String pwd = req.getParameter("password");

        //创建Cookie,用于存储少量的用户信息
        //Cookie是一种客户端技术,用于存储少量的用户信息
        //Cookie是服务器端创建,发送到客户端,存储在客户端的小型文本文件
        //使用Cookie类创建和操作Cookie
        //Cookie是以键-值对的形式存储数据,键和值都是字符串
        //一个Cookie只能用于存储一项信息
        //默认情况下Cookie是浏览器会话范围的cookie,随着浏览器关闭,Cookie会立刻被删除
        Cookie ck1 = new Cookie("username", uname);
        Cookie ck2 = new Cookie("userpwd", pwd);

        String rem = req.getParameter("rem");
        
        //可以设置Cookie的最大时间,也就是Cookie存在客户端多久,单位是秒
        //如果设置了最大时间,则在到期前,即使关闭浏览器再打开,Cookie依然会存在
        if ("Y".equals(rem)) { //如果用户选择记住密码,则设置Cookie 存在7天
            ck1.setMaxAge(7 * 24 * 60 * 60);
            ck2.setMaxAge(7 * 24 * 60 * 60);
        }else{ //否则立刻删除Cookie
            //考虑到用户可能上次记住,存储了cookie,这次选择不记住,则该种情况下要删除Cookie
            //Cookie类没有提供专门的方法用于删除一个Cookie
            ck1.setMaxAge(0); //最大时间为0意味着立刻删除Cookie
            ck2.setMaxAge(0);
        }

        //Cookie需要存储到客户端,所以需要和响应一起发送到客户端并存储在客户端
        //只不过是作为响应的报头/标头发送给客户端的
        //必须在设置好Cookie之后,将Cookie添加到响应对象中,才能发送到客户端
        resp.addCookie(ck1);
        resp.addCookie(ck2);

        if ("anna".equals(uname) && "1234".equals(pwd)) {
            //HttpServletResponse的sendRedirect()方法用于重定向到指定页面作为响应内容
            resp.sendRedirect("success.jsp"); //succeed
        } else {
            resp.sendRedirect("fail.html");
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值