【发布时间】:2020-09-24 05:28:09
【问题描述】:
这发生在使用 java 版本 1.8(java8) 的 spring-boot 应用程序中。在 java 14 的普通控制台应用程序中,它运行良好。
我有两个方法与由“OncePerRequestFilter”类扩展的 JWT 过滤类相关。
private String getJwt(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
return authHeader.replace("Bearer ", "");
}
return null;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
String jwt = getJwt(request);
if (!jwt.equals("null") && okenProvider.validateJwtToken(jwt)) {
.....
.....
}
} catch (Exception e) {
....
}
filterChain.doFilter(request, response);
}
预期的 jwt 变量值是令牌或空对象。用于检查以前使用过的jwt != null 并且总是正确的。当仅将其更改为 !jwt.equals("null") 时,它按预期工作。
据此,getJwt 方法总是返回一个 String 对象,即使它为空。这怎么解释?有没有办法返回一个空值而不是“空”?
【问题讨论】:
-
无法重现:在 Java 1.8 和 Java 11 上测试,
public static String returnnull() { return null; }然后if (returnnull() != null) { System.out.println(1); }没有输出。String jwt真的是4个字母“null”的字符串吗? -
@GenoChen,我已经更新了代码以便于理解。我在 java 14 中尝试过同样的方法,得到了和你一样的结果。这是预期的。但是在这里,出了点问题,我需要对此进行一些解释。我认为检查equals方法时可以找到您最后一个问题的答案。
-
我忘记了一件事。如果
String jwt是真的null,那么jwt.equals()会抛出一个NPE然后执行会转到catch分支。
标签: java spring-boot spring-security null return