系统分析小组作业
第六周
针对本小组项目,选一段已编写的代码,回答如下问题:
- 代码规范采用什么方式?
- 运用“代码复审核查表”,回顾本小组项目这段代码
@Slf4j
public class MyJWTAuthenticationFilter extends BasicAuthenticationFilter {
//private JwtProperties jwtProperties;
private final JwtProperties jwtProperties = ApplicationContextHelper.getBean(JwtProperties.class);
// TODO 不够优雅
public MyJWTAuthenticationFilter(AuthenticationManager authenticationManager) {
super(authenticationManager);
//无法注入暂时写死
//this.jwtProperties = new JwtProperties("wjh-shop", 720000L, "token");
log.info("jwtProperties:{}", jwtProperties);
}
public MyJWTAuthenticationFilter(AuthenticationManager authenticationManager, AuthenticationEntryPoint authenticationEntryPoint) {
super(authenticationManager, authenticationEntryPoint);
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String token = request.getHeader(HttpHeaders.AUTHORIZATION);
log.info("jwt令牌:{}", token);
if (token == null) {
//response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
RequestError(request, response, MessageConstant.USER_NOT_LOGIN);
throw new UserNotLoginException(MessageConstant.USER_NOT_LOGIN);
}
log.info("jwt令牌校验:{}", token);
try {
Claims claims = JwtUtil.parseJWT(jwtProperties.getSecretKey(), token);
String userName = claims.get(JwtClaimsConstant.USER_NAME).toString();
log.info("jwt令牌校验通过,当前用户:{}", userName);
//获取当前的时间
Long curTime = System.currentTimeMillis();
Long expTime = JwtUtil.getExpireTime(jwtProperties.getSecretKey(), token);
Long time = (expTime - curTime) / (1000 * 60);
//校验 token 小于十五分钟 就过期 此时对toekn进行续时处理
if (time > 0 && time < 15) {
//根据 用户名 生成新的 token
String newJwt = JwtUtil.createJWT(jwtProperties.getSecretKey(), jwtProperties.getTtl(), claims);
//将新的token 给到 当前的 用户
RedisUtil.set(userName, newJwt);
}
// 构造用户名密码认证信息
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userName, "", null);
//将用户信息传送给上下文 将认证信息存储在 SecurityContextHolder 中
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
chain.doFilter(request, response);
} catch (Exception e) {
log.info("jwt令牌不合法");
RequestError(request, response, MessageConstant.AUTHORIZATION_ERROR);
throw new AuthorizationException(MessageConstant.AUTHORIZATION_ERROR);
}
}
/**
* 在过滤器中返回前端正确的信息反馈 向前端传递具体的信息
* 非法请求
*
* @param msg
*/
public static void RequestError(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String msg) {
//设置编码格式
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/json;charset=utf-8");
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(httpServletResponse.getOutputStream()));
Result result = new Result(ResultStatus.SERVER_ERROR, null);
result.setCode(ResultStatus.SERVER_ERROR.getCode());
//String msg 向前端传递具体的信息
result.setMessage(msg);
out.append(JSON.toJSONString(result));
out.flush();
out.close();
;
} catch (IOException e) {
e.printStackTrace();
}
}
}
“代码复审核查表” 模板如下:
ID | 评审项目 | 执行状况 | 说明 |
---|---|---|---|
1 | 1.1 代码符合需求和规格说明么? | 是[√] 否[] | |
2 | 1.2 代码设计是否考虑周全? | 是[√] 否[] | |
3 | 1.3 代码可读性如何? | 是[√] 否[] | |
4 | 1.4 代码容易维护么? | 是[√] 否[] | |
5 | 1.5 代码的每一行都执行并检查过了吗? | 是[√] 否[] | |
6 | 2.1 设计是否遵从已知的设计模式或项目中常用的格式? | 是[√] 否[] | |
7 | 2.2 有没有硬编码或字符串/ 数字等存在? | 是[] 否[√] | |
8 | 2.3 代码有没有依赖于某一平台,是否会影响将来的移植?(如Win32到Win64) | 是[] 否[√] | |
9 | 2.4 开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现? | 是[] 否[√] | |
10 | 2.5 有没有无用的代码可以清除? | 是[√] 否[] | |
11 | 3.1 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? | 是[√] 否[] | |
12 | 3.2 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数? | 是[] 否[√] | |
13 | 3.3 边界条件是如何处理的?switch语句的default分支是如何处理的?循环有没有可能出现死循环? | 是[] 否[√] | |
14 | 3.4 有没有使用断言(Assert)来保证我们认为不变的条件真的得到满足? | 是[] 否[√] | |
15 | 3.5 对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄漏(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有优化的空间? | 是[] 否[√] | |
16 | 3.6 数据结构中有没有用不到的元素? | 是[] 否[√] | |
17 | 4.1 代码的效能(Performance)如何?最坏的情况是怎样的? | 是[√] 否[] | |
18 | 4.2 代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中string的操作是否能用StringBuilder来优化)? | 是[] 否[√] | |
19 | 4.3 对于系统和网络的调用是否会超时?如何处理? | 是[] 否[√] | |
20 | 5.1 代码可读性如何? | 是[√] 否[] | |
21 | 5.2 有没有足够的注释? | 是[√] 否[] | |
22 | 6.1 代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程等),可以整理专门的核查表。 | 是[√] 否[] |