代码参考博客:

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. zabbix 中 宏 的介绍

    宏的作用是便于在模板.items.trigger中的引用.宏的名称为 {$名称},宏的字符范围为 A~Z.0~9._ . 例如: 在key中的宏: net.tcp.service[ssh,{$SSH_ ...

  2. 配置maven环境变量并安装jar包到本地仓库

    1.下载maven安装包,解压,解压目录如下: 2.配置M2_HOME变量为上一步的路径: 3.配置PATH变量,添加%M2_HOME%\bin;  查看是否配置成功 mvn -v : 4.安装jar ...

  3. Quicklz压缩算法

    以前对压缩算法一无所知,只是知道哈弗曼编码能做这种事情,但是感觉这样的方法奇慢无比.昨天下午看了下号称世界上最快的压缩算法Quicklz,对压缩的基本思路有了一定的了解.一般的压缩程序的要求读入文件之 ...

  4. Mysql源码学习——Thread Manager

    一.前言 上篇的Connection Manager中,曾提及对于一个新到来的Connection,服务器会创建一个新的线程来处理这个连接. 其实没那么简单,为了提高系统效率,减少频繁创建线程和中止线 ...

  5. JavaScript-Tool:jquery.zsign(电子签章)-un

    ylbtech-JavaScript-Tool:jquery.zsign(电子签章) 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作 ...

  6. Python_列表,元组和字典的异同

    1,列表:list 可变的数据类型,可以被改变,可以进行嵌套处理,可在一个列表中存储一个序列的项目 指明一个列表的方法是:使用方括号 代码示例: >>> fruit_list = [ ...

  7. many-to-one 配置问题

    需要引入org.hibernate.annotations.NotFound,当预期的被关联的元素不在数据库(关乎关联列的错误id)时,致使Hibernate无法解决关联性问题时,Hibernate就 ...

  8. c++中编译链接总结

    1 编译链接过程分为 预处理--->编译---->汇编---->链接.如下图所示 2 预处理都做了什么 (1)将所有的#define删除并展开所有的宏 (2)处理所有的条件预编译指令 ...

  9. 【Linux学习】Vi / Vim编辑器—编辑器工作模式、vi编辑操作

    Vi / Vim编辑器-编辑器工作模式.vi编辑操作 推荐一个很好的学习指南:http://www.oschina.net/translate/learn-vim-progressively 一.编辑 ...

  10. humans.txt学习理解

    可以通过以下链接访问到Google的humans.txt https://www.google.com/humans.txt 百度上有关于humans.txt的介绍 http://baike.baid ...