laravel设置自定义相应头不起作用

背景

在使用token做登录验证时,需要给token设置过期时间,对于活跃用户,后台自动生成新的token,传给前端。

踩坑开始

整体思路就是在用户登录时,后台接口返回一个加密了用户信息和时间的token串给前端,前端保存在cookie中,调用接口时,从header头中传给接口,接口收到请求解析token,获取时间判断是否过期(我设置了过期时间为一个小时),如果过期直接返回401,用户重新登录。如果快要过期(超过半个小时)就刷新token,并将新的token设置在response中的header中,前端收到响应判断如果header中含有token,就更新本地token。接口刷新token的这一步在中间件中实现代码如下:

public function handle($request, Closure $next)
    {
        $token = $request->header("token");
        if (empty($token)) {
            return response(['code'=>401001, 'message' => '请先登录'],401);
        }
       
        //解析token
        $mid_params = ['user_token_info'=>json_decode(decrypt($token))];

        //判断过期时间
        if (time() - $mid_params['user_token_info']->time > 3600) {
             return response(['code'=>401001, 'message' => '登录信息过期,请重新登录'],401);
        }

        $request->merge($mid_params);//合并参数
        $response = $next($request);

        if (time() - $mid_params['user_token_info']->time > 180) {
            $response->headers->set('token', get_token($mid_params['user_token_info']->id, $mid_params['user_token_info']->username));
        }

        return $response;
    }

这样设置完之后,在前端header中获取不到token,卡了好久终于解决了,原来是要设置Access-Control-Expose-Headers ,修改后的代码如下

public function handle($request, Closure $next)
    {
        $token = $request->header("token");
        if (empty($token)) {
            return response(['code'=>401001, 'message' => '请先登录'],401);
        }
       
        //解析token
        $mid_params = ['user_token_info'=>json_decode(decrypt($token))];

        //判断过期时间
        if (time() - $mid_params['user_token_info']->time > 3600) {
             return response(['code'=>401001, 'message' => '登录信息过期,请重新登录'],401);
        }

        $request->merge($mid_params);//合并参数
        $response = $next($request);

        if (time() - $mid_params['user_token_info']->time > 180) {
            //允许暴露在外部的header
            $response->header('Access-Control-Expose-Headers', 'token');
            $response->headers->set('token', get_token($mid_params['user_token_info']->id, $mid_params['user_token_info']->username));
        }

        return $response;
    }

前端代码

axios.interceptors.response.use(function (response) {
    if (response.headers.token !== undefined) {
        ac.setData('token', response.headers.token);
        axios.defaults.headers.common['token'] = ac.getData('token');
    }
    return response;
}, function (error) {
    const { response} = error;
    if (response.status === 401) {
        browserHistory.push('/web/login');
    }

    return Promise.reject(error);
});

你可能感兴趣的:(laravel设置自定义相应头不起作用)