系统分析小组作业

系统分析小组作业

第六周

针对本小组项目,选一段已编写的代码,回答如下问题:

  1. 代码规范采用什么方式?
  2. 运用“代码复审核查表”,回顾本小组项目这段代码
@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评审项目执行状况说明
11.1 代码符合需求和规格说明么?是[√] 否[]
21.2 代码设计是否考虑周全?是[√] 否[]
31.3 代码可读性如何?是[√] 否[]
41.4 代码容易维护么?是[√] 否[]
51.5 代码的每一行都执行并检查过了吗?是[√] 否[]
62.1 设计是否遵从已知的设计模式或项目中常用的格式?是[√] 否[]
72.2 有没有硬编码或字符串/ 数字等存在?是[] 否[√]
82.3 代码有没有依赖于某一平台,是否会影响将来的移植?(如Win32到Win64)是[] 否[√]
92.4 开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?是[] 否[√]
102.5 有没有无用的代码可以清除?是[√] 否[]
113.1 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?是[√] 否[]
123.2 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?是[] 否[√]
133.3 边界条件是如何处理的?switch语句的default分支是如何处理的?循环有没有可能出现死循环?是[] 否[√]
143.4 有没有使用断言(Assert)来保证我们认为不变的条件真的得到满足?是[] 否[√]
153.5 对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄漏(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有优化的空间?是[] 否[√]
163.6 数据结构中有没有用不到的元素?是[] 否[√]
174.1 代码的效能(Performance)如何?最坏的情况是怎样的?是[√] 否[]
184.2 代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中string的操作是否能用StringBuilder来优化)?是[] 否[√]
194.3 对于系统和网络的调用是否会超时?如何处理?是[] 否[√]
205.1 代码可读性如何?是[√] 否[]
215.2 有没有足够的注释?是[√] 否[]
226.1 代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程等),可以整理专门的核查表。是[√] 否[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值