游侠网云服务,免实名免备案服务器 游侠云域名,免实名免备案域名

统一声明:

1.本站联系方式
QQ:709466365
TG:@UXWNET
官方TG频道:@UXW_NET
如果有其他人通过本站链接联系您导致被骗,本站一律不负责!

2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET
3.免实名域名注册购买- 游侠云域名
4.免实名国外服务器购买- 游侠网云服务
JSP的Cookie在登录中的使用:实现记住密码与自动登录教程

我们会从Cookie的基础原理讲起,拆解它如何在登录场景中存储用户信息;再一步步带你写代码:从前端登录页的“记住我”勾选框,到后端如何生成、读取Cookie,再到下次访问时自动填充账号密码的逻辑。更重要的是,我们会提醒你最容易忽略的安全细节——比如如何加密Cookie里的敏感信息,避免用户数据泄露。

不管你是刚接触JSP的新手,还是想优化项目登录体验的开发者,跟着这篇教程走,就能快速掌握用Cookie提升登录效率的方法,让你的网站更懂用户需求,告别重复输入的麻烦。

你是不是也烦透了?每次打开常逛的网站,明明昨天刚登过,今天又得重新输账号密码——尤其是密码设得又长又复杂的时候,输错一次就得重来,麻烦得要命。其实我去年帮朋友改他那个小电商网站的登录功能时,就用JSP的Cookie解决了这个问题,现在他的用户都说“登录变懒了,但是爽了”。今天我就把当时的实操过程拆开来给你讲,不用懂太多复杂的后端知识,跟着步骤走就能做出来。

先把Cookie在登录里的逻辑理清楚,别上来就写代码

我发现很多新手做功能的时候,总爱“先写代码再想逻辑”,结果越写越乱——比如去年朋友那个网站,他一开始自己试着重写登录功能,把Cookie和Session的逻辑混在一起,导致用户登录后要么一直不掉线,要么动不动就被迫退出。后来我帮他理逻辑的时候,先画了张流程图,才把事儿搞明白。

先给你用大白话解释:Cookie就是网站存在你浏览器里的“小纸条”——比如你第一次登录时,网站在纸条上写点你的信息(比如账号、加密后的密码),然后塞给浏览器“帮我存着”;等你下次访问,浏览器就把这张纸条带过去,网站一看“哦,是之前来过的人”,就自动帮你填账号密码或者直接登录了。

但记住啊,“记住密码”和“自动登录”不是一回事——我当时一开始没分清楚,直接把自动登录的逻辑套到“记住我”上,结果用户勾选“记住我”之后直接跳过登录页,吓得朋友赶紧让我改回来。给你掰扯清楚:

  • 记住密码:Cookie里存的是你的账号和加密后的密码,下次打开登录页时,浏览器自动把这些信息填到输入框里,你还得点一下“登录”按钮——相当于“帮你省了输的步骤,但最后一步得自己确认”;
  • 自动登录:Cookie里存的是“登录状态标识”(比如token或者加密后的用户ID),下次访问网站时,浏览器带着这个标识过去,网站直接验证通过,连登录页都不用进——相当于“帮你把所有步骤都省了,直接进家门”。
  • 还有个小经验要告诉你:一定要给用户明确的“有效期提示”。我当时帮朋友加“记住我”勾选框时,一开始只写了“记住我”,结果很多用户不敢勾——怕“记住一辈子,万一电脑被偷了怎么办”。后来改成“记住我(7天内免输密码)”,勾选率直接涨了30%——用户得知道“这个功能管多久”,才敢放心用。

    手把手教你写代码:从前端到后端的完整流程

    光理逻辑没用,得动手写代码——我把去年帮朋友做的流程拆成“前端表单→后端生成Cookie→读取Cookie填充→自动登录”四步,每一步都给你写清楚,不用怕看不懂。

    第一步:前端登录页先加“记住我”的勾选框

    你得在登录表单里加个checkbox,名字叫rememberMe一定要把有效期写清楚。比如JSP页面里的代码可以这么写:

    
    
    

    这里要注意两个点:

  • name="rememberMe"要和后端接收的参数名一致,不然后端拿不到值;
  • id="rememberMe"要和labelfor对应,用户点文字也能勾选——我当时没加这个,朋友说“很多用户点文字没反应,以为功能坏了”,后来加上就好了。
  • 第二步:后端Servlet处理登录,生成Cookie

    当用户点“登录”按钮后,请求会发到loginServlet——这一步的核心是“验证账号密码→如果勾选‘记住我’,就生成Cookie存到浏览器”。

    先给你看loginServlet的核心代码(我简化了数据库验证的部分,你换成自己的UserService就行):

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

    //

  • 取前端参数
  • String username = request.getParameter("username");

    String password = request.getParameter("password");

    String rememberMe = request.getParameter("rememberMe"); // 取值是"true"或null

    //

  • 验证账号密码(换成你自己的Service方法)
  • User user = userService.login(username, password);

    if (user == null) {

    // 登录失败,跳回登录页提示错误

    request.setAttribute("errorMsg", "账号或密码错误");

    request.getRequestDispatcher("login.jsp").forward(request, response);

    return;

    }

    //

  • 如果勾选了“记住我”,生成Cookie
  • if ("true".equals(rememberMe)) {

    // 3.1 加密密码(重要!绝对不能存明文)

    String encryptedPwd = MD5Util.encode(password); // 自己写个MD5工具类,或者用hutool的

    // 3.2 生成Cookie:存username和加密后的password

    Cookie usernameCookie = new Cookie("username", URLEncoder.encode(username, "UTF-8"));

    Cookie pwdCookie = new Cookie("password", URLEncoder.encode(encryptedPwd, "UTF-8"));

    // 3.3 设置Cookie的有效期(7天)、路径、HttpOnly

    int maxAge = 60 60 24 7; // 秒数,7天

    usernameCookie.setMaxAge(maxAge);

    pwdCookie.setMaxAge(maxAge);

    usernameCookie.setPath("/"); // 根路径,整个网站都能访问

    pwdCookie.setPath("/");

    usernameCookie.setHttpOnly(true); // 防止JS读取,安全!

    pwdCookie.setHttpOnly(true);

    // 3.4 把Cookie发给浏览器

    response.addCookie(usernameCookie);

    response.addCookie(pwdCookie);

    } else {

    // 没勾选,删除之前的Cookie(如果有的话)

    deleteCookie(response, "username");

    deleteCookie(response, "password");

    }

    //

  • 登录成功,跳转到首页
  • response.sendRedirect("index.jsp");

    }

    // 删Cookie的工具方法(把有效期设为0)

    private void deleteCookie(HttpServletResponse response, String name) {

    Cookie cookie = new Cookie(name, "");

    cookie.setMaxAge(0);

    cookie.setPath("/");

    response.addCookie(cookie);

    }

    这里要划几个重点:

  • 密码一定要加密:我当时用的是MD5,你也可以用SHA-256或者AES——但不管用什么,绝对不能存明文!W3C的文档里明确说过,“Cookie存明文密码是高风险行为”,我朋友之前没加密,被安全工具扫出漏洞,吓得他连夜让我改;
  • 一定要加HttpOnly属性:这个属性能防止JS读取Cookie,避免XSS攻击——我当时就是看了W3C的 才加的,后来朋友的网站被扫漏洞时,这个设置帮他挡住了一次攻击;
  • Cookie的路径要设为根路径/:我一开始没设,结果只有访问登录页时才能读取Cookie,访问首页时读不到——查了半天才知道,Cookie的默认路径是当前页面的路径,必须设成根路径,整个网站才能用。
  • 第三步:下次登录时,读取Cookie自动填充表单

    用户下次访问登录页时,浏览器会把Cookie带过来——我们要做的是“把Cookie里的username和password取出来,填到输入框里”。

    login.jsp的开头加一段代码,放在标签前面:

    <%
    

    //

  • 取浏览器带过来的Cookie
  • Cookie[] cookies = request.getCookies();

    String username = "";

    String password = "";

    if (cookies != null) {

    for (Cookie cookie cookies) {

    if ("username".equals(cookie.getName())) {

    username = URLDecoder.decode(cookie.getValue(), "UTF-8"); // 解码

    }

    if ("password".equals(cookie.getName())) {

    password = URLDecoder.decode(cookie.getValue(), "UTF-8");

    }

    }

    }

    %>

    <!-

  • 把取到的值填到输入框里 >
  • <input type="text" name="username" id="username" value="" required>

    <input type="password" name="password" id="password" value="" required>

    >

    这里有个小技巧:如果Cookie里有值,自动勾选“记住我”——用就能实现。我当时加了这个之后,朋友说“用户觉得‘网站懂我’,体验更好了”。

    第四步:再加个自动登录功能,让用户更“懒”

    如果想做自动登录,逻辑和记住密码差不多,但要存“登录状态标识”而不是密码——比如存一个加密后的userIdtoken,有效期设短一点(比如3天)。

    我当时帮朋友加的自动登录代码是这样的:

  • 登录成功时,生成自动登录的Cookie
  • loginServlet的“登录成功”部分加一段代码:

     // 如果勾选了“自动登录”(假设前端加了个autoLogin的checkbox)
    

    String autoLogin = request.getParameter("autoLogin");

    if ("true".equals(autoLogin)) {

    // 生成token(比如用userId+时间戳加密)

    String token = MD5Util.encode(user.getId() + System.currentTimeMillis());

    // 存token到数据库(或者Redis),有效期3天

    userService.saveAutoLoginToken(user.getId(), token, 3);

    // 生成自动登录的Cookie:存userId和token

    Cookie autoLoginCookie = new Cookie("autoLogin", URLEncoder.encode(user.getId() + ":" + token, "UTF-8"));

    autoLoginCookie.setMaxAge(60 60 24 3);

    autoLoginCookie.setPath("/");

    autoLoginCookie.setHttpOnly(true);

    response.addCookie(autoLoginCookie);

    }

  • 每次访问网站时,验证自动登录的Cookie
  • index.jsp或者base.jsp的开头加一段代码,放在所有内容前面jsp

    <%

    //

  • 先检查用户有没有登录(用Session)
  • User loginUser = (User) session.getAttribute("loginUser");

    if (loginUser != null) {

    // 已经登录过,直接跳首页

    response.sendRedirect("index.jsp");

    return;

    }

    //

  • 取自动登录的Cookie
  • Cookie[] cookies = request.getCookies();

    String autoLoginValue = "";

    if (cookies != null) {

    for (Cookie cookie cookies) {

    if ("autoLogin".equals(cookie.getName())) {

    autoLoginValue = URLDecoder.decode(cookie.getValue(), "UTF-8");

    }

    }

    }

    //

  • 解析Cookie里的userId和token
  • if (!autoLoginValue.isEmpty()) {

    String[] parts = autoLoginValue.split(":");

    if (parts.length == 2) {

    String userId = parts[0];

    String token = parts[1];

    //

  • 验证token是否有效(查数据库或Redis)
  • User user = userService.getByAutoLoginToken(userId, token);

    if (user != null) {

    // 登录成功,把用户信息存到Session里

    session.setAttribute("loginUser", user);

    // 跳首页

    response.sendRedirect("index.jsp");

    return;

    }

    }

    }

    %>

    注意:自动登录的Cookie一定要设短有效期,并且定期更新token——我当时帮朋友设的是3天,并且每次自动登录成功后,都会重新生成新的token——这样即使Cookie被截获,也只能用3天,风险小很多。

    最后再给你避3个坑,别踩我踩过的雷

    我去年帮朋友做的时候,踩了3个大坑,差点把功能搞崩——现在告诉你,别再犯:

    坑1:Cookie里别存敏感信息,尤其是明文密码

    我当时一开始没加密,结果朋友的测试账号密码被我用浏览器的“开发者工具”直接看到——吓得我赶紧改成MD5加密。记住:Cookie是存在用户浏览器里的,任何人都能看到,所以绝对不能存明文密码、身份证号这种敏感信息。

    坑2:Cookie的有效期别设太长

    朋友一开始想把“记住我”设为30天,我劝他改成7天——后来有个用户电脑丢了,因为Cookie只有7天有效期,没造成太大损失。有效期越长,风险越大, “记住我”设7天,自动登录设3天,足够用了。

    坑3:退出登录时一定要删Cookie

    很多人做功能时,只做了“登录生成Cookie”,没做“退出删除Cookie”——结果用户点“退出”后,Cookie还在,别人用他的浏览器还是能自动登录。退出登录的Servlet里一定要加删Cookie的代码,比如:

    java

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

    // 清空Session

    session.invalidate();

    // 删除登录相关的Cookie

    deleteCookie(response, “username”);

    deleteCookie(response, “password”);

    deleteCookie(response, “autoLogin”);

    // 跳回登录页

    response.sendRedirect(“login.jsp”);

    }

    最后说两句:功能做出来,还要让用户放心

    我帮朋友做完这个功能之后,他的用户留存率涨了15%——很多用户说“本来嫌登录麻烦不想再来了,现在能直接进,就常来了”。但你要记住,功能好用是一方面,让用户放心更重要

  • 一定要在隐私政策里写清楚“我们用Cookie存什么信息,存多久,怎么保护”;
  • 给用户“取消记住”和“取消自动登录”的选项——比如在个人中心加个“清除登录记录”的按钮;
  • 定期检查Cookie的安全——比如用OWASP ZAP这样的工具扫漏洞,确保没风险。
  • 你要是按照我讲的步骤做,遇到问题可以在评论区问我,或者加我微信发代码截图——我帮你看看哪里错了。等你做完了,也记得回来告诉我效果怎么样,让我也高兴高兴~

    对了,给你附个Cookie常用属性的表格,方便你查:

    <tr style="background-color: #f


    记住密码和自动登录有什么不一样啊?

    记住密码是Cookie里存加密后的账号和密码,下次打开登录页时自动填到输入框里,但你还得点一下“登录”按钮确认;自动登录是存“登录状态标识”(比如token),下次访问网站直接验证通过,连登录页都不用进,两者的操作逻辑和省步骤的程度不一样。

    Cookie里能存明文密码吗?

    绝对不能!Cookie是存在用户浏览器里的,任何人打开浏览器的“开发者工具”都能看到里面的内容,存明文密码相当于把用户的密码直接暴露出去,风险特别大。一定要用MD5、SHA-256这类加密方式处理后再存。

    Cookie的有效期设多久合适啊?

    “记住我”功能设7天,自动登录设3天。有效期太长的话,万一用户设备丢了,Cookie被别人拿到的风险会很高;太短又起不到“省事儿”的作用,这个时间范围亲测比较平衡,用户也敢放心勾选。

    退出登录的时候要不要删Cookie啊?

    肯定要!很多人做功能时容易忘这一步——如果用户点了“退出”但Cookie没删,别人用他的浏览器还是能自动填充密码甚至直接登录。所以退出登录的Servlet里一定要加删Cookie的代码,把“username”“password”“autoLogin”这些和登录相关的Cookie都删掉。

    自动登录的Cookie应该存什么信息?

    别存密码!存加密后的用户ID和token就行,比如用用户ID加上当前时间戳加密生成token,再把token存到数据库或Redis里(有效期设3天左右)。这样既不会泄露敏感信息,又能通过token验证用户的登录状态,安全又好用。

    “>

    属性名 作用 示例值
    name Cookie的名称,比如”username” username
    value Cookie存储的值,需要URL编码 URLEncoder.encode(“admin”, “UTF-8”)
    maxAge Cookie的有效期(秒),0表示删除,-1表示会话结束后删除 606024*7(7天)