日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php跨域请求解决方案_swoft2 -跨域与中间件详解

發布時間:2024/1/23 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php跨域请求解决方案_swoft2 -跨域与中间件详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本方案用于開發環境,在生產環境不建議使用,生產環境可以使用 nginx 的反向代理

一、什么是跨域?

同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSRF等攻擊。所謂同源是指”協議+域名+端口”三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。

同源策略限制內容有:

Cookie、LocalStorage、IndexedDB 等存儲性內容
DOM 節點
AJAX 請求發送后,結果被瀏覽器攔截了

但是有三個標簽是允許跨域加載資源:

<img src=XXX> <link href=XXX> <script src=XXX>因為現在大多數項目采用前后分離的開發模式,所以前后端交互經常遇到跨域的情況.在 swoft2 配置跨域是通過中間件來完成的.下面我們教大家怎么配置.

中間件簡單介紹

可以看到中間件是貫穿整個請求的,請求開始之后會:匹配路由->執行中間件->執行控制器方法->再次執行中間件。可以當作其他框架的前置方法和后置方法,中間件在調用控制器方法之前會執行,調用之后也還會執行。

中間件起到的作用
中間件在可以進行用戶登陸的驗證、權限校驗、數據修正、統一返回格式等等,其實只要了解了生命周期之后基本上就可以想象到中間件的作用。

定義中間件

只需要實現了 SwoftHttpServerContractMiddlewareInterface 接口均為一個合法的中間件,其中 process() 方法為該中間件邏輯處理方法。不過我們通常把代碼放在 app/Http/Middleware

配置全局中間件

添加全局中間件,所有控制器都會走這里的中間件,在做

添加多個中間件

修改文件 app/bean.php'httpDispatcher' => [// Add global http middleware'middlewares' => [AppHttpMiddlewareFavIconMiddleware::class,SwoftHttpSessionSessionMiddleware::class,AppHttpMiddlewareControllerMiddleware::class,//我們自己的中間件SwoftViewMiddlewareViewMiddleware::class,],'afterMiddlewares' => [SwoftHttpServerMiddlewareValidatorMiddleware::class]],

配置局部的中間件

通過 @Middleware 和 @Middlewares, 可以很方便的配置中間件到當前的 Controller 和 Action 內

當將此注解應用于 Controller 上,則作用域為整個 Controller將此注解應用于 Action 上,則作用域僅為當前的 Action

@Middleware 用于配置單個中間件

/*** Class HomeController* @Controller()* @Middleware(ControllerMiddleware::class)* })*/class HomeController{....}

@Middlewares 顯而易見的是用于配置一組 @Middleware,按照定義順序依次執行

/*** Class HomeController* @Controller()* @Middlewares({@Middleware(SessionMiddleware::class),* @Middleware(ControllerMiddleware::class),* })*/ class HomeController {.... }

跨域中間件簡單示例

文件 App/Http/Middlewar/ControllerMiddleware.php<?php declare(strict_types=1); namespace AppHttpMiddleware; use PsrHttpMessageResponseInterface; use PsrHttpMessageServerRequestInterface; use PsrHttpServerRequestHandlerInterface; use SwoftBeanAnnotationMappingBean; use SwoftHttpMessageContentType; use SwoftHttpServerContractMiddlewareInterface; use SwoftHttpSessionHttpSession;/*** @Bean()*/ class ControllerMiddleware implements MiddlewareInterface {/*** Process an incoming server request.** @param ServerRequestInterface $request* @param RequestHandlerInterface $handler** @return ResponseInterface* @inheritdoc*/public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface{$sess = HttpSession::current();$sess->set('__SWOFT_SESSION_ID__', 'SWOFT_SESSION_ID');//修復sessoion bugif ('OPTIONS' === $request->getMethod()) {$response = Context::mustGet()->getResponse();return $this->configResponse($response);}$ret = $handler->handle($request);$data=$ret->getData();if(is_object($data)||is_array($data)){return $this->configResponse(response(ContentType::JSON)->withData($data));}return $this->configResponse(response(ContentType::HTML)->withContent($data));}private function configResponse(ResponseInterface $response){return $response->withHeader('Access-Control-Allow-Origin', '*')->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');} }

注入中間件

將中間件注入全局讓每個請求都能生效,并且這個中間件應該在其他中間件之前執行,所以放入 preMiddlewares 'httpDispatcher' => [// Add pre http middleware"preMiddlewares"=>[AppHttpMiddlewareFavIconMiddleware::class,SwoftHttpSessionSessionMiddleware::class,AppHttpMiddlewareControllerMiddleware::class,],'middlewares' => [// SwoftWhoopsWhoopsMiddleware::class,// Allow use @View tagSwoftViewMiddlewareViewMiddleware::class,],'afterMiddlewares' => [SwoftHttpServerMiddlewareValidatorMiddleware::class]],

重要

上面雖然把中間件配置好了,但是還是不能跨域訪問,因為請求默認是只允許get和post請求,而跨域會發送option請求,所以這個地方是個坑,很多跨域配置不成功就是因為這個原因。所以需要設置 RequestMapping 的注解,并且設置 method 參數允許 OPTIONS 請求,這樣就能實現跨域 /*** @RequestMapping(route="/prolist" ,method={RequestMethod::POST,RequestMethod::OPTIONS})*/public function prod_list(){return [data=>"跨域設置成功"];}

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要

PHP進階架構師>>>視頻、面試文檔免費獲取?shimo.im

或 者關注咱們下面的知乎專欄

PHP架構師圈子?zhuanlan.zhihu.com

總結

以上是生活随笔為你收集整理的php跨域请求解决方案_swoft2 -跨域与中间件详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。