文档章节

spring-cloud | 分布式session共享

JAVA_冯文议
 JAVA_冯文议
发布于 08/22 04:43
字数 1085
阅读 15
收藏 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

© 著作权归作者所有

共有 人打赏支持
JAVA_冯文议
粉丝 10
博文 39
码字总数 33130
作品 0
成都
高级程序员
私信 提问
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享

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

程序员诗人
04/17
0
0
通过Springboot拆分服务构建微服务集

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

secondriver
06/26
0
0
springboot之Redis的使用

spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。 redis介绍 Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lis...

无语年华
05/09
0
0
spring-boot整合spring-session,使用redis共享

本文讲述spring-boot工程中使用spring-session机制进行安全认证,并且通过redis存储session,满足集群部署、分布式系统的session共享。 java工程中,说到权限管理和安全认证,我们首先想到的...

louieSun
05/13
0
0
Springboot和Spring Session实现session共享

HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。而如果我们把web服务器搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有...

ben4
2017/10/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0011-如何在Hive & Impala中使用UDF

1.文档编写目的 本文档讲述如何开发Hive自定义函数(UDF),以及如何在Impala中使用Hive的自定义函数,通过本文档,您将学习到以下知识: 1.如何使用Java开发Hive的自定义函数 2.如何在Hive中...

Hadoop实操
4分钟前
0
0
toString();

package com.atguigu.java1; import java.util.Date; /** * toString()的使用: * * 1.java.lang.Object类中toString()定义如下: * public String toString() { return getClass().getName......

architect刘源源
14分钟前
0
3
不可不说的Java“锁”事

前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点...

Java干货分享
18分钟前
0
0
Java GoEasy 实现服务端推送和Web端推送

项目中需要消息推送,又想降低开发成本。Java服务器端推送,Web端接收推送信息。 具体需求: 需求一:系统框架实现全局异常捕获并录入日志表,实现实时推送消息到客户端页面展示。 需求二:系...

Gibbons
19分钟前
3
0
redis-集群

多个redis节点网络互联,数据共享 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,...

chencheng-linux
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部