代码参考博客:

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的实现原理:

  1. 服务器是如何实现一个session为一个用户的浏览器服务的呢???(千万要搞清楚,服务器是对每个用户的浏览器都创建一个session对象,也就是说每个浏览器用户都有一块内存来存他们的信息!!!)
  2. 在一个用户向服务器发出请求后,服务器会看这个浏览器所夹带的cookie有没有sessionId这一项,如果没有,则说明这个用户是第一次访问这个服务器,然后服务器为这个浏览器用户创建一个session和一个独一无二的sessionid,并把这个id以cookie的形式写回给客户机。
  3. 后面客户端访问服务器,都会带着这个sessionid去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。
  4. 额如果浏览器也就是客户端禁止使用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中实现简单的登录认证的更多相关文章

  1. 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式

    1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...

  2. Java结合SpringBoot拦截器实现简单的登录认证模块

    Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...

  3. 基于SpringBoot搭建应用开发框架(二) —— 登录认证

    零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...

  4. springboot,vue,shiro整合 关于登录认证功能

    首先是session问题 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用 ...

  5. .net core3.1中实现简单的jwt认证

    1.创建项目 使用visual studio创建一个名为JwtDemo的空项目,创建后如图 2.添加依赖项 在nuget包管理器中搜索 Microsoft.AspNetCore.Authenticat ...

  6. springboot中使用spring-session实现共享会话到redis(二)

    上篇文章介绍了springboot中集成spring-session实现了将session分布式存到redis中.这篇在深入介绍一些spring-session的细节. 1.session超时: 在t ...

  7. Spring Cloud之路:(七)SpringBoot+Shiro实现登录认证和权限管理

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sage_wang/article/details/79592269一.Shiro介绍1.Shiro是 ...

  8. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

  9. 7 — 简单了解springboot中的thymeleaf

    1.官网学习地址 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 2.什么是thymeleaf? 一张图看明白: 解读: ...

随机推荐

  1. 机器学习 : 高斯混合模型及EM算法

    Mixtures of Gaussian 这一讲,我们讨论利用EM (Expectation-Maximization)做概率密度的估计.假设我们有一组训练样本x(1),x(2),...x(m),因为 ...

  2. 非旋treap套线段树

    BZOJ3065. 去年用pascal 块链过了.. 今年来试了试非旋treap大法   注定被块链完爆 代码留这. 第一份 :辣鸡的  垃圾回收做法  跑得极慢 #include <bits/ ...

  3. http 和 ajax 的关系

    经常听到有人混淆两者之间的基本概念,认为只是毫无关系的两种东西. 其实ajax也属于http请求,只不过是http一共有两种请求,一种是同步,一种是异步当然也可以同步那就是ajax. 总所周知hhtp ...

  4. 洛谷 1079 Vigenère 密码——模拟水题

    题目:https://www.luogu.org/problemnew/show/P1079 大水题. #include<iostream> #include<cstdio> ...

  5. POJ1163(基础线性DP)

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42547   Accepted: 25721 De ...

  6. javascript闭包和闭包的几种写法和用法

    什么是闭包 闭包,官方的解释是:一个拥有需要许多变量和绑定了这=这些变量的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1 作为一个函数变量的引用,当函数返回时,其处于激活 ...

  7. 红帽系统制作yum本地源

    1 首先得吐槽吐槽,机房冷就算了,不能用手机(哈哈你懂的),没有站的位置,显示屏看不清楚.就这样开始制作yum本地源. 2 记下注意得两点,以防以后会忘记 a:可能是因为红帽系统,加上是实用光盘挂载的 ...

  8. 3-2带命令行参数的Java

    命令行参数: 主方法Main 小括号里面的内容就是命令参数: String[] args class ArgsDemo{ public static void main(String[] args){ ...

  9. Laravel中的路由管理

    //路由中输出视图Route::get('/', function () { return view('welcome');}); //get路由请求Route::get('get',function ...

  10. 妙味课堂史上最全的javascript视频教程,前端开发人员必备知识点,新手易学,拔高必备!!!

    妙味课堂是北京妙味趣学信息技术有限公司旗下的IT前端培训品牌, 妙味课堂是一支独具特色的IT培训团队,妙味反对传统IT教育枯燥乏味的教学模式,妙味提供一种全新的快乐学习方法! 妙味js视教第一部分  ...