自己写拦截器代码的时候,比较习惯用==null来判断,但是一对答案,发现老师用的是后两种,遂问了一下豆包,得到答案总结如下:
java
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.从请求头中获取token信息
String token = request.getHeader("authorization");
//2.如果为空就返回401状态码
if(StrUtil.isBlank(token)){
response.setStatus(401);
return false;
}
//3.token不为空则取出用户信息
Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(LOGIN_USER_KEY + token);
//4.如token能查找不到用户信息则返回错误
if(userMap.isEmpty()){
response.setStatus(401);
return false;
}
//5.不为空就将hash转换为UserDTO类
UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap,new UserDTO(),false);
//6.保存用户信息到ThreadLocal
UserHolder.saveUser(userDTO);
//7.刷新token有效期
stringRedisTemplate.expire(LOGIN_USER_KEY + token,LOGIN_USER_TTL, TimeUnit.MINUTES);
//5.放行
return true;
}
不同方法的区别
- StrUtil.isBlank()兼容null / "" / " "三种无效值。
- isEmpty()只能在已有对象上调用,表明对象为空,必须变量不为null才能用。
- null只判断 "是不是空指针",不判断内容。
使用规则
- 字符串(request.getHeader()\普通String变量)
- 拿不到数值返回null,而非空串""。
- 所以优先用Hutool包下的
StrUtil.isBlank(str)。 - 或者可以使用原生Java:
str == null || str.trim().isEmpty()。
- 集合/Map(List、HashMap、Redis entries查询结果)
- Spring RedisTemplate永远不会返回null,查不到数据会返回空集合对象。
- 所以使用
.isEmpty()。
- 从Redis拿普通的String(opsForValue().get(key))
- key不存在返回null。
- 所以判断逻辑和普通字符串一样,使用
StrUtil.isBlank(str)。
总结
1.只要变量类型是 String,统一用 StrUtil.isBlank,不用纠结;
2.只要变量类型是 Map/List,统一用 .isEmpty(),不用判 null;
3.只有一种特殊情况需要同时判null:自己手动 new 的集合,中途赋值为 null(业务几乎遇不到)。