基于session实现登录

发送短信验证码:

public Result sendCode(String phone, HttpSession session) {
// 1.校验手机号
if (RegexUtils.isPhoneInvalid(phone)) {
// 2.不合法返回错误
returnt.fail("手机号格式错误");
}
// 3.合法,生成验证码
String code = RandomUtil.randomNumbers(6);
// 4.保存到session
session.setAttribute(phone, code);
// 5.发送验证码
log.info("手机验证码:{}", code);
return Result.ok(code);
}

短信验证码登录、注册:

public Result login(LoginFormDTO loginForm, HttpSession session) {
String code = loginForm.getCode();
String phone = loginForm.getPhone();
// 1.校验手机号
if(RegexUtils.isPhoneInvalid(phone)){
return Result.fail("手机号格式错误");
}
// 2.校验验证码
Object cacheCode = session.getAttribute(phone);
if(cacheCode == null || !cacheCode.toString().equals(code)){
// 3.不合法,返回错误信息
return Result.fail("验证码错误");
}
// 4.合法,根据手机号查询用户
User user = query().eq("phone", phone).one();
// 5.用户存在,跳过
// 6.用户不存在
if(user == null){
// 6.1 注册
user = createUserWithPhone(phone);
}
// 7 保存到session中
session.setAttribute("user", user);
return Result.ok();
}

校验登录状态

校验登录是放在拦截器中的,这样每个业务不用单独再实习校验登录,但是这样会出现线程安全问题,可以用TreadLocal(线程级,tomcat中每个请求都会有一个独立线程)。

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1.获取session
HttpSession session = request.getSession();
// 2.获取session中的user
Object user = session.getAttribute("user");
// 3.判断user是否存在
if(user == null){
// 4.不存在,拦截 未授权
response.setStatus(401);
return false;
}
// 5.存在,保存用户信息到ThreadLocal中
UserHolder.saveUser((User) user);
// 6.放行
return true;
} public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 移除用户
UserHolder.removeUser();
}
public class UserHolder {
private static final ThreadLocal<User> tl = new ThreadLocal<>(); public static void saveUser(User user){
tl.set(user);
} public static User getUser(){
return tl.get();
} public static void removeUser(){
tl.remove();
}
}
@Configuration
public class MvcConfig implements WebMvcConfigurer { @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.excludePathPatterns(
"/user/code",
"/user/login",
"/blog/hot",
"/shop/**",
"/shop-type/**",
"/upload/**",
"/voucher/**"
);
}
}

session与Cookie

Cookie

因为session是基于Cookie的,故先聊聊cookie。

Cookie是由Web服务器发送到用户浏览器并存储在用户计算机的小型数据文件,用来在用户访问网站时存储和发送有关用户信息,帮助网站记住用户的状态和偏好。

session简介

session(域对象),用于一次会话期间保存共享数据的对象。

session是基于Cookie的,用户第一次使用session时(访问页面),服务器会为为用户创建一个session域对象,使用jsessionid和session对象关联,以后请求体都会增加:jessionid=xxxx

session管理

  • Cookie:服务器通过设置一个带有jsessionid的cookie发送给客户端。之后的每次请求,浏览器自动附带该cookie,便于服务器识别对应的会话。
  • URL重写:某些情况下,cookie无法使用(被禁用等),jsessionid附加到URL中,格式为URL;jsessionid=xxxx
  • JWT令牌, 一种用于安全传输信息的紧凑的URL安全的令牌格式(头部,负载,签名)。

session的作用

  • Session是为了解决HTTP无状态性问题。
  • session解决Cookie的局限:Cookie过多时,增加了客户端与服务端的数据传输量,而且浏览器对Cookie是有数量限制的,所以我们不能在Cookie中保存过多的信息。
  • session的作用就是在服务器端保存一些用户数据,然后传递给用户一个名为jsessionid的Cookie,一个jsessionid对应一个session对象,通过jsessionid就可以获取到用户的信息
  • 常用于用户身份认证、个性化设置、购物车功能等。

session的安全性

为了保障Session的安全性,防止会话劫持(如Session Fixation攻击),通常会采取以下措施:

  • session ID的随机性和不可预测性: 确保Session ID的生成是随机的,且不可预测。
  • HTTPS: 使用HTTPS加密传输数据,防止session ID在传输过程中被窃取。
  • session固定攻击的防护: 在用户登录后重新生成session ID。
  • session过期时间: 设置合理的session过期时间,防止长期未操作的session被利用。

session实现登录以及session与Cookie的关系的更多相关文章

  1. 登录页面判断session退出登录清空session

    1 2 3 4 5 6 if(empty($_POST)){      $_SESSION = array();     if(isset($_COOKIE[session_name()])){    ...

  2. 使用COOKIE实现登录 VS 使用SESSION实现登录

    注:本文使用的代码基于PHP,其他语言逻辑同理. 一:使用COOKIE实现登录验证 使用cookie实现登录的方式,主要通过一些单向的加密信息进行验证.比如admin用户登录了之后,服务端生成一个co ...

  3. 模拟淘宝登录和购物车功能:使用cookie记录登录名,下次登录时能够记得上次的登录名,使用cookie模拟购物车功能,使用session记住登录信息并验证是否登录,防止利用url打开网站,并实现退出登录功能

    Login <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  4. 创建Cookie,简单模拟登录,记录登录名,购物车记录先前添加内容,session控制登录

     工作任务:模拟淘宝登录和购物车功能:使用cookie记录登录名,下次登录时能够记得上次的登录名,使用cookie模拟购物车功能,使用session记住登录信息并验证是否登录,防止利用url打开网站, ...

  5. 一个简单的PHP登录演示(SESSION版 与 COOKIE版)

    //==============COOKIE版本的简单登录================ if ($_GET[out]){ setcookie('id',''); setcookie('pw','' ...

  6. 基于cookie和session的登录验证

    settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions ...

  7. web登录的session、cookie和token

    为什么会有登录这回事 首先这是因为HTTP是无状态的协议,所谓无状态就是在两次请求之间服务器并不会保存任何的数据,相当于你和一个人说一句话之后他就把你忘掉了.所以,登录就是用某种方法让服务器在多次请求 ...

  8. java:Cookie(常用操作),Cookie和Session免登录实例

     1.常用操作: package cn.zzsxt.lee.web.cookie; import java.io.IOException; import javax.servlet.ServletEx ...

  9. Django(十三)状态保持 —— cookie与session+ajax异步请求+session记住登录状态+cookie记住登录名密码

    一.状态保持的概述 http协议是无状态的.下一次去访问一个页面时并不知道上一次对这个页面做了什么.因此引入了cookie.session两种方式来配合解决此问题. Duplicate entry:重 ...

  10. cookie和session实现登录验证

    回话技术,比如在做登录功能的时候,需要配合是用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能.在cookie中保存了用户的信息,特别是一个特殊的令牌信息,当用户拿着这个 ...

随机推荐

  1. linux 基础(1)快速查询指令的用法

    --help 几乎所有的指令,都可以使用--help选项进行查询.给命令使用--help选项,就会直接出现一段说明命令的文字. > date --help 用法:date [选项]... [+格 ...

  2. 2021年华为Java面试真题解析,帮你解决95%以上的问题!

    前言 由于作者面试过程中高度紧张,本文中只列出了自己还记得的部分题目. 经历了漫长一个月的等待,终于在前几天通过面试官获悉已被蚂蚁金服录取,这期间的焦虑.痛苦自不必说,知道被录取的那一刻,一整年的阴霾 ...

  3. Elasticsearch倒排索引结构【转载】

    一切设计都是为了提高搜索的性能 倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引.通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key. 先来回 ...

  4. SQL Server 安装图解

    此安装步骤适用于首次安装 一.SQL Server 安装 1.双击SQL Server 光盘映像文件,会出现如图所示界面 选择如下图所示的选项 2.输入产品密钥(这里演示密钥进行) 3.配置更新项,检 ...

  5. Verilog代码规范

    历史修改信息 版本 更改描述 更改人 批准人 修订日期/生效日期 A01 发布首版 ldy 一.目的 作为我司verilog开发过程中的输入文件,用于统一FPGA开发人员的代码风格.从而在满足功能和性 ...

  6. 2024ICPC 武汉邀请赛题解 更新至 8 题

    目录 Preface Problem I. 循环苹果串 Problem K. 派对游戏 Problem B. 无数的我 Problem F. 订制服装 Problem E. 回旋镖 Problem D ...

  7. canvas绘制--圆角多边形

    context.arcTo() arcTo() 方法在画布上创建介于两个切线之间的弧/曲线. JavaScript 语法: context.arcTo(x1,y1,x2,y2,r); 参数描述 参数 ...

  8. 理解Flink之四State

    在Flink的官网写着:Stateful Computations over Data Streams. 基于状态计算的数据流. 在流式计算中,希望做一些聚合分析等.那么就需要保存当前日志的状态,以备 ...

  9. 从Delphi到Lazarus——我的编程之路

    今天终于下定决心,把我使用的编程环境从Delphi转变成Lazarus了.这也许是一个明智的选择,但做出这个决定的过程包含了辛酸和无奈. 这应该是我第三次安装Lazarus了.以前安装之后总是感觉有很 ...

  10. 切换Docker本地目录

    背景: df -h,发现docker默认的路径在/var/lib下,而且容量即将满掉. 对于欧拉系统来说,目录在/home,需要把docker目前的目录切换到/home下. 解决方法: 1. Dock ...