前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 拦截器 学习

Spring 拦截器 学习

作者头像
北漂的我
发布2019-05-28 20:09:27
5710
发布2019-05-28 20:09:27
举报
文章被收录于专栏:北漂的我北漂的我

拦截器, 技术java反射技术, 不依赖Spring容器, 可以使用 Spring 容器管理的bean.

客户端发起请求到 DispatcherServlet , 然后根据 HandlerMapping 匹配处理器, 返回一个 HandlerExecution 对象, 包含 处理器 和 拦截器, 这里的拦截器会对处理器进行拦截, 通过拦截器可以增强处理器的功能.

1. 创建拦截器, 实现 HandlerInterceptor 接口

代码语言:javascript
复制
package com.codingos.springboot.test.interceptor;

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

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

public class Interceptor1 implements HandlerInterceptor {

	/**
	 * 在 controller 方法之前执行, 返回false则结束, 返回true则继续下一步.
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("****** 处理器前方法 *******");
		return true;
//		request.getRequestDispatcher("/file/uploadPage").forward(request, response);
//		return false;
	}
	/**
	 * 在处理器方法之后, 视图渲染之前执行.
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("****** 处理器后方法 *******");
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}
	/**
	 * 在视图渲染之后执行
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("****** 处理器完成后方法 *******");
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}
}
代码语言:javascript
复制
package com.codingos.springboot.test.interceptor;

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

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

public class MultiInterceptor1 implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println(this.getClass().getName() + "处理器前方法");
		return true;
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println(this.getClass().getName() + "处理器后方法");
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println(this.getClass().getName() + "处理器完成后方法");
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}
}

2. 注册拦截器, springboot 主类 实现 WebMvcConfigurer

代码语言:javascript
复制
@SpringBootApplication
public class SpringBootTestApplication implements WebMvcConfigurer{
	
	/**
	 * 注册拦截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
//		registry.addInterceptor(new Interceptor1()).addPathPatterns("/interceptor/*");
		registry.addInterceptor(new MultiInterceptor1()).addPathPatterns("/interceptor/*");
		registry.addInterceptor(new MultiInterceptor2()).addPathPatterns("/interceptor/*");
		registry.addInterceptor(new MultiInterceptor3()).addPathPatterns("/interceptor/*");
	}

	public static void main(String[] args) {
		SpringApplication.run(SpringBootTestApplication.class, args);
	}
}

3. 多个拦截器的顺序

代码语言:javascript
复制
com.codingos.springboot.test.interceptor.MultiInterceptor1处理器前方法
com.codingos.springboot.test.interceptor.MultiInterceptor2处理器前方法
com.codingos.springboot.test.interceptor.MultiInterceptor3处理器前方法
执行处理器逻辑
com.codingos.springboot.test.interceptor.MultiInterceptor3处理器后方法
com.codingos.springboot.test.interceptor.MultiInterceptor2处理器后方法
com.codingos.springboot.test.interceptor.MultiInterceptor1处理器后方法
视图渲染
com.codingos.springboot.test.interceptor.MultiInterceptor3处理器完成后方法
com.codingos.springboot.test.interceptor.MultiInterceptor2处理器完成后方法
com.codingos.springboot.test.interceptor.MultiInterceptor1处理器完成后方法
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档