概述
文章目录
- 1、SpringMVC中组件: 拦截器(Interceptor)
- 2、拦截器(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配置类的方式来看:
@EnableWebMvc
: 表示启用Spring MVC的功能@Configuration
: 表示该类是Spring 中的配置类- 拦截的配置需要重写
WebMvcConfigurer
的addInterceptors(InterceptorRegistry registry)
方法,通过registry
进行添加(默认拦截所有) - 可以通过
addPathPatterns
来表示拦截哪些请求 - 可以通过
excludePathPatterns
不拦截哪些请求
对于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>
最后
以上就是呆萌彩虹为你收集整理的Spring MVC:拦截器(Interceptor)的定义和配置的全部内容,希望文章能够帮你解决Spring MVC:拦截器(Interceptor)的定义和配置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复