如何不破坏 Request.php 代码 修改 里面的sessionId的获取方式

问题描述

session他是获取的是cookie 如果我的session key

存到HTTP请求头里面

怎么样不修改他框架的代码

截图

我如果不修改 他的这个框架的文件

怎么样使用 使用 session("admin")

他还会读取 header里的 session key

截图

597 2 0
2个回答

efnic

PHP特性,子类可以重写父类的方法,就这一条还不够吗?
根目录下的/support/Request.php 这个文件是允许随便修改的,升级框架 不会覆盖。

  • 2024-01-18

    最后还是修改框架源码 发现改动最小 修改别的地方 所有调用 $request->session() 的地方都要改

  • efnic 2024-01-18

    我是在/support/Request.php这个文件加了一个方法,来设置sid。

    /**
         * 设置session_id
         * @param string $session_id
         * @return $this
         */
        public function setSid(string $session_id): static
        {
            $this->sid = $session_id;
            return $this;
        }

    建立一个中间件,从请求头里面取所谓的session_id(sid)。

  • efnic 2024-01-18

    中间件代码如下:

    <?php
    
    namespace app\middleware;
    
    use support\Request;
    use Webman\Http\Response;
    use Webman\MiddlewareInterface;
    
    /**
     * Token转换Session
     * - 从请求头获取token值,设置session_id
     */
    class TokenMiddleware implements MiddlewareInterface
    {
        /**
         * 鉴权
         * @param Request|\Webman\Http\Request $request
         * @param callable $handler
         * @return Response
         */
        public function process(Request|\Webman\Http\Request $request, callable $handler): Response
        {
            if ($sid = $request->header('token')) {
                $request->setSid($sid);
            }
            return $handler($request);
        }
    }
  • efnic 2024-01-18

    通过此方法我整合过 likeadmin(运行在PHP-FPM,主要用了他的手机端源码)、goview(可视化拖拉拽大屏可视化)

  • 2024-01-18

    牛的呢 我试试

efnic

或者直接加个中间件即可:

<?php

namespace app\middleware;

use support\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

/**
 * Token转换Session
 * - 从请求头获取token值,设置session_id
 */
class TokenMiddleware implements MiddlewareInterface
{
    /**
     * 鉴权
     * @param Request|\Webman\Http\Request $request
     * @param callable $handler
     * @return Response
     * @throws \Exception
     */
    public function process(Request|\Webman\Http\Request $request, callable $handler): Response
    {
        if ($sid = $request->header('token')) {
            $request->sessionId($sid);
        }
        return $handler($request);
    }
}
  • 2024-01-18

    谢谢你,我还是改了他框架的源码

  • efnic 2024-01-18

    代码都对的,有个常识的东西没讲;估计你掉坑里了,代码没生效对吧?
    中间件是有顺序的。
    需要把设置sid的中间件,放到最前面。

  • efnic 2024-01-18

    你贴图的源码内,所谓的改workerman框架源码,本质还是从请求头取所谓的session_id,然后设置sid。
    我想问的是,286-291行两个if逻辑这么简单,你不会看不懂吧?

  • 2024-01-19

    我感觉还是直接修改框架简单 后面再说 按照那个 中间件的方法做了 没有用

×
🔝