前后端分离 后端获取不到header解决方案

我的目的:除了登录的请求,其他的每次请求都通过设置Token到头标签(headers)里面,后端做拦截,判断Token是否合法,实现代码安全

前端(Vue):拦截除了登录的其他请求,把token信息放入头标签(headers)里面

我这里只是把重要的逻辑放在里面,如果要看所有文件的话就太多了

// 在发送请求之前做一些事情
service.interceptors.request.use(
    //请求
  config => {
	// 登录的时候把token放入store.getters中,这里就是判断登录没有,如果登录了,那么把token取出来放入头标签中
    if (store.getters.token) {
      // ['token'] 是自定义的令牌
      // 放在头标签中,
      // 请根据实际情况修改它
      config.headers['token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

前端这边有个问题就是跨域的时候,会先传一个OPTIONS的请求,判断连接是否有效

在这里插入图片描述

而这个请求没什么用,使用我们设置的token里面根本就没有

在这里插入图片描述

在另一个请求里面我们可以看见我们写的token参数,所以我们的办法就是在他发送OPTIONS请求时,给他过滤掉,不用管这个请求的内容就行

在这里插入图片描述

后端:拦截器

错误案例

这个案例不要拿来用,这个是有问题的,我只是讲一下问题在哪

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 因为第一次请求是OPTIONS的请求,所以根本就没有token存在,如第二张图,所以token一直就拿不到
        String token = request.getHeader("token");
        
        // Auth0JwtUtils.verify(token)&&!Auth0JwtUtils.isExpired(token) 这两个是我写的验证token的方法,用的jwt,封装了一个工具类
        if (!Strings.isEmpty(token)&&Auth0JwtUtils.verify(token)&&!Auth0JwtUtils.isExpired(token)){
            return true;
        }else {
            request.setAttribute("code",50012);
            request.setAttribute("message","请重新登录");
            return false;
        }
    }

正确案例

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = "";
        // 如果是 OPTIONS 请求,我们就让他通过,不管他
        if (request.getMethod().equals("OPTIONS")) {
            response.setStatus(HttpServletResponse.SC_OK);
            return true;
        // 如果不是,我们就把token拿到,用来做判断
        }else {
            token = request.getHeader("token");
        }
        // Auth0JwtUtils.verify(token)&&!Auth0JwtUtils.isExpired(token) 这两个是我写的验证token的方法,用的jwt,封装了一个工具类
        if (!Strings.isEmpty(token)&&Auth0JwtUtils.verify(token)&&!Auth0JwtUtils.isExpired(token)){
            return true;
        }else {
            JSONObject json = ResponseUtil.failed("500","请重新登录");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json; charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write(json.toString());
            writer.flush();
            writer.close();
            return false;
        }
    }

JWT学习:JWT详解(文章内嵌jwt工具类)_我认不到你的博客-CSDN博客

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
引用\[1\]中的代码片段是前端使用axios发送请求时的拦截器配置,其中将token放入请求头中。而引用\[2\]中提到的目的是为了实现代码安全,拦截除了登录请求以外的其他请求,并将token信息放入请求头中。 根据你的问题,HttpServletRequest获取不到header中Authorization参数的原因可能有以下几种可能性: 1. 请求头中没有设置Authorization参数:请确保在发送请求时,请求头设置了Authorization参数,并且为有效的token。 2. 请求头中的Authorization参数被修改或删除:请检查请求头中的Authorization参数是否被修改或删除,确保其与发送请求时设置的一致。 3. 后端接收请求时未正确获取Authorization参数:请确保后端代码正确获取请求头中的Authorization参数。可以使用HttpServletRequest的getHeader方法来获取请求头中的参数。 需要注意的是,以上是一些常见的可能性,具体原因还需要根据你的代码和环境进行具体分析。希望以上信息对你有帮助。 #### 引用[.reference_title] - *1* *2* [前后端分离 后端获取不到header解决方案](https://blog.csdn.net/qq_57581439/article/details/128041253)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我认不到你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值