乐趣区

关于后端:控制层访问拦截

在管制层进行拜访拦挡也是咱们在我的项目中常会遇到的需要, 例如: 我的项目中要求零碎登录操作有工夫限度 –12306 购票工夫的限度等.

对于这类需要咱们个别有几种抉择:

  1. 过滤器 Filter
  2. AOP
  3. SpringMVC 拦截器 …

本文咱们次要说一下 SpringMVC 拦截器的实现

原理

Spring MVC 的拦截器是基于回调机制, 能够在指标办法执行之前 / 之后, 做一些解决.

如下图所示:

客户端的申请通过前端控制器会被 HandleInterceptor 拦截器拦挡, 会依据拦截器的办法 (preHandle/postHandle), 别离在 Controller 层的指标办法之前或之后只写一些业务.

实现

咱们要实现的是登录前的拦挡, 而后进行工夫断定 – 所以咱们须要用 preHandle 办法, 能够在指标办法执行之前, 先进行业务检测, 满足条件则放行, 不满足条件则进行拦挡

具体实现分为两步:

  1. 定义拦截器:
public class TimeAccessInterceptor implements HandlerInterceptor{
    /** 此办法会在你的指标 Controller 执行之前执行 */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {System.out.println("==preHandler==");
        LocalDateTime now = LocalDateTime.now();//JDK8 的新个性
        int hour = now.getHour();
        System.out.println("hour:"+hour);
        if(hour<9||hour>19)
            throw new ServiceException("不在拜访工夫:9~14");//return false
        return true;//true 示意放行,false 示意申请到此结束
    }
}

咱们本人创立一个类并且实现 HandlerInterceptor 拦截器接口, 而后依据你的业务需要实现办法, 咱们这里实现的是 preHandle 办法用于在 controller 执行之前执行, 通过 JDK8 的新个性 –LocalDateTime.now() 来获取以后工夫, 能够再通过 now.getHoure() 等办法来获取具体的小时 / 分钟 / 秒等. 在判断是否在咱们禁止登陆的工夫范畴内, 如果是则抛出异样 (这里 ServiceException 是咱们本人定义的异样类), 抛出异样 ==return false, 返回值 return true 示意放行,false 示意拦挡完结.

  1. 对拦截器进行配置
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
    /**
     * 注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TimeAccessInterceptor())
        .addPathPatterns("/user/doLogin");
    }
}

创立一个 SpringWebConfig 类并且实现 WebMvcConfigurer 接口, 类由 @Configuration 注解形容, 示意是一个配置类, 重写实现类中的 addInterceptors 办法, 参数 InterceptorRegistry registry 拦截器汇合, 调用 addInterceptor(new TimeAccessInterceptor()) 向其中增加咱们定义的拦截器类, 在调用 addPathPatterns(“/user/doLogin”), 增加要拦挡的门路,() 内就是咱们登陆的门路.

退出移动版