发表于: 2020-02-19 23:59:43

4 1116


今天完成的事:
1、日志配置。
springboot默认使用 SLF4j+logback 。
查看日志基础知识。
默认情况下,springboot的日志只会输出到控制台,但是在application.yml配置文件中可以配置,但是只能配置简单的场景,复杂些的(如区分iofo、error的日志,每天产生一个日志等)场景不能够满足,只能自定义配置,也就是添加xml日志配置文件。
这里需要注意,xml配置文件的名称有要求,可以命名为logback-spring.xml,这样会在加载application.yml文件时,自动加载该文件。

如果只是使用简单配置,也就是application.yml配置文件,那么项目只会识别 logging.file 属性,不会识别 logging.path 属性,然而实际上使用 logging.file 属性即可指定日志位置、名称。

另外有说默认情况下,日志文件大小会在到达10MB时,切分一次,暂且不知真假。

原本我是倾向于每天生成一次日志,且日志不可覆盖之前的日志,但是因为更改默认日志,有点麻烦,再加上默认日志也能用,就先这样了。

具体配置如下,其中日志格式的“.SSS”代表毫秒,不可省略。其他相应解释在下图。

2、使用aop记录方法使用时间。

如下图,在spring中,即使是使用注解的方式,也需要在配置文件中添加配置,springboot就方便多了,添加如下,开启aop注解,但是因为默认是开启的,其实也可以不加。

aop工具类
添加切面是controller、service包下的所有子包、类、方法。调用方法的话,就会记录方法类名、方法名、入参参数,而后返回所用时间、结果。
package com.dxz.home.utils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Aspect
@Component
public class LogAspect {
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    @Pointcut("execution(public * com.dxz.home.controller.*.*(..))")
    public void controllerMethod() {}
    @Pointcut("execution(public * com.dxz.home.service.*.*(..))")
    public void serviceMethod() {}
    @Around("controllerMethod() || serviceMethod()")
    public Object arround(ProceedingJoinPoint point) throws Throwable {
        // 请求的类名
        String className = point.getTarget().getClass().getName();
        // 请求的方法名
        String methodName = point.getSignature().getName();
        // 请求的方法参数值
        String args = Arrays.toString(point.getArgs());
        log.info("环绕前==类名:{},方法名:{},参数:{}", className, methodName, args);
        long beginTime = System.currentTimeMillis();
        Object result = point.proceed();
        long endTime = System.currentTimeMillis();
        long time = endTime-beginTime;
        log.info("环绕后==方法名:{},执行时间:{} ms,返回结果:{}", methodName, time, result.toString());
        return result;
    }
}
3、优化缓存。
也就是稍微修改了下,后面压测的话,再根据具体接口进行优化吧。

使用list方法,修改获取权限的方法结果为list集合。

查询后将权限存储。

这里仅仅是在进行url拦截时进行权限验证,减少查询次数。

4、数字类型校验,无果。

因为前端有说限制用户在进行范围查询时,校验输入的必须是数字,如果这是输入字母,就会报参数格式异常。

百度搜索,都说是用正则表达式进行校验,但是那样就需要将入参参数改为string类型,校验后转换为long,再进行相应操作,因为是在输入时就需要校验,否则在会报数据类型异常错误,所以只能是入参参数改为string,不可以入参为long,转换类型再正则校验。

因为需要转换,所以我想直接用 @Min 注解,要求是必须是数字,而且要大于规定数字,原本是以为这注解也可以校验参数类型,当输入string时,也会返回“积分应为数字”的校验信息,但是实际上不是,当输入string时,是直接返回类型错误异常。。所以这里就只能使用正则校验。。

但是如果这样的话,那所有的数字类型的参数都需要进行校验了,比如下图的年级,这不就很麻烦了吗,这样的话都是用string类型得了,还用什么long、int的。。
所以这里,就让前端校验吧。。
5、修改前台拦截器逻辑。
前台拦截器,需要拦截判断用户状态是否冻结。
现在添加了一个分支,当session中没有userId时,说明没有登录,就重定向到未登录接口。

拦截器配置中,添加白名单。

重定向的接口,返回相应结果。

明天计划的事:
1、压测
遇到的问题:
1、入参的数字参数,校验必须为数字类型,都说是用正则表达式进行校验,但是那样就需要将入参参数改为string类型,校验后转换为long,再进行相应操作。
但是如果这样的话,那所有的数字类型的参数都需要进行校验了,这不就很麻烦了吗,这样的话都是用string类型得了,还用什么long、int的。。
所以这里,就让前端校验吧。。

2、方法的响应时间,之前都是用aop来实现环绕通知,进而记录响应时间,但是其实是用拦截器也可以记录controller中接口的响应时间,常规的做法是什么?

3、获取logger的代码比较繁琐,且每个类都需要添加,下图所说可使用lombok,即可用@Slf4j代替getlogger。

但是idea需要安装插件,那这样的话,发布到线上怎么办?
暂未验证。

收获:
1、日志配置。
2、使用aop记录方法使用时间。
3、优化缓存。
4、数字类型校验,无果。
5、修改前台拦截器逻辑。

返回列表 返回列表
评论

    分享到