关闭

spring boot第四节 拦截器

332人阅读 评论(0) 收藏 举报

     Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。

HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。

配置拦截器也很简单,Spring 为什么提供了基础类WebMvcConfigurerAdapter ,我们只需要重写 addInterceptors 方法添加注册拦截器。

实现自定义拦截器只需要3步: 
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。 
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。 
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。 

一、创建第一个拦截器

    

package org.springboot.sample.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定义拦截器1
 *
 */
public class MyInterceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println(">>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");

        return true;// 只有返回true才会继续向下执行,返回false取消当前请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println(">>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println(">>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
    }

}
二、创建第二个拦截器

package org.springboot.sample.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定义拦截器2
 *
 */
public class MyInterceptor2 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println(">>>MyInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");

        return true;// 只有返回true才会继续向下执行,返回false取消当前请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println(">>>MyInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println(">>>MyInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
    }

}

三、创建类继承WebMvcConfigurerAdapter,并把定义好的拦截器加入拦截器链

package org.springboot.sample.config;

import org.springboot.sample.interceptor.MyInterceptor1;
import org.springboot.sample.interceptor.MyInterceptor2;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MyWebAppConfigurer 
        extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多个拦截器组成一个拦截器链
        // addPathPatterns 用于添加拦截规则
        // excludePathPatterns 用户排除拦截
        registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
        registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

}

访问http://localhost:8080/index


最后强调一点:只有经过DispatcherServlet 的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的,比如我们自定义的Servlet地址http://localhost:8080/xs/myservlet 是不会被拦截器拦截的。并且不管是属于哪个Servlet 只要复合过滤器的过滤规则,过滤器都会拦截。

最后说明下,我们上面用到的 WebMvcConfigurerAdapter 并非只是注册添加拦截器使用,他还有很多其他作用。


0
0
查看评论

Spring boot配置拦截器

虽然Spring还用得不怎么熟,最近就开始折腾Spring boot 了,还是那句话,废话少说,直接上码吧:package com.jiaobuchong.springboot.interceptor;import org.slf4j.Logger; import org.slf4j.LoggerF...
  • jiaobuchong
  • jiaobuchong
  • 2015-12-24 14:52
  • 17114

Spring Boot配置拦截器

SpringBoot拦截器 最近项目中有一个需求,对来访的请求,进行计算,记录下业务处理时间。Spring Boot项目中使用拦截器,超级简单,再次说明一下用法。相信大家一看便懂。 1.继承 HandlerInterceptor 实现具体的处理逻辑public interface Handler...
  • Message_lx
  • Message_lx
  • 2017-02-23 15:56
  • 2217

Spring boot之拦截器的实现

场景:由于用Spring boot编写了关于Ranger策略以及Hive脱敏相关的接口,并以http方式向外部提供。为了防止请求被非法模仿,因而编写了一个访问Ip 鉴权类,也就是设置了访问ip白名单,只有在白名单上的ip才可以访问接口。 Spring boot自带HandlerInterceptor...
  • u013850277
  • u013850277
  • 2017-09-09 00:20
  • 702

22. Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

上一篇对过滤器的定义做了说明,也比较简单。过滤器属于Servlet范畴的API,与Spring 没什么关系。      Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的Handl...
  • linxingliang
  • linxingliang
  • 2016-07-29 23:48
  • 23222

Spring Boot 拦截器

上一篇对过滤器的定义做了说明,也比较简单。过滤器属于Servlet范畴的API,与Spring 没什么关系。 Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。HandlerInterceptor 的功能跟过滤...
  • catoop
  • catoop
  • 2016-01-12 09:21
  • 83285

Spring Boot (教程八: 过滤器、监听器、拦截器)

GitHub 地址:https://github.com/asd821300801/Spring-Boot.git Spring Boot (教程八: 过滤器、监听器、拦截器)
  • gfd54gd5f46
  • gfd54gd5f46
  • 2017-07-12 16:09
  • 1707

Spring Boot 过滤器、监听器和拦截器使用

1、过滤器和监听器 Spring Boot中对于过滤器和监听器的使用跟一般web工程中使用方式没什么不同,使用注解方式就可以快速创建,只是要使用注解方式需要在Application类加上 @ServletComponentScan 注解表明开启servlet的注解 创建一个监听器@WebList...
  • u012809062
  • u012809062
  • 2017-06-08 17:49
  • 2700

记一次springboot拦截器失效的调试

最近有一次调试时发现,系统配置的拦截器失效,最开始以为是所有的url路径均不好使,后边调试发现是有些url路径好使,有些url路径不好使,最后查看配置的拦截url路径,才发现url配置有问题,原来的配置是以单个星号(*)结尾,原来这才是问题根源: 单个星号只能拦截/后边一级的url路径,如果是/*后...
  • nihaoma71121
  • nihaoma71121
  • 2017-08-14 20:21
  • 626

SpringBoot学习笔记(六):配置拦截器,控制登录跳转

总共分2步: 配置自己的拦截器; 在web的配置文件中,实例化上面的拦截器,并添加规则; 拦截器代码:MyInterceptor.java public class MyInterceptor implements HandlerInterceptor { Logger logger = L...
  • Jalon2015
  • Jalon2015
  • 2017-05-08 16:11
  • 7865

spring boot 使用spring AOP实现拦截器

在spring boot中,简单几步,使用spring AOP实现一个拦截器。
  • ClementAD
  • ClementAD
  • 2016-07-26 14:08
  • 37905
    个人资料
    • 访问:14645次
    • 积分:251
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:17篇
    • 译文:0篇
    • 评论:0条
    文章分类