控制层访问拦截实现
需求:
项目业务要求系统登陆操作要有时间限制。
初步分析
对于类似需求的实现,可采用过滤器,SpringMVC拦截器,AOP等进行实现。对于过滤器而言一般主要应用在项目中共性的过滤,AOP需要依托于动态代理以及切面对象性能方面相对较差,所以最终选择使用Spring MVC拦截器进行实现。
原理应用分析
Spring MVC中的拦截器基于回调机制,可以在目标方法执行之前,先进行业务检测,满足条件则放行,不满足条件则进行拦截
拦截器原理
springboot中方案实现
第一步:拦截器定义
package com.cy.pj.common.web;
public class TimeAccessInterceptor implements HandlerInterceptor {
/**
* 此方法会在目标controller方法之前执行
* return 此返回值决定请求是否放行
返回true表示放行,返回false则表示拦截(也可以抛出异常)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取日历对象
//LoaclDateTime
LocalDateTime now = LocalDateTime.now();
int hour = now.getHour();
// Calendar calendar = Calendar.getInstance();
// int hour = calendar.get(Calendar.HOUR_OF_DAY);
if (hour>23 || hour<7) {
throw new ServiceException("请在7:00-23:00之间登录");
}
return true;
}
}
第二步:拦截器配置
package com.cy.pj.common.config;
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
//springmvc拦截器配置
@Override
public void addInterceptors(InterceptorRegistry registry) {
//设置拦截的路径
registry.addInterceptor(new TimeAccessInterceptor()).addPathPatterns("/user/doLogin");
}
}
基于项目中的拦截层次
数据层的拦截,比如mybatis的分页插件实现,就是这个数据层的拦截
实现步骤
第一步:导入mybatis的分页插件的依赖
<!-- 添加pageHelper依赖,可以去mvnrepository.org地址去查找-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
第二步:修改Dao层的分页查询的方法,以及mapper配置文件
List<SysLog> findPageObjects(String username);//使用该插件,分页查询主要在业务层,所有数据层不需要分页,包括mapper文件
mapper文件
<!-- 查询当前页记录总数 -->
<select id="findPageObjects"
resultType="com.cy.pj.sys.pojo.SysLog">
select *
from sys_logs
<if test="username!=null and username!=''">
<where>
username like concat("%",#{username},"%")
</where>
</if>
order by createdTime desc
</select>
第三步:在业务层使用pageHelper插件进行分页查询
@Override
public PageObject<SysLog> findPageObjects(String username, Integer pageCurrent) {
//1.参数校验。
if(pageCurrent==null||pageCurrent<1)
throw new IllegalArgumentException("页码值无效");
//2.基于用户名查询总记录数并校验。
//3.基于pageCurrent查询当前页记录。
int pageSize=3;//每页最多显示多少条记录
Page<SysLog> page=PageHelper.startPage(pageCurrent, pageSize);
List<SysLog> records=sysLogDao.findPageObjects(username);
//4.对查询结果进行封装并返回。
//return new PageObject<>((int)page.getTotal(), pageSize, pageCurrent, records);
return new PageObject<>((int)page.getTotal(),page.getPages(), pageSize, pageCurrent, records);
}