webman跨域相关问题

2023年9月13日14:14:05

webman版本1.5

php版本8.0

运行环境windows

测试项目:https://gitee.com/open-php/zx-webman-website

webman在跨域的时候,会有点不同因为第一个区别就是是否关闭自动路由

复制代码
//关闭自动路由
Route::disableDefaultRoute();

如果不关闭路由只要简单的在路由上挂上跨域中间件,如果开启自动路由,就在config/middleware.php添加就可以了

复制代码
return [
    '' => [
        app\middleware\CrossDomain::class,//跨域请求
    ]
];

CrossDomain中间件的代码

复制代码
<?php

namespace app\middleware;

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

//跨域
class  CrossDomain implements MiddlewareInterface
{
    public function process(Request $request, callable $next): Response
    {
//        p(getTime() . self::class);
        // 如果是options请求则返回一个空响应,否则继续向洋葱芯穿越,并得到一个响应
        $response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : $next($request);
        // 给响应添加跨域相关的http头
        $response->withHeaders([
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Allow-Origin' => $request->header('origin', '*'),
            'Access-Control-Allow-Methods' => $request->header('access-control-request-method', '*'),
            'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', '*'),
        ]);
        return $response;
    }
}

如果关闭自动路由挂在中间件就如下:

复制代码
Route::group('/open', function () {

    Route::get('/test', [app\controller\Web\TestController::class, 'index'])->name('测试');
    Route::post('/uploadPic', [app\controller\Web\IndexController::class, 'uploadPic']);//上传图片文件
    Route::post('/uploadFile', [app\controller\Web\IndexController::class, 'uploadFile']);//上传普通文件
})->middleware([
    app\middleware\CrossDomain::class,
    app\middleware\ApiLog::class
]);

关闭自动路由的情况下需要额外配置一点东西

复制代码
<?php
/**
 * This file is part of webman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author    walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link      http://www.workerman.net/
 * @license   http://www.opensource.org/licenses/mit-license.php MIT License
 */

use app\util\GlobalCode;
use Webman\Route;
use support\Request;

//请求不存在的url返回信息
Route::fallback(function (Request $request) {
    $response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : returnJson([GlobalCode::CODE => GlobalCode::NOT_FOUND, GlobalCode::MSG => '404 not found', GlobalCode::DATA => null]);
    $response->withHeaders([
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Allow-Origin' => "*",
        'Access-Control-Allow-Methods' => '*',
        'Access-Control-Allow-Headers' => '*',
    ]);
    return $response;
});
//关闭自动路由
Route::disableDefaultRoute();

//首页
Route::get('/', function ($rquest) {
    return view('index/view');
});

//前台,api有权限
Route::group('/open', function () {

    Route::get('/test', [app\controller\Web\TestController::class, 'index'])->name('测试');
    Route::post('/uploadPic', [app\controller\Web\IndexController::class, 'uploadPic']);//上传图片文件
    Route::post('/uploadFile', [app\controller\Web\IndexController::class, 'uploadFile']);//上传普通文件
})->middleware([
    app\middleware\CrossDomain::class,
    app\middleware\ApiLog::class
]);


if (!function_exists('returnJson')) {
    function returnJson(mixed $data = null, int $status = 200, array $headers = ['Content-Type' => 'application/json'], int $options = JSON_UNESCAPED_UNICODE): Response
    {
        return new Response($status, $headers, json_encode($data, $options));
    }
}
相关推荐
搬码临时工1 小时前
通过自定义域名访问内网的web服务和tcp应用:内网ip到局域网外域名访问过程
服务器·tcp/ip·php
用户3074596982077 小时前
PHP 命名空间(Namespace)全解析:从零开始,一篇讲透!
php
Q_Q51100828511 小时前
python的校园研招网系统
开发语言·spring boot·python·django·flask·node.js·php
大熊不是猫11 小时前
Laravel 事件与监听器
php·laravel·event
晨曦54321015 小时前
图(Graph):关系网络的数学抽象
开发语言·算法·php
MZ_ZXD00120 小时前
springboot汽车租赁服务管理系统-计算机毕业设计源码58196
java·c++·spring boot·python·django·flask·php
朱皮皮呀1 天前
Spring Cloud——服务注册与服务发现原理与实现
运维·spring cloud·eureka·服务发现·php
花开富贵贼富贵1 天前
计算机网络技术学习-day4《路由器配置》
网络·智能路由器·php
BingoGo1 天前
PHP 集成 FFmpeg 处理音视频处理完整指南
后端·php
望获linux2 天前
【实时Linux实战系列】基于实时Linux的物联网系统设计
linux·运维·服务器·chrome·php