• java学习day62-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);
    }
    
  • 相关阅读:
    sqhhb
    12333
    12

    今日份
    12
    彻底理解 Cookie、Session、Token
    https原理
    12312
    uiower
  • 原文地址:https://www.cnblogs.com/liqbk/p/13388412.html
Copyright © 2020-2023  润新知