微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[SpringMVC笔记] SpringMVC-16-拦截器入门

SpringMVC-16-拦截器入门

1、定义拦截器的 bean

拦截器(Interceptor)的代码和 aop 很相似,实现 handlerinterceptor 接口,重写其中的 preHandle,postHandle,afterCompletion 三个函数

  • preHandle 函数:执行在 Controller 方法之前,返回一个 boolean 值,返回 true 则放行,返回 false 则阻止且不再进行后续操作
  • postHandle 函数:执行在 Controller 方法之后,dispatcherServlet 进行视图的渲染之前,参数中有 modelAndView,可以对其进行操作
  • afterCompletion 函数:执行在 dispatcherServlet 进行视图的渲染之后

执行流程:preHandle函数 -> Controller方法 -> postHandle函数 -> dispatcherServlet渲染试图 -> afterCompletion函数

如果 preHandle函数返回 false,那么后续的操作都不会发生

@Component
public class ProjectInterceptor implements handlerinterceptor {
    // 模拟判断请求中是否包含代表已经登录的 cookie,是则放行,否则阻止
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...");
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("hasLogged") && cookie.getValue().equals("true")) {
                cookie.setMaxAge(60 * 60 * 24 * 7); // 若已登录,刷新 cookie 持续时间
                response.addCookie(cookie);
                return true;
            }
        }
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("<center>请先登录。<center/>");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
}

[补充]

  • postHandle 和 afterCompletion 方法中对 response 操作(比如添加 cookie)都不会带给客户端

2、定义配置类

拦截器的配置类和设置静态资源放行的配置类同样继承自 WebMvcConfigurationSupport,而且设置方法也很相似,要重写 addInterceptors 方法

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    // 自动装配拦截
    @Autowired 
    private ProjectInterceptor interceptor;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器,前为拦截器对象实例,后为需要拦截的路径
        registry.addInterceptor(interceptor).addpathPatterns("/books", "/books/*");
    }
}

3、使 SpringMVC 配置类能够扫描到拦截器和配置类

// 拦截器在 controller 包下,配置类在 config 包下
@Configuration
@ComponentScan({"com.mzz.controller", "com.mzz.config"})
@EnableWebMvc
public class SpringMvcConfig {
}

4、简化开发

SpringMVC 的核心配置类可以实现 WebMvcConfigurer 接口,再重写其中的 addInterceptors 方法,就不需要再单独定义拦截器的配置类,相当于合并了前面的第 2、3 步

同样的,处理放行静态资源的 addResourceHandlers 方法也在此接口中,可以一并重写,如下例

@Configuration
@ComponentScan({"com.mzz.controller"})
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor interceptor;
    // 添加拦截
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(interceptor).addpathPatterns("/books", "/books/*");
    }
    // 处理静态资源
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/page/**").addResourceLocations("/html/");
    }
}

然而这种形式侵入性较强,了解即可


部分资料参考自:https://www.cnblogs.com/yanze/p/11057102.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


谷歌翻译不能用了怎么办?最近有很多用户发现谷歌浏览器翻译功能不能使用了,这个该怎么解决呢,这里小编为大家提供两种解决方法。一种是通过修改操作系统的 hosts 文件,将 API 所使用的域名映射到一个可用的 IP 上
ios17有不少新功能,此次更新重点升级了电话和短信的功能,新增了联系人海报、音频消息转文字、check in等新功能,同时还带来了独立的手记功能“Journal”,可标记重要时刻,以及在待机中增加了“Standby”模式,可横
什么是IP地址?IP地址有什么用? 很简单,IP是整个TCP/IP协议族的核心,也是构成互联网的基础。
网上找到的动图下载到本地保存时格式却成了webp,想要发表情包却成了发短视频了,怎么解决这个问题呢?其实只需要将webp格式转为gif格式就好啦,下面小编带大家来看一下怎么转。
小米手机一开相机就死机怎么处理? 处理手机一开相机就死机的操作步骤:打开设置-应用程序-相机-清除数据试试;
充电宝押金什么时候可以退?具体操作充电宝退押金的操作步骤如下:1、打开微信里面的小程序进入街电小程序
学信网可以查到入团准确信息吗?学信网查不到入团时间。入团准确时间查询有以下方法:1、查看团员证。团员证上清楚的写着入团时间,只要找到团员证,马上就能查自己的入团时间了。
如果忽然遇到系统运行出现慢的问题,我们就会检查一下任务管理中是否有占用系统资源的进程在作怪,而在任务管理器中发现一个很占CPU使用率的程序-rundll32.exe,但是通过杀毒软件却没有任何用。
什么是bs机
OTG打开没反应怎么办