文档章节

spring-cloud | 分布式session共享

Erwin_Feng
 Erwin_Feng
发布于 2018/08/22 04:43
字数 1085
阅读 119
收藏 0

写在前面的话

各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心!

以前在写Android的时候,就对客户端请求有一定的认识,比如为什么要用token认证。这一节我们基于Spring Boot + Redis来实现session共享,因为session共享在分布式开发中很常见,所以起“spring-cloud | 分布式session”没毛病吧,另外,我也用kotlin的代码编写。在单点登录也是可以使用的。

理论分析

1、首先我们为什么要用session? 2、如果是用浏览器去访问,ok!没问题,怎么都好说,而我们是先后端分离,怎么样才能找到session,或者说session存在哪里呢?Redis,那么这个session怎么共享呢?于是我想到用cookie,浏览器上这确实不是太大的问题,但现在是ajax请求,相当于客户端,这不仅以为这cookie丢失,还存在跨域的问题。 3、经过一番搜索,得到的答案就一个,因为跨域所以cookie丢失,因为cookie丢失,所以不能获取session。 4、在我测试期间,发生了各种各样的错误,其中还没有“token”等字眼出现,这时候会发现,token也成了一种认证的趋势。 5、跨域如何解决?以前,我请教过别人,得到的答案是jsonp,那还是在实习的时候,也是第一次听到这个,没人指点,调试了很久,也弄不通,后来放弃了,直接在后端放行。但是今天不行了,硬着头皮去调试jsonp,神奇的是,居然一下子懂了,而且还调试成功了。 6、最后,cookie和session这个两个密不可分,但这并不是我们学习的重要,但一定要掌握。是不是又一次感受到了spring的强大。

测试架构

image.png

用户通过浏览器访问前端服务(ui)进行登录操作,login服务会将用户信息的session存放到Redis中实现多个服务的session共享,以便其他服务都能访问到此session。

测试开始

项目目录

本次测试主要分为三块,session-1代码一个分布式系统,session-2代码第二个分布式系统,ui是前端页面,前后端分离。RedisSessionConfig 是使用Redis来保存session,后端逻辑代码放在 UserController中。

测试前清空Redis

测试前,我们先清空之前编写代码时候产生很多的sessionId。

启动三个服务

我们启动着三个服务。

测试完毕,Redis中只有一条session

测试完毕,我们看一下Redis中sessionId:与我们期望的一致。

测试流程

只访问ui工程

登录

# 浏览器访问:
http://localhost:8082/login.html

# 响应:
{code: 0, msg: "登录成功"}

session-1

# 浏览器访问:
http://localhost:8082/session-1.html

# 响应:
{from: "session-1", name: "张三", age: 20}

session-2

# 浏览器访问:
http://localhost:8082/session-2.html

# 响应:
{from: "session-2", name: "张三", age: 20}

部分代码

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

RedisSessionConfig

package com.fengwenyi.session1

import org.springframework.context.annotation.Configuration
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession

/**
 *
 * @author Wenyi Feng
 */
@Configuration
@EnableRedisHttpSession
class RedisSessionConfig {
}

UserController

package com.fengwenyi.session1

import org.springframework.http.MediaType
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import java.util.*
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

/**
 * 系统1
 * @author Wenyi Feng
 */
@RestController
@RequestMapping(value = "/user", produces = [MediaType.APPLICATION_JSON_UTF8_VALUE])
class UserController {

    @RequestMapping("/login")
    fun login(request: HttpServletRequest, response : HttpServletResponse) : String {
        var httpSession = request.session
        httpSession.setAttribute("name", "张三")
        httpSession.setAttribute("age", 20)
        var date = Date()

        var callback = request.getParameter("callback")

        return "$callback({\"code\":0,\"msg\":\"登录成功\"})"
    }

    @RequestMapping("/test")
    fun test(request: HttpServletRequest) : String {
        var httpSession = request.session
        var name = httpSession.getAttribute("name")
        var age = httpSession.getAttribute("age")

        var callback = request.getParameter("callback")

        return "$callback({\"from\":\"session-1\",\"name\":\"$name\",\"age\":$age})"
    }

}

session-1.html

<!DOCTYPE html>
<html>
<head>
	<title>session-1</title>
</head>
<body>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
function _jsonp(resultData){
    console.log(resultData)
}
</script>
<script src="http://localhost:8080/user/test?callback=_jsonp"></script>
</body>
</html>

参考文章

[1] springboot集成springsession利用redis来实现session共享

[2] jsonp返回的数据格式与普通json的区别

[3] 简单透彻理解JSONP原理及使用

[4] java的会话管理:Cookie和Session

[5] Linux | Redis

[6] 代码已上传至Github

© 著作权归作者所有

Erwin_Feng

Erwin_Feng

粉丝 13
博文 49
码字总数 50330
作品 1
成都
高级程序员
私信 提问
加载中

评论(0)

Spring Session Redis 在不同服务间共享 Session 时的类共享方案

Spring Session Redis 是不安全的 当在多服务之间使用 Spring Session Redis 进行 Session 共享要非常小心,因为它很不安全,很有可能导致整个服务实例不可用,无法处理任何请求。其中比较危...

OSC首席骠妓大将军
2019/09/02
326
1
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享

Spring Boot 使用 Spring Session 集成 Redis 实现Session共享 《Spring Boot 2.0极简教程》—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 通常在web开发中,Session 会话管理是很重要...

程序员诗人
2018/04/17
0
0
java B2B2C源码电子商务平台-基于Consul的分布式锁实现

分布式锁实现 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码:壹零叁八柒柒肆六二六 基于Consul的分布式锁主要利用Key/Value存储API中的acquire和release操作来实...

it飞飞
2018/12/28
0
0
通过Springboot拆分服务构建微服务集

上个月(16/07)把一个大而全的应用拆分成一个个小的应用。 应用背景: 1.基于Spring Boot开发 2.依赖ActiveMQ,Kafka,Redis,Mongodb,MySQL等开源软件 3.内部服务图片服务器,分布式计算平台服...

secondriver
2018/06/26
0
0
Spring Cloud与Spring Boot版本匹配关系

Spring Cloud是什么? “Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems.” Spring Cloud为开发者提供了一套可以用来快......

颖辉小居
2018/06/27
457
0

没有更多内容

加载失败,请刷新页面

加载更多

Golang 实现 Redis(4): AOF 持久化与AOF重写

本文是使用 golang 实现 redis 系列的第四篇文章,将介绍如何使用 golang 实现 Append Only File 持久化及 AOF 文件重写。 本文完整源代码在作者GithubHDT3213/godis AOF 文件 AOF 持久化是典...

osc_tjnx25e9
22分钟前
28
0
Android开发中R资源引用注意事项

我们都知道,在Android打包时进行的aapt是对Android的资源打包,从而生成一个R.java文件,其中包括非assets下的所有资源的id值,同时还生成resource.arsc文件,也就是资源索引表。 而我们程序...

Java圈子
22分钟前
26
0
八大常用电子元器件,你知道多少?今天给大家讲个透彻,让你明白

随着电子技术及其应用领域的突飞猛进,设计过程中用到的元器件种类日益增多,学习和掌握 常用元器件的性能、用途、质量判别方法, 对提高电气设备的装配质量及可靠性将起重要的保证作用。电阻...

demyar
23分钟前
22
0
win10 windows10 shift 右键 在此处打开命令窗口 cmd

win10 是打开的powershell,但是不喜欢用,感觉权限没有cmd高 新建一个txt Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Directory\shell\cmdprompt]@="@shell32.dll,-8506""Ex......

osc_hzf6peqc
23分钟前
32
0
mvn编译时绕过本地jar去maven仓库下载问题

第一种解决方法: 构建maven项目时,获取某个jar包,该jar包不在maven中央仓库中,在自己搭建的私服仓库中。本地maven仓库已经存在该jar包,编译时却一直提示,官方maven仓库无法获取到该包。...

osc_facwbzof
24分钟前
33
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部