1. 程式人生 > >spring boot之spring mvc常用配置--攔截器配置(4)

spring boot之spring mvc常用配置--攔截器配置(4)

2.攔截器配置
攔截器Interceptor實現對每一個請求處理前後進行相關的業務處理。類似於Servlet的Filter。
第一種方式:可以讓普通的bean實現HandlerInterceptor介面或者繼承HandlerInterceptorAdapter類來實現自定義攔截器。
①繼承HandlerInterceptorAdapter類來實現自定義攔截器

重寫preHandle:在請求發生前執行、postHandle在請求完後執行。

package com.boot.springmvc.interceptor;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class DemoInterceptor extends HandlerInterceptorAdapter {//1

	@Override
	public boolean preHandle(HttpServletRequest request, //2
			HttpServletResponse response, Object handler) throws Exception {
		long startTime = System.currentTimeMillis();
		request.setAttribute("startTime", startTime);
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, //3
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		long startTime = (Long) request.getAttribute("startTime");
		request.removeAttribute("startTime");
		long endTime = System.currentTimeMillis();
		System.out.println("本次請求處理時間為:" + new Long(endTime - startTime)+"ms");
		request.setAttribute("handlingTime", endTime - startTime);
	}

}

②配置攔截器的bean,重寫addInterceptors

package com.boot.springmvc;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

import com.boot.springmvc.interceptor.DemoInterceptor;

/**
 * 	@Bean
	public InternalResourceViewResolver viewResolver();
 * 注入InternalResourceViewResolver類:
 * 說明:springmvc下有一個介面叫ViewResolver,(我們的viewResolver都實現該介面),實現這個介面要重寫
 * resolverName(),這個方法的返回值介面View,而view的職責就是使用model、request、response物件,並
 * 渲染檢視(不一定是html、可能是json、xml、pdf等)給瀏覽器 。
 *
 */
@Configuration
@EnableWebMvc // 1開啟預設配置
@EnableScheduling
@ComponentScan("com.boot.springmvc")
public class MyMvcConfig extends WebMvcConfigurerAdapter{//2
	//viewResolver
	@Bean
	public InternalResourceViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		//viewResolver.setPrefix("/WEB-INF/classes/views/");//打war後預設編譯的路徑
		viewResolver.setPrefix("/WEB-INF/views/");//使用tomcat7:run外掛後要放的位置
		viewResolver.setSuffix(".jsp");
		viewResolver.setViewClass(JstlView.class);
		return viewResolver;
	}
	//靜態資源對映
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
	}// 3
	
	//攔截器
	@Bean
	// 1
	public DemoInterceptor demoInterceptor() {
		return new DemoInterceptor();
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {// 2
		registry.addInterceptor(demoInterceptor());
	}
	
	
}
發起請求


處理結果