laravel+react实战打造企业级⾼并发分布式电商⼩程序(⼀)--基础建设laravel+react实战打造企业级⾼并发分布式电商⼩程序(⼀)
整体使⽤laravel7+react打造整个电商⼩程序。⾥⾯会涉及到⾼并发的知识,mysql的分库分表,主从读写分离的配置,redis集的使⽤,缓存系统的使⽤,队列系统的使⽤等。
先初始化⼀个laravel的项⽬。然后配置好.env⽂件。
基础建设
我们使⽤前后端分离就要考虑跨域问题和安全问题。跨域使⽤cors解决,laravel7⾥⾯内置了cors的解决⽅案,我们只要修
改config/cors.php配置⽂件就好了。
把⾥⾯的值更改⼀下。修改这个值的原因是因为我们会使⽤jwt传⼀个token的请求头过来进⾏验证。这个时候还是报跨域的错误,所以将supports_credentials值修改为true,如果不报错就不需要修改了。
'supports_credentials'=>true,
把这个参数的值修改为true。
安全问题使⽤jwt的解决⽅案,安装jwt的包。
composer require lcobucci/jwt
在routes/api.php路由⽂件中增加下⾯的路由
//获取jwt token
Route::post('/require_token','JWT\RequireTokenController@requireToken');
在config下⾯新建jwt.php⽂件,⾥⾯内容如下
<?php
return[
'JWT_SECRET'=>env('JWT_SECRET','DvYUz+woS7vVJe6ldY+PqWoUbhIyY9rShzM0NAfzxdU='),
'JWT_EXP_TIME'=>env('JWT_EXP_TIME','36000'),
];
在.env中增加下⾯的内容
# jwt
JWT_SECRET=DvYUz+woS7vVJe6ldY+PqWoUbhIyY9rShzM0NAfzxdU=
JWT_EXP_TIME=36000//过期时间
在app/http/middleware中创建中间件jwtCheck.php,内容如下
namespace App\Http\Middleware;
use App\Models\Sys\ErrorModel;
use Closure;
use\Lcobucci\JWT\Parser;
use\Lcobucci\JWT\Signer\Hmac\Sha256;
class jwtCheck
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$parser=new Parser;
$signer=new Sha256;
$secret=config('jwt.JWT_SECRET');
if($request->hasHeader('Authorization')){
$token=$request->header('Authorization');
//解析token
$parse=$parser->parse($token);
//验证token合法性
if(!$parse->verify($signer,$secret)){
return response()->json(['code'=>ErrorModel::JWT_ERROR,'msg'=>'令牌错误!']);
}
//验证是否已经过期
if($parse->isExpired()){
return response()->json(['code'=>ErrorModel::JWT_ERROR,'msg'=>'令牌过期!']);
}
}else{
return response()->json(['code'=>ErrorModel::JWT_ERROR,'msg'=>'令牌缺失!']);
}
//把token放到参数⾥⾯
request()->offsetSet('token',$token);
return$next($request);
}
}
在app/http下⾯的Kernel.php⽂件⾥⾯的$routeMiddleware变量⾥⾯增加下⾯内容,把中间件注册到系统中。'jwtCheck'=> \App\Http\Middleware\jwtCheck::class,
控制器
创建控制器
在app/http/controller下⾯创建jwt⽂件夹,然后在jwt⽂件夹⾥⾯创建RequireTokenController.php⽂件。
namespace App\Http\Controllers\JWT;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use\Lcobucci\JWT\Builder;
use\Lcobucci\JWT\Signer\Hmac\Sha256;
use Illuminate\Support\Facades\Redis;
class RequireTokenController extends Controller
电商小程序源码
{
public function requireToken(Builder $builder, Sha256 $signer){
$secret=config('jwt.JWT_SECRET');
$time=time();
$expTime=config('jwt.JWT_EXP_TIME');
do{
//设置header和payload,以下的字段都可以⾃定义
$builder->setIssuer("cmp.wliot")//发布者
->setAudience("cmp.wliot")//接收者
->setId("abc",true)//对当前token设置的标识
->setIssuedAt($time)//token创建时间
-
>setExpiration($time+$expTime)//过期时间
// ->setNotBefore($time + 5) //当前时间在这个时间前,token不能使⽤
->set('uid',30061);//⾃定义数据
//设置签名
$builder->sign($signer,$secret);
//获取加密后的token,转为字符串
$token=(string)$builder->getToken();
}while(Redis::exists($token));
//存⼊redis
// Redis::setex($token, $expTime, json_encode([]));
return$this->success($token);
}
}
在这⾥⾯使⽤到了$this->success()⽅法,这个⽅法来⾃controller类,我们需要编写这个⽅法。在app/http下⾯创建Utils⽂件夹,在⾥⾯创建Success.php⽂件。
<?php
namespace App\Http\Utils;
use App\Models\Sys\ErrorModel;
trait Success {
function success($data=[]){
$res=['code'=>'0','msg'=>'请求成功!','data'=>$data];
return response()->json($res);
}
}
修改app/http/controllers/controller.php⽂件
use App\Http\Utils\Success;//引⼊刚才的⽂件
class Controller extends BaseController {
use AuthorizesRequests, DispatchesJobs, ValidatesRequests, Success;//在这⾥添加Success 也就是刚才的⽂件。
}
在这⾥⾯使⽤到了redis,所以我们需要启动你本地的redis服务器。启动之后就可以访问我们上⾯填写的路由了,使⽤postman访问你的路由。
可以看到返回了正确的token。
在后⾯的访问请求中我们需要使⽤这个token。我们把它加⼊请求头。在请求头新建⼀个Authorization的key,他的值就是我们的token。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论