SpringBoot中使用Cookie实现记住登录的示例代码

最近在做项目,甲方提出每次登录都要输入密码,会很麻烦,要求实现一个记住登录状态的功能,于是便使用 Cookie 实现该功能

一、Cookie 简介

Cookie,一种储存在用户本地终端上的数据,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

其实 Cookie 就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把 Cookie 保存起来,当下一次再访问服务器时把 Cookie 再发送给服务器。

1、Cookie 是 HTTP 协议的规范之一,它是服务器和客户端之间传输的小数据
2、首先由服务器通过响应头把 Cookie 传输给客户端,客户端会将 Cookie 保存起来
3、当客户端再次请求同一服务器时,客户端会在请求头中添加该服务器保存的 Cookie,发送给服务器
4、Cookie 就是服务器保存在客户端的数据
5、Cookie 就是一个键值对

二、Cookie 使用

1、创建 Cookie

// Cookie 为键值对数据格式
Cookie cookie_username = new Cookie("cookie_username", username);

2、设置 Cookie 持久时间

// 即:过期时间,单位是:秒(s)
cookie_username.setMaxAge(30 * 24 * 60 * 60);

3、设置 Cookie 共享路径

// 表示当前项目下都携带这个cookie
cookie_username.setPath(request.getContextPath());

4、向客户端发送 Cookie

// 使用 HttpServletResponse 对象向客户端发送 Cookie
response.addCookie(cookie_username);

5、销毁 Cookie

// 根据 key 将 value 置空
Cookie cookie_username = new Cookie("cookie_username", "");
// 设置持久时间为0
cookie_username.setMaxAge(0);
// 设置共享路径
cookie_username.setPath(request.getContextPath());
// 向客户端发送 Cookie
response.addCookie(cookie_username);

三、进入正题

上面我们已经了解了 Cookie 是什么,并且知道了 Cookie 的创建以及销毁的方法,下面,我们就使用 Cookie 实现记住登录状态的功能,整个项目基于 SpringBoot 实现

1、注册拦截器

/**
* 注册拦截器
*/
@Configuration
public class WebConfigurer implements WebMvcConfigurer {

  @Autowired
  private LoginInterceptor loginHandlerInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    InterceptorRegistration ir = registry.addInterceptor(loginHandlerInterceptor);
    // 拦截路径
    ir.addPathPatterns("/*");
    // 不拦截路径
    List<String> irs = new ArrayList<String>();
    irs.add("/api/*");
    irs.add("/wechat/*");
    irs.add("/oauth");
    ir.excludePathPatterns(irs);
  }
}

我们拦截了所有的请求路径,放开了 api、wechat 等请求路径

这里可能会有一个疑问,为什么不放开请求登录界面的 api 请求路径呢,原因是我们拦截登录请求,当我们请求登录界面时,我们已经登录过,那么我们就无需进入登录界面,直接到主界面

我们使用了自定义的一个登录拦截:LoginInterceptor,在第二步我们会详细讲解其中的实现原理

2、登录拦截

/**
* 未登录拦截器
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {

  @Autowired
  private LoginDao dao;

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 获得cookie
    Cookie[] cookies = request.getCookies();
    // 没有cookie信息,则重定向到登录界面
    if (null == cookies) {
      response.sendRedirect(request.getContextPath() + "/login");
      return false;
    }
    // 定义cookie_username,用户的一些登录信息,例如:用户名,密码等
    String cookie_username = null;
    // 获取cookie里面的一些用户信息
    for (Cookie item : cookies) {
      if ("cookie_username".equals(item.getName())) {
        cookie_username = item.getValue();
        break;
      }
    }
    // 如果cookie里面没有包含用户的一些登录信息,则重定向到登录界面
    if (StringUtils.isEmpty(cookie_username)) {
      response.sendRedirect(request.getContextPath() + "/login");
      return false;
    }
    // 获取HttpSession对象
    HttpSession session = request.getSession();
    // 获取我们登录后存在session中的用户信息,如果为空,表示session已经过期
    Object obj = session.getAttribute(Const.SYSTEM_USER_SESSION);
    if (null == obj) {
			// 根据用户登录账号获取数据库中的用户信息
    	UserInfo dbUser = dao.getUserInfoByAccount(cookie_username);
      // 将用户保存到session中
      session.setAttribute(Const.SYSTEM_USER_SESSION, dbUser);
    }
    // 已经登录
    return true;
  }
}

3、登录请求

控制层

/**
 * 执行登录
 */
 @PostMapping("login")
 @ResponseBody
 public String login(String username, String password, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
   return service.doLogin(username.trim(), password.trim(), session, request, response).toJSONString();
 }

业务层

/**
 * 执行登录
 */
public JSONObject doLogin(String username, String password, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
	// 最终返回的对象
  JSONObject res = new JSONObject();
  res.put("code", 0);
  if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
    res.put("msg", "请输入手机号或密码");
    return res;
  }
  UserInfo dbUser = dao.getUserInfoByAccount(username);
  if (null == dbUser) {
    res.put("msg", "该账号不存在,请检查后重试");
    return res;
  }
  // 验证密码是否正确
  String newPassword = PasswordUtils.getMd5(password, username, dbUser.getSalt());
  if (!newPassword.equals(dbUser.getPassword())) {
    res.put("msg", "手机号或密码错误,请检查后重试");
    return res;
  }
  // 判断账户状态
  if (1 != dbUser.getStatus()) {
    res.put("msg", "该账号已被冻结,请联系管理员");
    return res;
  }
  // 将登录用户信息保存到session中
  session.setAttribute(Const.SYSTEM_USER_SESSION, dbUser);
  // 保存cookie,实现自动登录
  Cookie cookie_username = new Cookie("cookie_username", username);
  // 设置cookie的持久化时间,30天
  cookie_username.setMaxAge(30 * 24 * 60 * 60);
  // 设置为当前项目下都携带这个cookie
  cookie_username.setPath(request.getContextPath());
  // 向客户端发送cookie
  response.addCookie(cookie_username);
  res.put("code", 1);
  res.put("msg", "登录成功");
  return res;
}

4、注销登录

/**
 * 退出登录
 */
@RequestMapping(value = "logout")
public String logout(HttpSession session, HttpServletRequest request, HttpServletResponse response) {
  // 删除session里面的用户信息
  session.removeAttribute(Const.SYSTEM_USER_SESSION);
  // 保存cookie,实现自动登录
  Cookie cookie_username = new Cookie("cookie_username", "");
  // 设置cookie的持久化时间,0
  cookie_username.setMaxAge(0);
  // 设置为当前项目下都携带这个cookie
  cookie_username.setPath(request.getContextPath());
  // 向客户端发送cookie
  response.addCookie(cookie_username);
  return "login";
}

注销登录时,我们需要删除 session 里面的用户信息,删除 cookie 里面的用户信息,然后请求到登录界面

四、总结

以上就是 SpringBoot 中使用 Cookie 实现记住登录功能,在项目中还算是比较实用的功能,希望能对正在阅读的你一点点帮助和启发,更多相关SpringBoot Cookie记住登录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决前后端分离 vue+springboot 跨域 session+cookie失效问题

    环境: 前端 vue ip地址:192.168.1.205 后端 springboot2.0 ip地址:192.168.1.217 主要开发后端. 问题: 首先登陆成功时将用户存在session中,后续请求在将用户从session中取出检查.后续请求取出的用户都为null. 解决过程: 首先发现sessionID不一致,导致每一次都是新的会话,当然不可能存在用户了.然后发现cookie浏览器不能自动保存,服务器响应set-cookie了 搜索问题,发现跨域,服务器响应的setCookie浏览器无

  • 在Spring Boot中如何使用Cookies详析

    一. 导读 本文大纲 读取HTTP Cookie 设置HTTP Cookie 读取所有Cookie[] 为Cookie设置过期时间 Https与Cookie HttpOnly Cookie 删除Cookie HTTP Cookie(也称为Web cookie,浏览器cookie)是服务器在用户浏览器中存储的小部分数据.服务器端应用程序在返回浏览器请求响应的时候设置cookie,浏览器存储cookie,并将它们在下一个请求一起发送的时候自动带回服务器端应用程序. Cookies提供了一种在服务器和

  • springboot封装JsonUtil,CookieUtil工具类代码实例

    这篇文章主要介绍了springboot封装JsonUtil,CookieUtil工具类过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JsonUtil public class JsonUtil { private static ObjectMapper objectMapper = new ObjectMapper(); public static String objectToString(Object object) throws

  • SpringBoot中使用Cookie实现记住登录的示例代码

    最近在做项目,甲方提出每次登录都要输入密码,会很麻烦,要求实现一个记住登录状态的功能,于是便使用 Cookie 实现该功能 一.Cookie 简介 Cookie,一种储存在用户本地终端上的数据,有时也用其复数形式 Cookies.类型为"小型文本文件",是某些网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息. 其实 Cookie 就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器.然后客户端

  • SpringBoot中整合Shiro实现权限管理的示例代码

    之前在 SSM 项目中使用过 shiro,发现 shiro 的权限管理做的真不错,但是在 SSM 项目中的配置太繁杂了,于是这次在 SpringBoot 中使用了 shiro,下面一起看看吧 一.简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序. 三个核心组件: 1.Subject 即"当前操作用户".但是,在 Shi

  • 利用Selenium添加cookie实现自动登录的示例代码(fofa)

    介绍 Selenium可以模拟浏览器进行自动化操作,但一些网站需要进行登录才能进行一些操作,比起输入账号密码,cookie是更加方便的.而且fofa首先登录邮箱账号时获得的cookie并不是fofa的cookie,因此我们直接选择利用fofa的cookie进行自动登录.但是selenium需要先打开一个网站才会加载进去cookies,因此我们需要将cookies写在代码中,加载进去 扩展 get_cookies(): 获得所有cookie信息. get_cookie(name): 返回字典的ke

  • Python3+selenium实现cookie免密登录的示例代码

    进过两天的研究终于实现了cookie的免密登录,其实就是session.特别开心,因为在Python爬虫群里问那些大佬,可是他们的回答令我寒心,自己琢磨!!! 靠谁比如靠自己,为此我总结下经验,以免入门的小白再次踩这样的吭.其实网上很多博客写的都比较不详细甚 首先问题自己思考,不懂得去群里问问,然后最重要的要理解事物的本质,只有理解后才能运用它:最后在百度一下把所有相关的博客都点开,一条一条的看一遍总结下规律,比较喽的就舍弃,这样基本上都能得到启发作用.比如selenium的本质就是操作浏览器的

  • springboot简单实现单点登录的示例代码

    什么是单点登录就不用再说了,今天通过自定义sessionId来实现它,想了解的可以参考https://www.xuxueli.com/xxl-sso/ 讲一下大概的实现思路吧:这里有一个认证中心,两个单独的服务.每个服务去请求的 时候都要经过一个过滤器,首先判断该请求地址中有没有sessionid,有的话则写入cookie ,如果请求地址中没有sessionid那么从cookie中去获取,如果cookie中获取到了则证明登录了,放行即可.否则跳转到认证中心,此时把请求地址当做参数带到认证中,认证

  • SpringBoot实现token登录的示例代码

    为什么引入token机制? 在进行登录验证时,我们需要session或cookie会话进行验证,客户端包括浏览器.app.微信小程序.公众号,只有浏览器有session和cookie机制,当我们脱离浏览器用app等向服务端发请求就没有session和cookie机制,这时我们就需要使用token令牌进行登录验证. 代码实现 先建个util包,并创建TokenUtil类用于生成token TokenUtil类代码 package com.qcby.util; import com.qcby.ent

  • 使用cookie绕过验证码登录的实现代码

    本文给大家介绍通过Cookie跳转过验证码,今天,就详细的介绍一下cookie绕过验证码登录的实现代码. #coding:utf-8 ''' cookie绕过验证码登录,第一步先访问登录页面获取登录前的cookie,第二步 用fiddler抓到的手动登录的cookie加入cookie中,登录成功,第三步登录成功 后,添加新随笔保存为草稿 ''' import requests,re requests.packages.urllib3.disable_warnings() #打开登录 url =

  • springboot集成CAS实现单点登录的示例代码

    最近新参与的项目用到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了一个spring-boot 集成CAS 的demo.实现了单点登录与登出. 单点登录英文全称是:Single Sign On,简称SSO. 含义:在多个相互信任的系统中,只要登录一个系统其他系统均可访问. CAS 是一种使用广泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中心,由CAS提供,我们需要稍作修改,启动起来就可以用.~~~~ 效果演示 ht

  • SpringBoot实现扫码登录的示例代码

    目录 一.首先咱们需要一张表 二.角色都有哪些 三.接口都需要哪些? 四.步骤 五.疯狂贴代码 SpringBoot中操作WebSocket 最近有个项目涉及到websocket实现扫码登录,看到一篇不错的技术文,分享一下. 一.首先咱们需要一张表 这表是干啥的呢?就是记录一下谁扫码了.谁登录了. User_Token表 字段如下: uuid : 用于确保唯一性 userId :谁登录的 loginTime :登录时间 createTime :创建时间 用于判断是否过期 state:是否二维码失

  • SpringBoot整合Keycloak实现单点登录的示例代码

    目录 1. 搭建Keycloak服务器 2. 配置权限 2.1. 登陆 2.2. 创建Realm 2.3. 创建用户 2.4. 创建客户端 2.5. 创建角色 2.6. 配置用户角色关系 2.7. 配置客户端和角色关系 3. 整合SpringBoot 3.1. 引入核心依赖 3.2. 编写Controller 3.3. 编写application.yml 4. 验证 Keycloak是一个开源的身份和权限访问管理工具,轻松为应用程序和安全服务添加身份验证,无需处理储存用户或者验证用户,其提供用户

随机推荐