记录一下在SpringBoot中实现简单的登录认证
代码参考博客:
https://blog.csdn.net/weixin_37891479/article/details/79527641
在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有可能跳过登录直接访问系统的界面和使用里面的功能,于是想为系统加个安全验证。现在常用的安全框架我知道的就是Shiro还有SpringSecurity,但这次我不打算用框架,采用拦截器filter和session技术实现了一个基于session的登录认证。
先简单地说一下原理:
session和cookie介绍:
首先要知道,session是什么。 我们知道HTTP是个无状态的协议,在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
而cookie,就是把用户的数据写在浏览器,session是放在服务器的内存中的。 session和cookie都是为了跟踪与用户的会话而诞生的技术
然后cookie和session的简单区别:
- Cookie是把用户的数据写给用户的浏览器。
- Session技术把用户的数据写到用户独占的session中。
- Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
session的实现原理:
- 服务器是如何实现一个session为一个用户的浏览器服务的呢???(千万要搞清楚,服务器是对每个用户的浏览器都创建一个session对象,也就是说每个浏览器用户都有一块内存来存他们的信息!!!)
- 在一个用户向服务器发出请求后,服务器会看这个浏览器所夹带的cookie有没有sessionId这一项,如果没有,则说明这个用户是第一次访问这个服务器,然后服务器为这个浏览器用户创建一个session和一个独一无二的sessionid,并把这个id以cookie的形式写回给客户机。
- 后面客户端访问服务器,都会带着这个sessionid去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。
- 额如果浏览器也就是客户端禁止使用cookie怎么办,有两个技术:url重写 和 隐藏表单域 其实思路都是 想办法把这个sessionid传给服务器,让服务器找到正确的session和这个浏览器客户机对应。
实现思路:
登录成功的时候,在该浏览器用户所对应的session中,新建一个key为“hasLoginedUsersMap”,值为一个Map<String, Object> hasLoginedUsersMap的键值对,顾名思义,就是一个记录了该客户端所登陆过的用户信息的Map。(为什么不直接记录一个"user",User的键值对,因为考虑到一个浏览器可能用多个用户去登录……)然后这个Map里面,每一个键值对就是("userId",User),也就是键为用户id,然后值为这个User对象。 所以登录成功后,就先看session里面有没有这个Map,若没有则建立一个并在这个Map里面添加这个userid和这个user;如果有这个Map就在这个Map中添加这个用户的userId和User信息。
每个用户请求过来,先被Filter拦截下来,经过Filter处理后才到SpringMVC的servlet。在Filter中,看这个浏览器用户的session,看有没hasLoginedUsersMap这个Map,如果有,就说明该用户登录过了,可以继续访问,如果没有这个Map,就重定向到别的界面,就不让他访问原来的资源。(我的主页的请求中带有用户的userId,如果是主页请求,就会去Map中看有没有这个UserId的信息,如果有就登录过,没有的话就不让他访问。)
下面贴下代码,登录和注销还有filter中的拦截代码就不上了,主要看看Filter的注册:
查到在Springboot中一般有两种注册这个FIlter的方法:
1.注解注册法:
在过滤器上添加WebFilter注解
在启动类添加ServletComponentScan注解:
@WebFilter(filterName = "sessionFilter",urlPatterns = {"/*"})
public class SessionFilter implements Filter {
@SpringBootApplication
@ServletComponentScan
public class FileUploadApplication { public static void main(String[] args) {
SpringApplication.run(FileUploadApplication.class, args);
} }
2.javaConfig注册:
package com.stuPayment.config; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.stuPayment.util.LoginFilter; @Configuration
public class FilterConfig { @Bean
public FilterRegistrationBean loginSessionFilter() {//这个类应该是Spring给我们拿来初测filter的 FilterRegistrationBean registration = new FilterRegistrationBean();//新建过滤器的注册类 registration.setFilter(new LoginFilter());//添加我们写好的filter registration.addUrlPatterns("/*");//设置filter的过滤的url模式 return registration;//返回这个就是Spring会帮你注入的那个对象 } }
这里提一下:
当有多个过滤器需要按顺序执行时怎么办?
使用注解的配置方法不能配置顺序,但是可以通过过滤器名字的字典顺序实现顺序过滤(比如AFilter就会在BFilter前执行),显然这种方法看起来不怎么正经。
但是我们可以使用第二种配置方法.
通过给注册类设置order,order越小,执行优先级越高
@Bean
public FilterRegistrationBean someFilterRegistration1() {
//新建过滤器注册类
FilterRegistrationBean registration = new FilterRegistrationBean();
// 添加我们写好的过滤器
registration.setFilter( new SessionFilter());
// 设置过滤器的URL模式
registration.addUrlPatterns("/*");
//设置过滤器顺序
registration.setOrder(1);
return registration;
}
记录一下在SpringBoot中实现简单的登录认证的更多相关文章
- 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式
1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
- Java结合SpringBoot拦截器实现简单的登录认证模块
Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...
- 基于SpringBoot搭建应用开发框架(二) —— 登录认证
零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...
- springboot,vue,shiro整合 关于登录认证功能
首先是session问题 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用 ...
- .net core3.1中实现简单的jwt认证
1.创建项目 使用visual studio创建一个名为JwtDemo的空项目,创建后如图 2.添加依赖项 在nuget包管理器中搜索 Microsoft.AspNetCore.Authenticat ...
- springboot中使用spring-session实现共享会话到redis(二)
上篇文章介绍了springboot中集成spring-session实现了将session分布式存到redis中.这篇在深入介绍一些spring-session的细节. 1.session超时: 在t ...
- Spring Cloud之路:(七)SpringBoot+Shiro实现登录认证和权限管理
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sage_wang/article/details/79592269一.Shiro介绍1.Shiro是 ...
- SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...
- 7 — 简单了解springboot中的thymeleaf
1.官网学习地址 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 2.什么是thymeleaf? 一张图看明白: 解读: ...
随机推荐
- python多进程执行任务
https://blog.csdn.net/qq_39694935/article/details/84552076 [Python]multiprocessing Pool 进程间通信共享 直接上代 ...
- python 快速排序 qsort
def qsort(arr, start, end): if start > end: return def partition(arr, start, end): pivot = arr[st ...
- Windows下Tesseract4.0识别与中文手写字体训练
一 . tesseract 4.0 安装及使用 1. tesseract 4.0 安装 安装包下载地址: http://digi.bib.uni-mannheim.de/tesseract/tesse ...
- 使用diskpart命令修复U盘分区
前段时间在论坛上讨论封装PE到u盘里热闹的,就想自己也封装一个,随便下载了一个WIN7的PE封装后发现还不错,本来就是做测试用的,测试完了就想把u盘在恢复成以前的样子,可是发现恢复并不是这么容易 如下 ...
- zookeeper入门到精通
- 【servlet学习1】使用eclipse+tomcat开发servlet示例
零.开发环境 1.eclipse+tomcat(tomcat插件已安装到eclipse中). 一.开发servlet步骤 1.在eclipse中新建工程 File —> New —> Ot ...
- bzoj 3527 [Zjoi2014] 力 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 看了看TJ才推出来式子,还是不够熟练啊: TJ:https://blog.csdn.n ...
- unittest执行测试用例的N种姿势总结
1.我们写几个方法,用来做测试用例 2.我们在另一文件中引用这个模块下面的所有类方法,先看第一种方法: 运行结果: 缺点:每个用例都需要加载到测试套件中,如果有1000个用例,要写1000次重复的代码 ...
- python逼格提升
1.合并可以匹配的条件 s1 = 7 if s1 > 5 and s1 < 10: print(s1) s1 = 7 if 5 < s1 < 10: print(s1) 2.i ...
- MVC错误:查询的结果不能枚举多次
应用程序中的服务器错误. 查询的结果不能枚举多次. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: S ...