SonarLint 报 Methods returns should not be invariant 问题的修改对策


问题描述


在公司写代码的时候SonarLint插件提示Methods returns should not be invariant这个问题,大致意思是说一个方法里的各种if else 分支返回的值永远是固定的值,这样会有问题,需要重新设计这段代码的逻辑。


遇到这个问题的时候束手无策,还在星球发了帖子: https://t.zsxq.com/18kgP6URt 后面想到了修改方法,也很感谢星球微信群里的小伙伴和我一起探讨。


问题代码

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

String token = request.getHeader("Authorization");
// 如果不是映射到方法直接通过
if (!(handler instanceof HandlerMethod)) {
return true;
}
// 执行认证
if (StringUtils.isBlank(token)) {
throw new BusinessException(StatusCode.NOT_LOGIN, "当前未登录,请访问首页重新登录");
}
String sign = "123456789"

// 验证token 用户密码加签名验证token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(sign)).build();
try {
jwtVerifier.verify(token); // 验证token
} catch (JWTVerificationException e){
throw new BusinessException(StatusCode.NOT_LOGIN, "登录状态失效,请重新登录");
}

return true;
}


在SpringBoot项目里配置了一下拦截器,覆写了preHandle方法,这个方法要求返回值必须是boolean。

这个方法里首先就是判断当前的handler 是不是HandlerMethod实例。


if (!(handler instanceof HandlerMethod)) {
return true;
}


然后在这个方法里做很多校验,校验不通过就直接抛出异常,最后如果程序能走到方法结尾,则返回true,就证明没问题嘛。

就是这个逻辑SonarLint提示有问题。因为不管什么时候这个方法如果有返回值,那么一定是true。


原先设计为有问题就抛出异常是因为还想走系统统一的异常捕获,然后统一返回给前端。因为这里是拦截器preHandle方法的覆写,只能返回布尔值true或者false,不能携带自定义异常信息,所以就直接抛出错误了。


说到这里修改的灵感就来了,都已经在代码里获取到所有的请求信息了,难道就不能在这里直接修改返回信息直接返回到前端嘛?这里刚好就有 HttpServletResponse response ,直接拿来修改一下返回给前端即可。


完善后的代码如下


package com.admin.config.interceptor;

import com.admin.common.JsonResult;
import com.admin.common.StatusCode;
import com.alibaba.fastjson2.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JwtInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{

String token = request.getHeader("Authorization");
// 如果不是映射到方法直接通过
if (!(handler instanceof HandlerMethod)) {
return true;
}
// 执行认证
if (StringUtils.isBlank(token)) {
setErrorResponse(response, "当前未登录,请访问首页重新登录");
return false;
}

String sign = "123456789";

// 验证token 用户密码加签名验证token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(sign)).build();
try {
jwtVerifier.verify(token); // 验证token
} catch (JWTVerificationException e){
setErrorResponse(response, "登录状态失效,请重新登录");
return false;
}

return true;
}

private static void setErrorResponse(HttpServletResponse response, String description) throws IOException {
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(JSON.toJSONString(JsonResult.error(StatusCode.NOT_LOGIN, description)));
}
}


这样修改后,既能满足SonarLint的规范,又不需要让系统捕获异常再返回,减少了数据在后台系统继续处理的逻辑,直接返回给前端,而且还能满足后端返回给前端的统一格式和规范。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
南风晚
作者分享
AI零代码应用生成平台中 LangChain4j工具调用中断引发JSON格式报错的问题调查
3
#求助# 今天在写代码的时候SonarLint插件提示这个问题看了半天也不懂怎么解决,怎么设计这段逻辑,求大佬指点[抱拳][抱拳][抱拳] 在SpringBoot项目里配置了一下拦截器,覆写了preHandle方法,这个方法要求返回值必须是boolean。 这个方法里首先就是判断当前的handler 是不是HandlerMethod实例 if (!(handler instanceof HandlerMethod)) { return true; } 然后在这个方法里做很多校验,校验不通过就直接抛出异常,最后如果程序能走到方法结尾,则返回true,就证明没问题嘛。 就是这个逻辑SonarLint提示有问题。 具体代码如下: @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {     String token = request.getHeader("Authorization");     // 如果不是映射到方法直接通过     if (!(handler instanceof HandlerMethod)) {         return true;     }     // 执行认证     if (StringUtils.isBlank(token)) {         throw new BusinessException(StatusCode.NOT_LOGIN, "当前未登录,请访问首页重新登录");     }         String sign = "123456789"     // 验证token 用户密码加签名验证token     JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(sign)).build();     try {         jwtVerifier.verify(token); // 验证token     } catch (JWTVerificationException e){         throw new BusinessException(StatusCode.NOT_LOGIN, "登录状态失效,请重新登录");     }     return true; } 突然想到鱼总的代码小抄可以高亮代码,在这里附上连接 www.codecopy.cn/post/4a1laq
8
#求助# 一个项目中有涉及到Excel数据的导入导出操作,但是导入的数据量大的话,后台处理时长可能会超过1分钟,这样就超过了Apache中配置的请求的等待时长,即超时时间,默认设置为1分钟(导入数据接口使用post请求),以至于前台没有收到后台的响应请求就结束了,然后前台就报错了。 怎么处理能保证后台不管处理多长时间,请求都不会超时(出于安全考虑,不能配置 Apache 1分钟以上的超时等待时间) [流泪][流泪][流泪]困扰很长时间了,大佬们帮帮忙
7
下载 APP