62-springboot中的拦截

控制层访问拦截实现

需求:

项目业务要求系统登陆操作要有时间限制。

初步分析

​ 对于类似需求的实现,可采用过滤器,SpringMVC拦截器,AOP等进行实现。对于过滤器而言一般主要应用在项目中共性的过滤,AOP需要依托于动态代理以及切面对象性能方面相对较差,所以最终选择使用Spring MVC拦截器进行实现。

原理应用分析

​ Spring MVC中的拦截器基于回调机制,可以在目标方法执行之前,先进行业务检测,满足条件则放行,不满足条件则进行拦截

拦截器原理

1595859367585

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");
		
	}
}

基于项目中的拦截层次

1595860291873

数据层的拦截,比如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);
}

posted on 2020-07-27 23:29  liqiangbk  阅读(261)  评论(0编辑  收藏  举报

导航