基于ActionKeyRegex正则表达式的日志拦截器

@Override
public void configInterceptor(Interceptors me) {
    //添加控制层全局拦截器
    me.addGlobalActionInterceptor(new AuthInterceptor());
    me.add(new TxByMethodRegex("(.*save.*|.*update.*)"));
    /*me.add(new TxByMethods("save", "update"));*/
    /*me.add(new TxByActionKeyRegex(".*trans.*|.*save.*"));*/
    /*me.add(new TxByActionKeys("/tx/save", "/tx/update"));*/
    //session拦截器,用于在View模板中取出session值
    me.addGlobalActionInterceptor(new SessionInViewInterceptor(true));
    //添加异常和日志拦截器
    me.addGlobalActionInterceptor(new ExceptionAndLogInterceptor(".*trans.*|.*save.*"));
}


public class ExceptionAndLogInterceptor extends com.jfinal.ext.interceptor.LogInterceptor {
    private Pattern pattern;
    public ExceptionAndLogInterceptor(String regex){
        this(regex,true);
    }

    public ExceptionAndLogInterceptor(String regex,boolean caseSensitive){
        if(StrKit.isBlank(regex)) {
            throw new IllegalArgumentException("regex can not be blank.");
        } else {
            this.pattern = caseSensitive?Pattern.compile(regex):Pattern.compile(regex, 2);
        }
    }
    public void intercept(Invocation invocation){
        Controller controller = invocation.getController();
        HttpServletRequest request = controller.getRequest();
        invocation.invoke();
        if(this.pattern.matcher(invocation.getActionKey()).matches()) {
            TUser user = controller.getSessionAttr("user");
            LogKit.info("当前用户:"+user.getUsername());
            TLog log = new TLog();
            log.setId(StrKit.getRandomUUID());
            log.setActionkey(invocation.getActionKey());
            log.setOpertime(DateKit.toStr(new Date(),DateKit.timeFormat));
            log.setUserid(user.getId());
            log.setUsername(user.getUsername());
            log.setIp(ConvertKit.getRemoteHost(request));
            log.setParams(JFinalJson.getJson().toJson(request.getParameterMap()));
            log.setResult(JFinalJson.getJson().toJson(controller.getRender()));
            log.save();
        }
    }
}


评论区

JFinal

2017-06-15 22:49

对重要方法使用拦截器利用正则做日志,可以起到很好的回溯作用,尤其在业务出现不一致时方便追溯,感谢你的分享

controller 与 request 的获取建议放在 if 分支里头,可节省点时空

linkzz

2017-06-16 08:59

@JFinal 好的 谢谢波总指点!!!

热门分享

扫码入社