springmvc入门—springmvc的使用(3)interceptor拦截器

1. 过滤器&拦截器

  1. 过滤器Filter依赖Servlet容器的,基于回调函数,过滤范围广,不但可以对资源进行过滤还可以对请求进行过滤。
  2. 拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求。(即只对访问Controller的请求进行拦截)。

2. 编写index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> <a href="demo/test1" target="_blank">FIND1 no param</a> </h1>
<h1> <a href="back/test1" target="_blank">FIND1 no param</a> </h1>
</body>
</html>

3-1. 编写第一个拦截器MyInterceptor.java继承HandlerInterceptor

package com.hx.spring.mvc.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 MyInterceptor implements HandlerInterceptor{
	/**
	 * 该方法将在调用Controller之前执行,SpringMVC中的Interceptor拦截器是链式调用的,可以同时存在多个Interceptor
	 * 然后SpringMVC会根据声明的前后顺序,依次调用
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("执行了MyInterceptor中的preHandle方法。。");
		return true;	//若当前返回值为false,则链式调用中断,请求结束.
	}
	
	/**
	 * 当preHandle的返回值为true,然后调用了Controller之后,在DispatcherServlet进行视图渲染之前执行,
	 * 也就说这个方法中可以对ModelAndView中的内容进行操作
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("执行了MyInterceptor中的postHandle方法。。");
		System.out.println( modelAndView );
		modelAndView.setViewName("redirect:/back/find2.html");
	}
	
	/**
	 * 该方法只有在preHandle返回true是才会执行,该方法将在整个请求完成之后,即DispatcherServlet进行视图渲染之后执行,
	 * 一般用来释放资源,关闭流等
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("执行了MyInterceptor中的afterCompletion方法。。");
	}

}

3-2. 编写MyInterceptor2.java继承WebRequestInterceptor

package com.hx.spring.mvc.interceptor;

import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;

public class MyInterceptor2 implements WebRequestInterceptor{
	/**
	 * 在调用Controller之前执行,与HandleInterceptor中的preHandle()方法的区别在于,该方法返回void类型
	 * 故,不可中断请求,一般用于进行资源准备的工作
	 */
	@Override
	public void preHandle(WebRequest request) throws Exception {
		System.out.println("执行了MyInterceptor2的preHandle方法。。");
		request.setAttribute("company", "HUATHY", WebRequest.SCOPE_SESSION);
	}
	
	@Override
	public void postHandle(WebRequest request, ModelMap model) throws Exception {
		System.out.println("执行了MyInterceptor2的postHandle方法。。");
		for(String key : model.keySet()){
			System.out.println( key +"\t"+ model.get(key) );
		}
	}
	
	@Override
	public void afterCompletion(WebRequest request, Exception ex) throws Exception {
		System.out.println("执行了MyInterceptor2的afterCompletion方法。。");
	}
}

4-1. 编写控制器DemoController.java

package com.hx.spring.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller		//说明这是一个控制器,这个注解是通过<context:component-scan />来扫描的
/*
 * 可以出现在类或方法上,若出现在类上,则请求的url为 类上注解的 + 方法上@RequestMapping注解的地址。
 * 若类上的不写,则url就是方法上@RequestMapping注解的url地址
 */
@RequestMapping("/demo")
public class DemoController {
	
	@RequestMapping("/test1")
	public String test1(){
		System.out.println("进来了。。。");
		return "redirect:/back/find1.html";
	}
	
}

4-2. 编写控制器BackController.java

package com.hx.spring.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller		//说明这是一个控制器,这个注解是通过<context:component-scan />来扫描的
/*
 * 可以出现在类或方法上,若出现在类上,则请求的url为 类上注解的 + 方法上@RequestMapping注解的地址。
 * 若类上的不写,则url就是方法上@RequestMapping注解的url地址
 */
@RequestMapping("/back")
public class BackController {
	
	@RequestMapping("/test1")
	public ModelAndView test1(){
		System.out.println("进来了。。。");
		ModelAndView mav = new ModelAndView("/back/index2.jsp");
		mav.addObject("name", "HUATHY");
		return mav;
	}
	
}

5. 配置spirngmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- 配置注解扫描器 -->
	<context:component-scan base-package="com.hx.spring.mvc" />
	
	<!-- 放过静态资源 -->
	<mvc:default-servlet-handler />
	
	<!-- 启用mvc注解 , 扫描注解@RequestMapping、@ResponseBody...-->
	<mvc:annotation-driven />
	
	<!-- 配置拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/demo/**" />		<!-- 拦截路径 -->
			<bean class="com.hx.spring.mvc.interceptor.MyInterceptor" />	<!-- 拦截后处理器,拦截后交给谁处理 -->
		</mvc:interceptor>
	</mvc:interceptors>
</beans>

附:

  1. spirngmvc入门—springmvc的使用(1):https://blog.csdn.net/qq_40366738/article/details/104841413
  2. springmvc入门—springmvc的使用(2):https://blog.csdn.net/qq_40366738/article/details/104857441
  3. springmvc入门—springmvc的使用(3)interceptor拦截器:https://blog.csdn.net/qq_40366738/article/details/104905550
发布了46 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40366738/article/details/104905550