vue axios发送请求后端接收不到token(JWT)

使用Axios时,会发送options 请求

http分为复杂请求和简单请求

当浏览器认为是简单请求时则不会发送options请求,反之会先发送一个options预请求,然后才会发送复杂请求。

满足以下条件的请求是简单请求:

  • 请求方式:GET、POST、HEAD
  • 请求的header里不能超出以下几种字段:
    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type
  • Content-Type 的值 只限于以下三种:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

Vue默认的Content-Type:application/json

  • 为复杂请求

解决办法

后端

  • 使用拦截器过滤options请求
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      //axios在发送请求之前需要先发送一个OPTIONS预请求,相当于请求两次,直接放行
      if ("OPTIONS".equals(request.getMethod().toString())) {
          return true; //true是直接放行,前端抓包会有options请求
          				//false拒接访问,抓包就不会有options请求了
      }
}

字符串使用equals判断时,肯定存在的字符串写前面,可能为null写在里面,防止空指针异常(阿里巴巴规范)

前端

  • 将复杂请求改为简单请求=>设置Content-Type:application/x-www-form-urlencoded
  • Vue引入qs模块,将数据类型格式转成对应的格式(表单提交数据格式)
import qs from 'qs
Vue.prototype.$qs = qs
this.$axios
     .post("http://xxx/", 
        this.$qs.stringify(postData)
      ).then(data => {
        if (data.data.status != 200) {
          //xxx
        } else {
          //xxx
        }
      });

推荐使用后端解决(虽然可能会耗用更多的服务器资源)

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Spring Boot 后端,我们可以使用 Spring Security 框架来实现基于 token 的认证和授权。具体步骤如下: 1. 在用户登录成功后,生成一个 token 并返回给前端。 2. 前端在后续的请求中,在请求头中添加一个名为 Authorization 的字段,值为 "Bearer " + token。 3. 后端接收请求后,从请求头中解析出 token。 4. 后端使用 Spring Security 的 filter 对 token 进行验证,判断该请求是否有权限访问。 下面是 Spring Boot 后端的示例代码: 1. 在登录成功后,生成一个 JWT token 并返回给前端 ```java // 生成 JWT token String token = Jwts.builder() .setSubject(user.getUsername()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); // 将 token 返回给前端 response.addHeader(HEADER_STRING, TOKEN_PREFIX + token); ``` 2. 前端在请求头中添加 Authorization 字段 ```javascript // 在请求头中添加 Authorization 字段 axios.defaults.headers.common['Authorization'] = 'Bearer ' + token; ``` 3. 后端请求头中解析出 token ```java // 从请求头中获取 token String header = request.getHeader(HEADER_STRING); if (header == null || !header.startsWith(TOKEN_PREFIX)) { chain.doFilter(request, response); return; } String token = header.replace(TOKEN_PREFIX, ""); ``` 4. 后端使用 Spring Security 的 filter 对 token 进行验证 ```java // 使用 Spring Security 的 filter 对 token 进行验证 Authentication authentication = new JwtAuthenticationToken(token); SecurityContextHolder.getContext().setAuthentication(authentication); chain.doFilter(request, response); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值