首页 > 其他分享 >拦截器

拦截器

时间:2023-04-01 10:14:55浏览次数:23  
标签:拦截器 void registry addInterceptor 拦截 public

拦截器

  • 拦截器是一种动态拦截方法调用的机制
  • 作用
    • 在指定的方法调用前后预先执行设定后的代码
    • 阻止原始方法的执行

拦截器与过滤器的区别

  • 归属不同:Filter属于servlet技术,Interceptor属于SpringMVC技术
  • 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

实现拦截器(配置类)

  • 1.声明拦截器的bean,并实现HandlerInterceptor接口(注意:扫描加载bean)
@Component
public class ProjectInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }
    @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");
    }
}


preHandle:适配器适配之后,处理器方法执行之前调用,如果返回值为true,则继续调用处理器方法,执行后续操作,如果范围false,则表示被拦截,处理器方法以及后续的操作将不再执行
postHandle:在处理器方法执行之后调用
afterCompletion:视图渲染之后才会被调用
  • 2.定义配置类,继承,实现方法(注意:扫描加载配置)

在SpringMVCConfig中扫描

@Configuration
@EnableWebMvc
@ComponentScan({"com.cmq.controller","com.cmq.config"})
public class SpringMVCConfig {

}
  • 3.添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个

/*设置对静态资源的访问放行*/
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages");
    }
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/users","/users/*");
    }
}
  • 4.使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)
@Configuration
@EnableWebMvc
@ComponentScan("com.cmq.controller")
public class SpringMVCConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;

     protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/users","/books/*");
    }
    }

拦截器(Interceptor)的配置

在自定拦截器完成后,就是在Spring MVC 中配置拦截器(Interceptor)了,可以通过Java配置类的方式进行配置,也可以通过xml文件的方式进行配置。

一、Java配置类的方式

  • @EnableWebMvc : 表示启用Spring MVC的功能
  • @Configuration: 表示该类是Spring 中的配置类
  • 拦截的配置需要重写WebMvcConfigurer 的addInterceptors(InterceptorRegistry registry) 方法,通过registry进行添加(默认拦截所有)
  • 可以通过addPathPatterns来表示拦截哪些请求
  • 可以通过excludePathPatterns不拦截哪些请求

对于URI匹配模式:

  • ?:匹配一个字符
  • *:匹配路径段中的零个或者多个字符
  • **:匹配零个或者多个路径段
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(new MyInterceptor())
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
}

二、xml文件的方式

<mvc:interceptors>
	<bean class="com.example.web.interceptor.MyInterceptor"/>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

流程

image

只考虑preHandle为true的情况
image

标签:拦截器,void,registry,addInterceptor,拦截,public
From: https://www.cnblogs.com/CenCen/p/17275832.html

相关文章

  • uni.request拦截器
    uni.requset1uni.request({2url:'',//地址3data:{},//请求body4header:{},//请求header5method:'',//请求方式'GET'/'POST'/'PUT'/'DELETE'6success:(res)=>{},//请求成功回调7fail:......
  • java中拦截器的使用
    实现类packagecn.com.yusys.yusp.mcp.interceptor;importcn.com.yusys.yusp.commons.session.context.UserContext;importcn.com.yusys.yusp.commons.session.user......
  • 【SpringMVC-03】拦截器+类型转换器+数据校验以及异常映射,文件上传和下载
    第一章拦截器(重点)1.概念1.1使用场景1.1.1生活中坐地铁的场景为了提高乘车效率,在乘客进入站台前统一检票:1.1.2程序中的校验登录场景在程序中,使用拦截器在请求到达具体......
  • SpringMVC拦截器
    当存在多个Interceptor时,拦截顺序是根据spring-mvc.xml中的拦截器配置顺序来的:  拦截器中定义的三个方法:preHandle(req,res,obj):在目标方法执行前执行postHandle(......
  • 过滤器与拦截器
    1.过滤器跟拦截器的区别在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大。其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~你应该知道sp......
  • Spring MVC拦截器+注解方式实现防止表单重复提交
    原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。注,如果是集群的方式,则需要将tok......
  • JSP显示拦截器的ActionContext内容
    拦截器有:atx.put("login_message","请登陆,再使用系统.");jsp显示message用:Errors:${login_message}。......
  • 过滤器和拦截器
    介绍过滤器和拦截器都是基于AOP面向切面编程思想实现的,用来解决项目中某一类问题的两种“工具”。   过滤器与拦截器的区别 过滤器关注的是web请求,对所有访问进......
  • 【SpringMVC整合MyBatis】springmvc拦截器-定义和配置
    拦截器1.拦截定义定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。packagecn.edu.hpu.ssm.interceptor;importjavax.servlet.http......
  • SpringCloud微服务实战——搭建企业级开发框架(五十一):微服务安全加固—自定义Gateway拦
      SQL注入是常见的系统安全问题之一,用户通过特定方式向系统发送SQL脚本,可直接自定义操作系统数据库,如果系统没有对SQL注入进行拦截,那么用户甚至可以直接对数据库进行增删......