OAuth2.0 or Spring Session or 单点登录流程

news2024/11/26 15:29:22

1.社交登录

 

 2.微博社交登录 第三方登录 

1.登录微博

2.点击网站接入

 

3.填写完信息,到这里,写入成功回调 和 失败回调 

是重定向,所以可以写本地的地址 

 3.认证 分布式Session spring-session

域名不一样 发的 jSessionId 就不同,根据域名区分服务器的,一个服务器创建一个 cookie存jSessionId

 

 

 

分布式Session原理,使用子域名,的时候放入父域名的 JsessionId 然后将这个ID 的所存的内容放入Redis ,这样实现不同域名共享同一sessionID. 

4.SpringSession

1.导入依赖

老版本需要导入下面两个依赖要不然报错

 <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
    <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </dependency>

2.yml配置  

server:
  port: 20000
  servlet:
    session:
      timeout: 30m #30分钟 SESSION过期时间


#配置数据源
spring:
  session:
    store-type: redis
  application:
    name: gulimall-auth-server  #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.36:8848  #nacos注册中心的地址
  thymeleaf:
    cache: false
  redis:
    host: 192.168.232.209
    port: 6379
    database: 0

3.开启自动配置

@EnableRedisHttpSession//整合 redis 作为 session存储
package com.jmj.gulimall.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

@Controller
public class IndexController {

    @GetMapping("/loginUser")
    @ResponseBody
    public String loginUser(HttpSession httpSession){
        httpSession.setAttribute("loginUser",new User("123","jmj"));
        return "登录成功";
    }

}

package com.jmj.gulimall.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession//整合 redis 作为 session存储
public class Config {
	
	@Bean
	public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
		return new GenericJackson2JsonRedisSerializer();
	}
}

 Controller

package com.jmj.gulimall.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

@Controller
public class IndexController {

    @GetMapping("/loginUser")
    @ResponseBody
    public String loginUser(HttpSession httpSession){
        httpSession.setAttribute("loginUser",new User("123","jmj"));
        return "登录成功";
    }

    @GetMapping("/getSession")
    @ResponseBody
    public User getSession(HttpSession httpSession){
        User loginUser = (User) httpSession.getAttribute("loginUser");
        return loginUser;
    }

}

 4. 2.6.7 springboot 版本之后只用配置配置文件就可以了

5.还存在一点问题 

1.默认发的令牌, session= dsajkdjl 作用域:当前域(子域Session共享问题)

2.使用JSON的序列化方式来序列化对象数据到redis中

package com.jmj.gulimall.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession//整合 redis 作为 session存储
public class Config {

	@Bean
	public RedisSerializer<Object> springSessionDefaultRedisSerializer(ObjectMapper objectMapper) {
		return new GenericJackson2JsonRedisSerializer(objectMapper);//使用不带包名的JSON序列化
	}

	@Bean
	public CookieSerializer cookieSerializer(){
		DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
		cookieSerializer.setCookieMaxAge(60);//单位 : 秒
		cookieSerializer.setDomainName("jmjStudy.com");//设置子域名
		cookieSerializer.setCookieName("JMJSession");//session名字
		return cookieSerializer;
	}



}
package com.jmj.gulimall.controller;

import cn.hutool.core.bean.BeanUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

@Controller
public class IndexController {

    @GetMapping("/loginUser")
    @ResponseBody
    public String loginUser(String name,HttpSession httpSession){
        httpSession.setAttribute("loginUser",new User("123",name));
        return "登录成功";
    }

    @GetMapping("/getSession")
    @ResponseBody
    public User getSession(HttpSession httpSession){
        Object loginUser = httpSession.getAttribute("loginUser");
        User user = BeanUtil.copyProperties(loginUser, User.class);
        return user;
    }

    @GetMapping("/user")
    @ResponseBody
    public com.jmj.gulimall.config.User getserSession(HttpSession httpSession){
        Object loginUser = httpSession.getAttribute("loginUser");
        com.jmj.gulimall.config.User user = BeanUtil.copyProperties(loginUser, com.jmj.gulimall.config.User.class);
        return user;
    }


}

所有服务存取Session 都在Redis  用的SessionId都是同一个,这样就可以达到所有服务都可以共享域 的SessonId 解决了分布式Session的问题。

6.SpringSession原理

一句话精辟解释: 在过滤器放行的时候,偷偷的把原生的 request 和 response 对象换成了它的实现,也就是 调用getSession 的时候拿到的 其实是对redis 操作的Session。但其他的操作还是使用原生的,只不过重写的方法,调用的是子类的,也就是往 redis 里放入 Session,把原生的操作给替换了!

在细节讲一下 : cookie 过期时间 和 Session过期时间不是一个东西

cookie是存储在浏览器客户端的 

session是存放在服务器的 ,

cookie过期了 浏览器拿不到 jsessionId 也就拿不到数据

session过期了 更拿不到,因为存储都没有了

然后浏览器执行请求, 对session进行操作的时候 会对session进行续期  

但是cookie不会续期,cookie过期了浏览器就不会带着cookie来访问服务器了,再次访问,服务器将会颁发一个新的cookie 

完美!!!

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

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

相关文章

uniapp,vue3上传图片组件封装

首先创建一个 components 文件在里面进行组件的创建 下面是 vip组件的封装 也就是图片上传组件 只是我的命名是随便起的 <template><!--图片 --><view class"up-page"><!--图片--><view class"show-box" v-for"(item,ind…

STM32的串口(RS485)数据收发

一、前言 我们的单片机串口一般常用RS232、RS485、TTL这几种通讯方式&#xff0c;日常调试可能RS232、TTL比较多&#xff0c;真正和其它厂家数据交互的时候&#xff0c;还是RS485用的比较多&#xff0c;因为它是差分信号等电气属性&#xff0c;所以比较稳定&#xff0c;传输距…

Matlab演示三维坐标系旋转

function showTwo3DCoordinateSystemsWithAngleDifference() clear all close all % 第一个三维坐标系 origin1 [0 0 0]; x_axis1 [1 0 0]; y_axis1 [0 1 0]; z_axis1 [0 0 1];% 绕 x 轴旋转 30 度的旋转矩阵 theta_x 30 * pi / 180; rotation_matrix_x [1 0 0; 0 cos(th…

SpringBoot使用本地缓存——Caffeine

SpringBoot使用本地缓存——Caffeine 缓存&#xff0c;想必大家都用过&#xff0c;将常用的数据存储在缓存上能在一定程度上提升数据存取的速度。这正是局部性原理的应用。之前用的缓存大多是分布式的&#xff0c;比如Redis。使用Redis作为缓存虽然是大多数系统的选择&#xf…

基于重要抽样的主动学习不平衡分类方法ALIS

这篇论文讨论了数据分布不平衡对分类器性能造成的影响,并提出了一种新的有效解决方案 - 主动学习框架ALIS。 1、数据分布不平衡会影响分类器的学习性能。现有的方法主要集中在过采样少数类或欠采样多数类,但往往只采用单一的采样技术,无法有效解决严重的类别不平衡问题。 2、论…

【Datawhale AI 夏令营】CV图像竞赛——Deepfake攻防

【Datawhale AI 夏令营】CV图像竞赛——Deepfake攻防 从零入门CV图像竞赛(Deepfake攻防) 是 Datawhale 2024 年 AI 夏令营第二期 的学习活动&#xff08;“CV图像”方向&#xff09;&#xff0c;基于蚂蚁集团举办的“外滩大会-全球Deepfake攻防挑战赛”开展的实践学习 ​ 这几天…

Mysql深入讲解(索引、事务、锁机制)

一、MySQL索引 1、何为索引&#xff1f; MySQL中的索引是一种数据结构&#xff0c;用于加快对数据库表中数据的查询速度【查询速度提升】。它类似于书本目录&#xff0c;使得用户可以根据特定字段快速定位到所需的数据行&#xff0c;而无需扫描整个表。 2、索引分类 Hash索…

C 语言回调函数

回调函数的概念 您的理解是正确的。pFunCallBack 是一种函数指针类型&#xff0c;它定义了函数的签名&#xff08;即函数的参数类型和返回类型&#xff09;。当我们说 pFunCallBack pFun&#xff0c;我们是在声明一个变量 pFun&#xff0c;其类型是 pFunCallBack —— 即一个函…

【D3.js in Action 3 精译_018】2.4 向选择集添加元素

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本章小结 第二章…

RNN循环递归网络讲解与不掉包python实现

1.算法简介 参考论文&#xff1a;Elman J L. Finding structure in time[J]. Cognitive science, 1990, 14(2): 179-211.&#xff0c;谷歌被引次数超16000! 说到循环递归结构就不得不提到其鼻祖RNN网络。首先我们先对RNN有个初步的概念&#xff1a;想象一下&#xff0c;你正在…

[紧急!!!]20240719全球Windows10/11蓝屏问题,CrowdStrike导致的错误解决方案

文章目录 前言一、CrowdStrike是什么&#xff1f;二、PC解决方式&#xff08;网路上大神的方式&#xff0c;虚拟机测试过&#xff09;1.Windows PC 上 CrowdStrike BSOD 问题的官方解决方法&#xff1a;2.阻止CrowdStrick启动-命令行法3.阻止CrowdStrick启动-注册表法 三、AWS …

基于Matlab的数据可视化

基于Matlab的数据可视化 一、二维图形的绘制&#xff08;一&#xff09;基本图形函数&#xff08;1&#xff09;plot函数&#xff08;2&#xff09;fplot函数&#xff08;3&#xff09;其他坐标系的二维曲线 &#xff08;二&#xff09;图形属性设置&#xff08;1&#xff09;线…

对某次应急响应中webshell的分析

文章前言 在之前处理一起应急事件时发现攻击者在WEB应用目录下上传了webshell&#xff0c;但是webshell似乎使用了某种加密混淆手法&#xff0c;无法直观的看到其中的木马连接密码&#xff0c;而客户非要让我们连接webshell来证实此文件为后门文件且可执行和利用(也是很恼火&a…

数据结构与算法04二叉树|二叉排序树|AVL树

目录 一、二叉树(binary tree) 1、二叉树常见术语 2、二叉树常用的操作 2.1、初始化&#xff1a;与链表十分相似&#xff0c;先创建节点&#xff0c;然后构造引用/指针关系. 2.2、插入和删除操作 3、常见二叉树类型 3.1、满二叉树 3.2、完全二叉树&#xff08;complete b…

跳跃游戏Ⅱ - vector

55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool canJump(vector<int>& nums) {int n nums.size();int reach 0;for(int i 0; i < n; i){if(i > reach){return false;}reach max(inums[i], reach);}return true;} }; …

SpringBoot3 + Vue3 学习 Day 2

登入接口 和 获取用户详细信息的开发 学习视频登入接口的开发1、登入主逻辑2、登入认证jwt 介绍生成 JWT① 导入依赖② 编写代码③ 验证JWT 登入认证接口的实现① 导入 工具类② controller 类实现③ 存在的问题及优化① 编写拦截器② 注册拦截器③ 其他接口直接提供服务 获取用…

JVM(day4)类加载机制

类加载过程 加载 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的java.lang.Class对象&#xff0c;作为方法区这个类的各种数据的访问入口。 验证 文件格式验证 元数…

LeetCode做题记录(第二天)647. 回文子串

题目&#xff1a; 647. 回文子串 标签&#xff1a;双指针 字符串 动态规划 题目信息&#xff1a; 思路一&#xff1a;暴力实现 我们直接for套for分割成一个个子串再判断&#xff0c;如果子串是回文子串&#xff0c;就1&#xff0c;最后得出结果 代码实现&#xff1a; cl…

C语言实例-约瑟夫生者死者小游戏

问题&#xff1a; 30个人在一条船上&#xff0c;超载&#xff0c;需要15人下船。于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数&#xff0c;从1开始&#xff0c;数到9的人下船&#xff0c;如此循环&#xff0c;直到船上仅剩15人为止&#xff0c;问都有哪些编号…

Missing script:‘dev‘

场景&#xff1a; npm run dev 原因&#xff1a;没有安装依赖&#xff0c;可用镜像安装&#xff08;详见下图ReadMe 蓝色字体&#xff09;&#xff0c;没安装依赖可从package-lock.json文件是否存在看出&#xff0c;存在则有依赖 解决&#xff1a;