什么是Cookie

 在java是一个类,一对键和值组成,键值都是字符串类型,每个cookie只能保存一对键和值.每个cookie只能保存最大4K的数据

案列应用

保存用户名和密码在浏览器端,Cookie的数据事保存在本地浏览器的硬盘中,就算计算机关机也会保存,不同浏览器的cookie数据是不能共享的.

数据准备

sql

-- 创建用户表
CREATE TABLE `user`(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20),PASSWORD VARCHAR(20)
);-- 添加一条用户数据
INSERT INTO USER VALUES (NULL,'xiaofu','123');-- 查询是否有这个用户
SELECT * FROM USER WHERE username = 'xiaofu' AND PASSWORD = '123';

本次案列模拟三层架构,使用maven工程,数据库连接没有使用连接池,用的jdbc,目的是方便演示cookie在本地保存实现账户密码的记录

目录结构


pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.fs</groupId>  <artifactId>cookie_testLogin</artifactId>  <version>1.0-SNAPSHOT</version><packaging>war</packaging>
<!--  mysql--><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
<!--    Servlet--><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency>
<!--    junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>compile</scope></dependency>
<!--    tomcat--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>7.0.47</version></dependency></dependencies>
</project>

dao

public interface UserLogin {//根据用户名和密码查询是否有这个用户int LoginUser(String username,String password);
}
package com.fs.dao.impl;import com.fs.dao.UserLogin;import java.sql.*;/*
dao实现类,根据用户输入的用户名和密码进行校验将结果返回给业务层,让业务层处理逻辑我这里就用jdbc做案列*/
public class UserLoginImpl implements UserLogin {@Overridepublic int LoginUser(String username, String password) {int login = 0;Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//注册驱动Class.forName("com.mysql.jdbc.Driver");//获取连接对象connection = DriverManager.getConnection("jdbc:mysql://192.168.93.132:3306/test", "root", "root");//获取预编译语句对象preparedStatement = connection.prepareStatement("SELECT * FROM user WHERE username = ? AND PASSWORD = ?");//对占位符?进行赋值preparedStatement.setString(1,username);preparedStatement.setString(2,password);//执行查询,得到结果集resultSet = preparedStatement.executeQuery();while (resultSet.next()){//如果结果集有查询结果,就将login赋值1,后面对返回值进行判断,是1就说明数据库中有这个用户,就判断登录成功login = 1;}} catch (Exception throwables) {throwables.printStackTrace();} finally {//关闭资源try {resultSet.close();preparedStatement.close();connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}return login;}
}

service

package com.fs.service;import com.fs.dao.impl.UserLoginImpl;/*
业务层*/
public class LoginService {/*** 调用dao登录查询是否有这个用户,有就返回1* @param username 用户名* @param password 密码* @return 返回1 就表示有这个用户*/public int login(String username,String password){//依耐与Dao层UserLoginImpl userLogin = new UserLoginImpl();int i = userLogin.LoginUser(username, password);return i;}
}

Servlet

package com.fs.servlet;import com.fs.service.LoginService;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;
import java.io.PrintWriter;@WebServlet("/login")
public class ServletLogin extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();//依耐与业务层LoginService loginService = new LoginService();//从表单提交中获取用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");//调用业务层,判断数据库是否有这个用户名密码int login = loginService.login(username, password);if (login==1){//为1,表示有数据,者登录成功//在判断是否勾选了记住密码String remember = request.getParameter("remember");if (remember!=null) {//我们需要实现cookie自动登录就得把用户名和密码创建成cookie,发送给浏览器Cookie usernameCookie = new Cookie("username", username);Cookie passwordCookie = new Cookie("password", password);//设置访问路径和过期的时间,发送给浏览器usernameCookie.setPath(request.getContextPath() + "index.html");//保存在浏览器端1周usernameCookie.setMaxAge(60 * 60 * 24 * 7);//添加cookieresponse.addCookie(usernameCookie);passwordCookie.setPath(request.getContextPath() + "index.html");passwordCookie.setMaxAge(60 * 60 * 24 * 7);response.addCookie(passwordCookie);}//重定向到登录成页面response.sendRedirect("success.html");}else {//重定向到失败页面response.sendRedirect("failure.html");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

web页面

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户登录</title>
<!--    导入js文件--><script src="js/commons.js"></script>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post" id="loginForm"><table><tr><tb>用户名:</tb><tb><input type="text" name="username" id="username"/> </tb></tr><tr><tb>密码:</tb><tb><input type="password" name="password" id="password"/> </tb></tr><tr><td>记住密码</td>
<!--                没有value属性的前提下,点中它的值是on,如果没有勾上为null--><td><input type="checkbox" name="remember"/> </td></tr><tr><td><input type="submit" value="登录"></td></tr></table>
</form>
</body>
</html>

success.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录成功</title>
</head>
<body>
<h2>登录成功,感谢您使用</h2>
</body>
</html>

failure.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录失败</title>
</head>
<body>
<a href="index.html">登录失败,请从新登录</a>
</body>
</html>

commons.js

/*** 页面加载完毕后执行*/
window.onload = function () {//从cookie中得到用户名和密码let username = getCookie("username");let password = getCookie("password");//如果字符串不为空,才将数据提交给服务器if (username!="" && password!="") {//设置文本框的值document.getElementById("username").value = username;document.getElementById("password").value = password;}
}/*** 通过键得到cookie中的值*/
function getCookie(name) {//可以得到当前路径下所有的cookie信息let cookie = document.cookie;   //username=xiaofu; password=123if (cookie!="") {//按分号进行拆分成数组,数组中有2个元素let split = cookie.split("; ");for (let i = 0; i < split.length; i++) {   //split[0] = "username=admin"   split[1] = "password=123"let splitElement = split[i];   //每个元素//再按等于号来拆分let arr = splitElement.split("=");let key = arr[0];  //[0]号元素是username,[1]号元素adminlet value = arr[1];//如果name与key相等,就返回valueif (key == name) {return value;}}}return "";  //没有找到
}

运行效果

在tomcat中部署项目后,来浏览器端的登录页面

输入用户名密码,登录失败后页面

点击从新登录,这次输入正确的用户名密码
首先确定是否有cookie信息

点击登录

登录后发现cookie是已经记录在浏览器端了,后续打开网页会自动填充到文本框,因为在commons.js中设置了保存
登录成功页面

登录后重新回到登录页面查看cookie,并发现文本框自动填充

实现自动登录

只需要在index.html中的from标签中添加一个id,commons.js中添加一个方法即可

        //实现自动登录只需要在<form action="login" method="post" id="loginForm">标签中添加id,然后在下面执行submit方法document.getElementById("loginForm").submit();

Cookie实现用户登录记住密码,实现自动登录相关推荐

  1. android 自动登录机制,Android登录记住密码以及自动登录的实现

    记住密码以及自动登录的实现主要依赖于SharedPreferences类的使用,SharedPreferences是一个轻量级的存储类,用于存储一些小数据,比如登录账号密码以及状态信息等. 本文章只针 ...

  2. Android登录记住密码以及自动登录的实现

    记住密码以及自动登录的实现主要依赖于SharedPreferences类的使用,SharedPreferences是一个轻量级的存储类,用于存储一些小数据,比如登录账号密码以及状态信息等. 本文章只针 ...

  3. Cookie实现记住密码及自动登录

    最近对华丹快速开发平台进行升级,需要对实现记住密码以及自动登录功能,下面主要说一下如何用cookie实现此功能. 一.什么是cookie? Cookie,有时也用其复数形式Cookies.是保存在客户 ...

  4. 基于localStorge开发登录模块的记住密码与自动登录

    前沿||我是乐于分享,善于交流的鸟窝 先做写一篇关于登录模块中记住密码与自动登录的模块.鸟窝微信:jkxx123321 关于这个模块功能模块的由来,这是鸟大大的处女秀,为什么这么说呢?一天在群里,一个 ...

  5. 业务系统实现记住密码和自动登录功能

    业务系统实现记住密码和自动登录功能 公司的业务系统本来是受域控的,用户不需要登录可以直接访问系统.当然,虽然不用人工登录,系统本身会读取电脑的用户名为登录标识,对系统操作权限和记录也是以电脑名.近段时 ...

  6. EChat(简易聊天项目)六、实现记住密码和自动登录

    利用SharedPreferences登录界面记住密码和自动登录 ①修改login_layout.xml文件,增加如下代码,即添加2个勾选框 <LinearLayoutandroid:orien ...

  7. Winform 实现记住密码和自动登录

    一般的软件都有记住密码和自动登录功能,所以今天说一种winform的记住方式. 效果: 关闭软件,再次打开时,密码已经填写好了,不需要输入. 点击登录也能校验成功,完美实现登录记住账号密码. 自动登录 ...

  8. 引用借以记录借鉴 实现记住密码和自动登录功能

    WEB页面代码: <form id="Form1" runat="server"><input type="hidden" ...

  9. 记住密码 和 自动登录功能(登录)

    前台页面: <body><form id="Form1" runat="server"><input type="hid ...

最新文章

  1. 如何突破DNS报文的512字节限制
  2. Meta 发布 Bean Machine 帮助衡量 AI 模型的不确定性
  3. emui10是基于linux的么,华为EMUI10在意义上还能称作安卓吗?谷歌以后的安卓版本,华为是否有必要去更新?...
  4. 转:[大数据竞赛]协同过滤在这个问题上是否work
  5. 组件中props参数的应用
  6. 9.IDA-重新设置函数类型、创建数组结构
  7. 给大家分享一个简单的例子 给SWF加一个壳
  8. ASP.NET Core Razor 视图预编译、动态编译
  9. python数组元素复制_python的numpy数组 的复制问题?
  10. php中sisson用法,thinkPHP中session()方法用法详解
  11. 2021年“最美科技工作者”李德仁院士:科学要为祖国服务
  12. 源码编译php mysql_linux下apache+mysql+php开发环境纯源代码编译搭建(转)
  13. ros如何订阅关节力矩信息_ROS中阶笔记(二):机器人系统设计—URDF机器人建模...
  14. 火灾烟雾检测数据集和yolov4-yolov5检测模型
  15. 2018年值得推荐的20个Bootstrap网站模板
  16. 关于TOGAF认证考试
  17. 视易精通收银服务器自动关机,视易收银系统总汇
  18. 如何恢复录音删除的录音文件_如何把录音转成文字?推荐这款录音转文字app软件!...
  19. 计算方法(数值分析)实验:勒让德多项式求展开的三次平方逼近多项式代码实现 java
  20. 测试专业相机快门软件,检测快门次数软件 快门数量检测

热门文章

  1. Struts-config.xml配置文件《action-mappings》元素的详解
  2. AndroidのActivity之退出返回栈(二)
  3. c++ 或者 vc++中判断程序实例是否运行
  4. vmware 指定的网络名不可用
  5. android 自定义控件(FloatLabelLayout)
  6. UITextView,UITextField 和UIAlertView 在ios8上 当pop时候出现闪bug
  7. 夺命雷公狗---PHP开发APP接口---1(手动编写json)
  8. Impala架构和工作原理
  9. TensorFlow 调用预训练好的模型—— Python 实现
  10. 树(1)------实现和遍历