• 前后端分离 后端获取不到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)
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    前端这边有个问题就是跨域的时候,会先传一个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;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    正确案例

        @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;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

  • 相关阅读:
    vue路由&nodeJS环境搭建
    【前端】伪元素的postion:absolute是对哪里的?
    力扣(LeetCode)133. 克隆图(C++)
    【数据挖掘】金山办公2020校招大数据和机器学习算法笔试题
    3.4 Keepalived配置Nginx自动重启,实现7*24小时不间断服务
    HTML5期末考核大作业,网站——旅游景点。 学生旅行 游玩 主题住宿网页
    UI遍历的初步尝试
    【03】Istio Gateway示例配置
    复习单片机:独立按键(内含.1 按键介绍+.2 硬件设计+.3 软件设计+4.原始代码+.5 实验现象)
    vscode访问远程服务器的图形界面如firefox
  • 原文地址:https://blog.csdn.net/qq_57581439/article/details/128041253