• SpringBoot之HandlerInterceptor拦截器的使用


    HandlerInterceptor简介

    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action 执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。

    1、定义实现类

    定义一个Interceptor 非常简单方式也有几种,我这里简单列举两种
    1、类要实现Spring 的HandlerInterceptor 接口
    2、类继承实现了HandlerInterceptor 接口的类,例如 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter
    我这里使用第一种方式

    2、HandlerInterceptor方法介绍

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
    1. preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
    2. postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView (这个博主就基本不怎么用了);
    3. afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面)

    接下来让我们来实现简单的登录拦截器吧

    3、拦截器实现

    • 新建 LoginInterceptor 实现  HandlerInterceptor接口
    public class LoginInterceptor implements HandlerInterceptor {
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    			throws Exception {
    		Object obj = request.getSession().getAttribute("loginUser");//(你的用户信息session)
    		// 如果user不为空则放行
    		if (null != obj) {
    			return true;
    		}
    		// 否则拦截并跳转到登录
    		response.sendRedirect("/admin/login");
    		return false;
    	}
    
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    			ModelAndView modelAndView) throws Exception {
    	}
    
    	@Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    			throws Exception {
    	}
    
    • 新建WebAppConfigurer 实现WebMvcConfigurer接口
    public class WebAppConfigurer implements WebMvcConfigurer {
    	@Autowired
    	private LoginInterceptor loginAuthenticator;
    
    	/**
    	 * 注册拦截器
    	 */
    	@Override
    	public void addInterceptors(InterceptorRegistry registry) {
    
    		registry.addInterceptor(loginAuthenticator).addPathPatterns("/admin/**")
                                    .excludePathPatterns("/admin/login")
    				.excludePathPatterns("/admin/getLogin");
        //  - /**: 匹配所有路径
        //  - /admin/**:匹配 /admin/ 下的所有路径
        //  - /admin/*:只匹配 /admin/login,不匹配 /secure/login/tologin ("/*"只匹配一级子目录,"/**"匹配所有子目录)
    }
         .......//其实下面还有很多方法我这里就省略了,过滤器可以添加多个。
    }
    

      

    其实以前都是继承WebMvcConfigurerAdapter类 不过springBoot2.0以上 WebMvcConfigurerAdapter 方法过时,有两种替代方案:
    1、继承WebMvcConfigurationSupport
    2、实现WebMvcConfigurer
    但是继承WebMvcConfigurationSupport会让Spring-boot对mvc的自动配置失效。根据项目情况选择。现在大多数项目是前后端分离,并没有对静态资源有自动配置的需求所以继承WebMvcConfigurationSupport也未尝不可。

  • 相关阅读:
    laravel获取不到session
    laravel表单提交419错误
    'cross-env' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    centos 虚拟机出问题 Oh no,something has gone wrong! 解决方法
    fastadmin关闭验证码登录
    php二维数组排序
    不自动显示html表单记住的内容 自动完成等清除记忆
    两个服务器之间使用minio同步文件
    redis获取数据库个数
    html跳转页面
  • 原文地址:https://www.cnblogs.com/yuqingya/p/13359745.html
Copyright © 2020-2023  润新知