简单总结SpringMVC拦截器的使用方法

网友投稿 367 2022-10-16


简单总结SpringMVC拦截器的使用方法

SpringMVC拦截器

拦截器类似于Filter过滤器,它是springMVC特有的,它可以预处理和后处理,我们可以定义一些拦截器来实现特定的业务。

过滤器与拦截器本质区别:

(1)拦截器时AOP思想的具体应用(一个横切面,直接切进请求响应中去)。

(2)拦截器时spring MVC特有的。

(3)拦截器只会拦截 访问控制器的方法,如果访问静态资源如:.jsp/html/css/image/js 时,它不会去拦截,而Filter过滤器无论什么都会去拦截。

自定义拦截器需要两步:

第一步:编写自定义类实现 HandlerInterceptor 接口,且必须重写方法;

第二步:在配置类中,注册拦截器,实现 WebMvcConfigurer接口,重写对应的方法;关于配置类                 我在这边文章有记录:https://jb51.net/article/204128.htm

(1)public boolean preHandle() {}

请求前处理的逻辑 - 前置。

方法返回值:返回布尔值,返回true表示可以执行后续代码,返回false程序会终止。

(2)public void postHandle(){}

请响应前处理的逻辑 - 后置。

方法返回值:无返回值。

目录:

package com.lxc.springboot.interceptor;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerInterceptor;

@Component

public class MyInterceptor implements HandlerInterceptor {

private static final Logger LOG = LoggerFactory.getLogger(LogInterceptor.class);

@Override

public boolean http://preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

s

// 拦截前的操作

System.out.println("-----------前置拦截-----------");

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

// 拦截后的操作

System.out.println("------------后置拦截------------");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

// 可以做一些清理工作

}

}

注册拦截器:

package com.lxc.springboot.config;

import com.lxc.springboot.intercetor.MyInterceptor;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

/**

* @扩展springMVC

* 第一步:

* @Configuration 注解的作用:让这个类变为配置类

* 第二步:

* 必须实现 WebMvcConfigurer 接口

*/

@Configuration

public class SpringMvcConfig implements WebMvcConfigurer {

@Resource

private MyInterceptor myInterceptor;

@Override

public void addInterceptors(InterceptorRegistry registry) {

// addInterceptor():注册拦截器,参数是一个拦截器

// addPathPatterns(): 路径映射,哪些路径需要被拦截,/** 全部拦截

// excludePathPatterns(): 排除哪些路径,不会被拦截

registry.addInterceptor(myInterceptor)

.addPathPatterns("/**")

.excludePathPatterns("/login");

}

}

小例子

跟Filter一样,记录接口的请求响应耗时:

package com.lxc.springboot.interceptor;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 这个是拦截器,与过滤器区别:

*

* 【【【【特别注意:增加拦截器,还需要在config中增加一个配置类!配置】】】】

*

* (1)拦截器是spring特有的,经常用于登录校验、权限验证、请求打印日志等等。

* (2)拦截器不需要你手动调用后续代码执行,它是有两个方法的,且分开的,一个前,一个后

* (3)而过滤器,我们会在打印日志的中间,使用filterChain.doFilter()方法去调用后续代码执行的!

* (4)拦截器的 preHandle 前置处理方法,必须返回true,否则后续逻辑不会执行,整个业务也会结束!

*/

@Component // 增加这个注解,让spring能扫描到这个类

public class LogInterceptor implements HandlerInterceptor {

private static final Logger LOG = LoggerFactory.getLogger(LogInterceptor.class);

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

LOG.info("【全局拦截器】");

LOG.info("*********** InterceptorLog日志开始 *********** ");

LOG.info("* 请求地址: {}, 方法: {}", request.getRequestURL().toString(), request.getMethod());

LOG.info("* 远程地址: {}, 域名: {}, 端口: {}", request.getRemoteAddr(), request.getRemoteHost(), request.getRemotePort());

long startTime = System.currentTimeMillis();

request.setAttribute("boot-responseTime", startTime);

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

// request.getAttribute("boot-responseTime") 返回的是Object

long startTimed = (long) request.getAttribute("boot-responseTime");

LOG.info(" *********** InterceptorLog 结束,耗时: {} ms *********** ", System.currentTimeMillis() - startTimed);

}

}

在配置类中注册拦截器:

package com.lxc.springboot.config;

import com.lxc.springboot.intercetor.LogInterceptor;

import com.lxc.springboot.intercetor.MyInterceptor;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

@Configuration

public class SpringMvcConfig implements WebMvcConfigurer {

@Resource

private MyInterceptor myInterceptor;

@Resource

private LogInterceptor logInterceptor;

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(logInterceptor)

.addPathPatterns("/**")

.excludePathPatterns("/login");

}

}

测试:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:5G技术快速问答
下一篇:vpp中plugin的api编程(2) - VPE vs. Plugin Messages id
相关文章

 发表评论

暂时没有评论,来抢沙发吧~