SpringMVC进阶-01

SpringMVC进阶-01

1.拦截器

public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 拦截器 拦截没有登录的用户
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        if (request.getSession().getAttribute("user") == null) {
            response.sendRedirect("/admin");
            return false;
        }
        return true;
    }
}

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/admin/**")
                .excludePathPatterns("/admin")
                .excludePathPatterns("/admin/login");
    }
}

2.异常处理

@Slf4j
@ControllerAdvice
public class ControllerExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView handlerException(HttpServletRequest request, Exception e) throws Exception {
        log.error("request url {}, error info {}", request.getRequestURL(), e);

        // 如果捕获到的异常上有ResponseStatus注解,说明是页面找不到的异常,这里直接抛出,
        // 交给springboot去处理,来返回error/404.html。
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
            throw e;
        }

        ModelAndView mv = new ModelAndView();
        mv.addObject("url", request.getRequestURL());
        mv.addObject("exception", e);
        mv.setViewName("error/error.html");
        return mv;
    }
}

3.方法访问日志记录

@Slf4j
@Aspect
@Component
public class LogAspect {

    @Pointcut("execution(* com.my.blog.controller.*.*(..))")
    public void log() {}

    @Before(value = "log()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        String url = request.getRequestURL().toString();
        String ip = request.getRemoteAddr();
        // 方法名 = 类全名 + 方法名
        String methodName = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        RequestInfo requestInfo = new RequestInfo(url, ip, methodName, args);
    }

    @After(value = "log()")
    public void doAfter() {
    }

    @AfterReturning(value = "log()", returning = "obj")
    public void afterReturning(Object obj) {
        log.info("response result {}", obj);
    }

    @ToString
    @AllArgsConstructor
    static class RequestInfo {
        private final String url;
        private final String ip;
        private final String methodName;
        /**
         * 方法参数
         */
        private final Object[] args;
    }
}

SpringMVC进阶-01

上一篇:牛逼!Python错误、异常和模块(长文系列第4篇)


下一篇:python基本运算