sping-拦截器的使用

一、目的
(1) 掌握拦截器的工作原理
(2) 掌握 Spring MVC 框架中拦截器的使用方法
二、内容
(1) 开发简单自定义拦截器
(2) 多个拦截器的使用
(3) 用拦截器实现用户登录验证功能。(如用户未登录,跳转到登录页面)
三、步骤
在这里插入图片描述

1.pom.xml
增加parent、web、tomcat、jstl、jasper、servlet、devtools
2.单个拦截器

Interceptor.java

public class Interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req,HttpServletResponse res,Object handler)throws Exception {
	System.out.println("前");
	return true;
	//true表示不会拦截
}
@Override
public void postHandle(HttpServletRequest req,HttpServletResponse res,Object handler,ModelAndView mv)throws Exception{
	System.out.println("后");
	
}
@Override
public void afterCompletion(HttpServletRequest req,HttpServletResponse res,Object handler,Exception ex)throws Exception{
	System.out.println("完成时");
}
}

InterceptorController.java


@Controller
@RequestMapping("/interceptor")
public class InterceptorController {
@RequestMapping("/start")
public String start() {
	System.out.println("执行处理器逻辑");
	return "/welcome";
	
}
}

App.java

@Configuration
@SpringBootApplication(scanBasePackages="fuxi.chap4")
public class App implements WebMvcConfigurer{

	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
	InterceptorRegistration ir=registry.addInterceptor(new Interceptor1());
	ir.addPathPatterns("/interceptor/*");

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>深入Spring MVC</title>
</head>
<body>
 <h1><%
 System.out.println("视图渲染");
 out.print("欢迎学习Spring Boot MVC章节\n");
 %></h1>
</body>
</html>

application.properties

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

在这里插入图片描述
控制台会输出
在这里插入图片描述
变更Interceptor中的true、false,可以观察到被拦截的情况。
3.多个拦截器
MulitiInterceptor1

public class MulitiInterceptor1 implements HandlerInterceptor {
	@Override
	 public boolean preHandle(HttpServletRequest request, 
	 HttpServletResponse response, Object handler)
	 throws Exception {
	 System.out.println("【" + this.getClass().getSimpleName()
	 +"】处理器前方法");
	 // 返回 true,不会拦截后续的处理
	 return true;
	 }
	 @Override
	 public void postHandle(HttpServletRequest request, 
	 HttpServletResponse response, Object handler,
	 ModelAndView modelAndView) throws Exception {
	 System.out.println("【" + this.getClass().getSimpleName()

+"】处理器后方法");
}
@Override
public void afterCompletion(HttpServletRequest request, 
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("【" + this.getClass().getSimpleName()
+"】处理器完成方法");
}
}

MulitInterceptor2、3和1具体内容一样
App.java

@Configuration
@SpringBootApplication(scanBasePackages="fuxi.chap4")
public class Fuxichap4Application implements WebMvcConfigurer{

	public static void main(String[] args) {
		SpringApplication.run(Fuxichap4Application.class, args);
	}
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
//		InterceptorRegistration ir=registry.addInterceptor(new Interceptor1());
//		ir.addPathPatterns("/interceptor/*");
		InterceptorRegistration ir1 = registry.addInterceptor(new
				MulitiInterceptor1());
		ir1.addPathPatterns("/interceptor/*");
		InterceptorRegistration ir2= registry.addInterceptor(new
				MulitiInterceptor2());
		ir2.addPathPatterns("/interceptor/*");
		InterceptorRegistration ir3 = registry.addInterceptor(new
				MulitiInterceptor3());
		ir3.addPathPatterns("/interceptor/*");
	}

}

当三个MulitiInterceptor都是true时
在这里插入图片描述
在这里插入图片描述
当2为false时
在这里插入图片描述
处理器(preHandle)方法会执行,但是一旦返回 false,则后续的拦截器、处理器和所
有拦截器的处理器后(postHandle)方法都不会被执行。完成方法 afterCompletion 则不一样,它只会 执行放回 true 的拦截器的完成方法,而且顺序是先注册后执行。

项目源码
https://download.csdn.net/download/weixin_52644704/51802891

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值