项目环境
- 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 格式进行数据请求
- 为 axios 的 post 请求设置请求头
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’ |
参考链接