Session的基本使用,以及搭配Redis解决单点登录问题

  • session依赖于cookie,使用cookie数据存在客户端,不安全,可以直接拿到存的密码。每次访问数据传输量大。
  • 所以有了session这个技术,session将信息存在服务器内存,也有缺点,占用服务器内存。

在springmvc中,只要声明,框架就会自动注入session对象,不用自己主动创建

// session示例

    @RequestMapping(path = "/session/set", method = RequestMethod.GET)
    @ResponseBody
    public String setSession(HttpSession session) {
        session.setAttribute("id", 1);
        session.setAttribute("name", "Test");
        return "set session";
    }

    @RequestMapping(path = "/session/get", method = RequestMethod.GET)
    @ResponseBody
    public String getSession(HttpSession session) {
        System.out.println(session.getAttribute("id"));
        System.out.println(session.getAttribute("name"));
        return "get session";
    }

在这里插入图片描述

在分布式部署中session存在不识别的问题

在这里插入图片描述

解决办法一

粘性session,同一个ip固定分配给同一个服务器
缺点:这样固定分配其实负载就不一定均衡了,性能不一定会好

解决办法二

同步session。在一个服务器创建session后会将session同步给其他服务器
缺点:服务器同步有开销,互相耦合

解决办法三

专门弄一个服务器用来专门存session
缺点:风险高,这个服务器挂了就都失效,如果部署集群就又回到上面的问题

解决办法四

用数据库存(可部署集群)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FastAPI是一个现代化的Web框架,它具有高性能和易用性。要实现单点登录,可以使用Redis作为session存储。 下面是实现单点登录的一般步骤: 1. 创建一个Redis连接池 ```python import redis from fastapi import FastAPI app = FastAPI() redis_pool = redis.ConnectionPool(host='localhost', port=6379, db=0) ``` 2. 定义登录和注销路由 ```python @app.post("/login") async def login(username: str, password: str): # 检查用户名和密码是否正确 if username == "admin" and password == "password": session_token = uuid.uuid4().hex redis_conn = redis.Redis(connection_pool=redis_pool) redis_conn.set(session_token, username) return {"session_token": session_token} else: return {"error": "Invalid username or password"} @app.post("/logout") async def logout(session_token: str): redis_conn = redis.Redis(connection_pool=redis_pool) redis_conn.delete(session_token) return {"message": "Logged out successfully"} ``` 3. 定义需要登录才能访问的路由 ```python @app.get("/protected") async def protected_route(session_token: str): redis_conn = redis.Redis(connection_pool=redis_pool) username = redis_conn.get(session_token) if username: return {"message": f"Hello, {username.decode('utf-8')}!"} else: return {"error": "Unauthorized"} ``` 在这个例子中,当用户成功登录时,将在Redis中创建一个session token,并将其返回给客户端。客户端在访问需要登录才能访问的路由时,需要session token作为参数传递。服务器将使用Redis检查session token是否存在,并返回相应的响应。 需要注意的是,这里的实现并没有考虑到会话过期和并发访问等问题,这些问题需要根据具体情况进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值