java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring MVC拦截器(Interceptor)定义和配置

Spring MVC拦截器(Interceptor)的定义和配置过程

作者:库隐

这篇文章主要介绍了Spring MVC拦截器(Interceptor)的定义和配置过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1、SpringMVC中组件: 拦截器(Interceptor)

拦截器(Interceptor)

对我们来说是非常实用的,也是经常使用的,可以在所有的HandlerMapping的前后进行拦截,当我们需要将特定功能应用于符合某种规则的请求的时候,这个时候就可以使用拦截器。

我们自定义的拦截器必须继承org.springframework.web.servlet.HandlerInterceptor,在HandlerInterceptor由三个默认方法

package org.springframework.web.servlet;

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

import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;

public interface HandlerInterceptor {
	/**
	* 在执行实际储器程序之前,根据返回的boolen判断是否放行
	*/
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}
	/**
	* 执行处理程序之后
	*/
	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}
	/**
	* 在完成请求后
	*/
	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}

}

自定义的拦截器

package com.example.web.interceptor;

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

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

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        System.out.println("请求的路径:" +requestURI);
        long startTime = System.currentTimeMillis();
        request.setAttribute("request::start",startTime);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        long startTime = (long)request.getAttribute("request::start");
        long processEndTime = System.currentTimeMillis();
        System.out.println("处理程序执行完成耗时:"+ (processEndTime-startTime) + "毫秒");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long startTime = (long)request.getAttribute("request::start");
        long endTime = System.currentTimeMillis();
        System.out.println("从请求到完成响应耗时:"+ (endTime-startTime) + "毫秒");
    }
}

2、拦截器(Interceptor)的配置

在自定拦截器完成后,就是在Spring MVC 中配置我们的拦截器(Interceptor)了,可以通过Java配置类的方式进行配置,也可以通过xml文件的方式进行配置。

先从Java配置类的方式来看

对于URI匹配模式:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(new MyInterceptor())
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
}

在xml中进行配置

<mvc:interceptors>
	<bean class="com.example.web.interceptor.MyInterceptor"/>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文