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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章