Java中基于Session登录验证

1. 基于Session的登录验证

基于Session的登录验证方式是最简单的一种登录校验方式。

为啥能用Session作为登录验证的一种方式,因为每个用户的请求都会有一个Session,这个对象是Servlet给我们创建的,不需要我们手动创建,并且这个对象的作用域为整个Web页面,也就是在整个项目中,这个Session可以存储一些内容,相当于全局缓存,并且这个Session有默认的过期时间,默认为30分钟,使得保存到Session对象中的值,可以在各个Web页面中共享。因此,我们可以利用这个特性保存用户的登录信息。我们可以编写一个拦截器,在拦截器中通过request对象获取Session对象,然后根据Key值获取到Value值,类似于Map集合,获取到值后和数据库进行比对,如果用户名和密码一致就放行,否则拦截。

下面是具体的代码:通过请求登录接口校验输入的用户名和密码是否正确,如果正确就把这个用户信息保存到Session对象中。

package com.ukefu.characterglm.controller;import cn.hutool.crypto.SecureUtil;
import com.ukefu.characterglm.entity.User;
import com.ukefu.characterglm.service.UserService;
import com.ukefu.characterglm.utils.BaseResponse;
import com.ukefu.characterglm.utils.ErrorCode;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** @author Luke Ewin* @date 2024/2/4 14:07* @blog blog.lukeewin.top*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/login")public BaseResponse login(HttpServletRequest request, @RequestBody User user) {if (user != null && StringUtils.isNotBlank(user.getName()) && StringUtils.isNotBlank(user.getPassword())) {String name = user.getName();String password = user.getPassword();User tempUser = userService.login(name, SecureUtil.md5(password));if (tempUser != null) {Map<String, String> map = new HashMap<>();map.put("id", String.valueOf(tempUser.getId()));map.put("name", tempUser.getName());map.put("email", tempUser.getEmail());map.put("phone", tempUser.getPhone());// 保存用户的登录状态HttpSession session = request.getSession();session.setAttribute("user", tempUser);return BaseResponse.success(map);} else {return BaseResponse.error(ErrorCode.USERNAME_PASSWORD_ERROR);}}return BaseResponse.error(ErrorCode.MISS_PARAMS);}
}

拦截器:

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();Object user = session.getAttribute("user");if (user != null) {return true;}request.getRequestDispatcher("/error/login").forward(request, response);return false;}
}

配置:把自定义的拦截器添加到容器内

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login", "/error/**");}
}

这里需要注意:一定要记得放行/error/**,否则会报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity之XR Interaction Toolkit如何在VR中实现一个可以拖拽的UI

前言 普通的VR项目中,我们常见的UI都是一个3D的UI,放置在场景中的某个位置,方便我们使用射线点击。但是为了更好的体验,我们可能会有跟随头显的UI,或者可拖拽的UI,这样更方便用户去操作。 所以我们今天的需求就是:如何基于XR Interaction Toolkit 插件 在VR中使用手柄射…

zip解压缩

使用unzip库可以轻松解压zip文件&#xff0c;源码下载地址&#xff1a;http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win #include <Windows.h> #include"unzip.h" SetCurrentDirectory("c:\\"); HZIP hz OpenZip(…

AlexNet的出现推动深度学习的巨大发展

尽管AlexNet&#xff08;2012&#xff09;的代码只比LeNet&#xff08;1998&#xff09;多出几行&#xff0c;但学术界花了很多年才接受深度学习这一概念&#xff0c;并应用其出色的实验结果。 AlexNet&#xff08;由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同设计…

OpenAI 发布文生视频Sora大模型,一句话便可生成长达一分钟的视频

前几期的文章&#xff0c;我们介绍了很多文生视频的大模型&#xff0c;包括字节发布的magic video以及stable video diffusion等模型&#xff0c;都可以输入相关的文本生成对应场景的视频。 文生视频大模型必然会成为各个人工智能大厂竞争的核心领地&#xff0c;这不OpenAI刚刚…

代码随想录算法训练营第三十六天|435. 无重叠区间、763. 划分字母区间、56. 合并区间。

435. 无重叠区间 题目链接&#xff1a;无重叠区间 题目描述&#xff1a; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 解题思路&#xff1a; 本题和上一个射气球类似&#x…

什么是接口测试?怎么做接口测试?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种…

红旗linux安装32bit依赖库

红旗linux安装32bit依赖库 红旗linux安装32bit依赖库 lib下载 红旗-7.3-lib-32.tar.gz 解压压缩包&#xff0c;根据如下进行操作 1.回退glibc(1)查看当前glibc版本[root192 ~]# rpm -qa | grep glibcglibc-common-2.17-157.axs7.1.x86_64glibc-headers-2.17-260.axs7.5.x86_…

【手写数据库toadb】表relation访问实现概述,分层设计再实践,表访问层与表操作层简化代码复杂度

301表的访问 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学…

Python Flask高级编程之RESTFul API前后端分离(学习笔记)

Flask-RESTful是一个强大的Python库&#xff0c;用于构建RESTful APIs。它建立在Flask框架之上&#xff0c;提供了一套简单易用的工具&#xff0c;可以帮助你快速地创建API接口。Flask-RESTful遵循REST原则&#xff0c;支持常见的HTTP请求方法&#xff0c;如GET、POST、PUT和DE…

单机环境搭建Redis伪集群

1、Redis版本 [rootwsdhla ~]# redis-server -v Redis server v6.2.6 sha00000000:0 mallocjemalloc-5.1.0 bits64 buildbf23dac15dfc00fa[rootwsdhla ~]# redis-cli -v redis-cli 6.2.62、创建节点目录 创建6个节点目录&#xff0c;分别复制一份redis.conf并编辑&#xff1a…

Codeforces Round 927 (Div. 3)(A,B,C,D,E,F,G)

这场简单些&#xff0c;E题是个推结论的数学题&#xff0c;沾点高精的思想。F是个需要些预处理的DP&#xff0c;G题是用exgcd算边权的堆优化dijkstra。C题有点骗&#xff0c;硬啃很难做。 A Thorns and Coins 题意&#xff1a; 在你的电脑宇宙之旅中&#xff0c;你偶然发现了…

找第K大数

输入N个整数&#xff0c;求第K大的数是哪个&#xff1f; 输入格式 第一行2个正整数&#xff1a;N和K&#xff0c;N范围在[1,100]&#xff0c;K范围在[1,N]。 第二行N个不同的正整数&#xff1a;范围在[1,10000]。 输出格式 一个整数。 输入/输出例子1 输入&#xff1a; 5…

.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2

前言 很多同学都不愿给电脑设动态壁纸&#xff0c;其中有个重要原因就是嫌它占资源过多。今天大姚分享一个.NET开源、免费&#xff08;MIT license&#xff09;的一个小而快并且功能强大的 Windows 动态桌面软件&#xff0c;支持视频和网页动画播放&#xff1a;DreamScene2。 …

主流开发语言和开发环境?

主流开发语言 Java 简介&#xff1a;Java 是一种广泛使用的面向对象的编程语言&#xff0c;由Sun Microsystems公司于1995年发布&#xff0c;后由Oracle公司接手。Java具有“一次编写&#xff0c;到处运行”的特性&#xff0c;它的跨平台能力得益于Java虚拟机&#xff08;JVM&a…

【c++基础】自然数的分解

说明 自然数的拆分问题。给定自然数n,将其拆分成若干自然数的和。输出所有解&#xff0c;每组解中数字按从小到大排列。相同数字的不同排列算一组解。 如&#xff0c;读入整数3&#xff0c;分解方案如下&#xff1a; 111 12 再比如&#xff0c;读入整数7&#xff0c;分解方…

和数集团2024龙腾山海,新春大吉

龙腾山海迎新岁&#xff0c;瑞气盈门天地春。 在这盛世团圆的时代&#xff0c;在这幸福吉祥的时刻&#xff0c;和数集团向辛勤工作的全体员工、所有的合作伙伴、国际友人、领导老师以及一直支持和关心公司发展的社会各界朋友&#xff0c;致以最诚挚的祝福和感谢&#xff01; …

ESP32工程中CMake使用及加入第三方SDK库文件

1、ESP32工程结构 本文中使用的是乐鑫官方推出的ESP-IDF v5.1对ESP32S3设备开发&#xff0c;并非是Arduino、Micro-python等第三方工具开发。在ESP-IDF框架中&#xff0c;乐鑫官方已经将CMake 和 Ninja 编译构建工具集成到了ESP-IDF中。 ESP-IDF 即乐鑫物联网开发框架&#xff…

【Java前端技术栈】Promise

一、Promise 基本介绍 1. 传统的 Ajax 异步调用在需要多个操作的时候&#xff0c;会导致多个回调函数嵌套&#xff0c;导致代码不够直观&#xff0c;就是常说的Callback Hell 2. 为了解决上述的问题&#xff0c;Promise对象应运而生&#xff0c;在 EMCAScript 2015当中已经成…

车道拓扑、目标布局、天气条件全都要!Text2Street:犀利的街景生成神器!

文本到图像生成在扩散模型的出现下取得了显著进展。然而&#xff0c;基于文本生成街景图像仍然是一项困难的任务&#xff0c;主要是因为街景的道路拓扑复杂&#xff0c;交通状况多样&#xff0c;天气情况各异&#xff0c;这使得传统的文本到图像模型难以处理。为了解决这些挑战…

每日一题——LeetCode1460.通过翻转子数组使两个数组相等

方法一 哈希Map 用两个Map集合分别统计target和arr里出现的元素和出现的次数&#xff0c;在比较两个Map集合看是否出现的元素和次数都相同 var canBeEqual function(target, arr) {let map1 new Map();let map2 new Map();for (let item of target) {map1.set(item, (map1…