[ vue ] axios 发送 POST 请求,后端不能通过 HttpServletRequest 获取参数

项目环境

  • SpringBoot 1.5
  • Shiro 权限管理
  • vue / axios

部分实现代码

public Result admLogin(HttpServletRequest request, HttpServletResponse response, String username, String password){
        log.info("用户名:{},密码:{}",username,password);
        if(username.isEmpty() || password.isEmpty()){
            return new Result(ResultCode.FAIL);
        }
        try {
        MyFormAuthenticationFilter filter = new MyFormAuthenticationFilter();
        MyUsernamePasswordToken upToken = (MyUsernamePasswordToken) filter.createToken(request,response);
            Subject subject = SecurityUtils.getSubject();
            // 调用subject进行登录
            subject.login(upToken);
            return new Result(ResultCode.SUCCESS);
        } catch (AuthenticationException e) {
            return new Result(ResultCode.FAIL);
        }
    }


protected AuthenticationToken createToken(ServletRequest request,
                                              ServletResponse response) {
        // TODO Auto-generated method stub
        String username = getUsername(request);
        String password = getPassword(request);
        boolean rememberMe = isRememberMe(request);
        String host = getHost(request);
        return new MyUsernamePasswordToken(username, password, rememberMe,
                host, true, roleBase);
    }

遇到的问题

在 createToken 方法中,从 request 中获取到的用户名和密码为 null

解决方案

  • axios 默认是 Payload 格式进行数据请求
    在这里插入图片描述
  • axiospost 请求设置请求头
headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
  • post 数据请求格式变成了 Form Data,后端就可以从 request 中获取参数了
    在这里插入图片描述

说明

这部分说的好像不是很清楚,等我学会了再补充

  • 服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
  • application/x-www-form-urlencoded 这是最常见的 POST 数据提交方式。浏览器的原生 form 表单
  • Payload 和 Form Data 的主要设置是根据请求头的 Content-Type 的值来的。
方式 请求头
Payload Content-Type: ‘application/json; charset=utf-8’
Form Data Content-Type: ‘application/x-www-form-urlencoded’

参考链接


在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章