记录一下在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? 一张图看明白: 解读: ...
随机推荐
- 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2
from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...
- win10环境变量path误删(windows找不到文件‘%windir%\systempropertiesadvanced.exe’)的解决办法
具体步骤如下:1. 首先重新启动电脑,点击开始按钮,选择电源,此时按住键盘上的shift键,再点击“重启”,选择疑难解答->再选择高级选项->再选择启动设置->然后点击重启-> ...
- vuex 命名空间
默认情况下,模块内部的action mutation getter是注册在全局命名空间的,如果希望你的模块具有更高的封装度和复用性,你可以通过添加namespaced:true的方式使其成为带命名空间 ...
- web数据存储
数据的存储必然是任何网站必须经历的事,我们可以将数据存放在不同地方,数据库.文件.内存.程序本身.cookie,session中都可以,但是只要需要持久化保留的数据,那么最终肯定还是落在磁盘之上的,我 ...
- PHP参数类型
class User{ public $name; public $password; function __construct($name,$password){ ...
- CF-798A
A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 3.1 HiveServer2.Beeline JDBC使用
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients 一.HiveServer2.Beeline 1.HiveSer ...
- ElasticSearch入门及核心概念介绍
Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识和原理以初学者的角度记录下来,如有不当,烦请指正! 0. 带着问题上路——ES是如何产生的? (1)思考:大 ...
- ASP.NET Core会议管理平台实战_汇总贴
ASP.NET Core会议管理平台实战 课程地址:https://ke.qq.com/course/389673?from=800004097#term_id=100464670 ASP.NET C ...
- Win7 server2008 共享文件夹 不输入网络密码
如何设置共享文件夹访问不需要输入用户名和密码: 1.“开始”——“运行”——secpol.msc (1)使用空白密码的本地帐户只允许进行控制台登录 禁用它 (2)“本地策略”——“安全选项”——“网络 ...