SpringBoot之HandlerInterceptor拦截器的使用 ——(一)「建议收藏」

SpringBoot之HandlerInterceptor拦截器的使用 ——(一)「建议收藏」HandlerInterceptor简介拦截器我想大家都并不陌生,最常用的登录拦截、或是权限校验、或是防重复提交、或是根据业务像12306去校验购票时间,总之可以去做很多的事情。1、定义实现类定义一个Interceptor非常简单方式也有几种,我这里简单列举两种1、类要实现Spring的HandlerInterceptor接口2、类继承实现了HandlerInterc…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

HandlerInterceptor简介

拦截器我想大家都并不陌生,最常用的登录拦截、或是权限校验、或是防重复提交、或是根据业务像12306去校验购票时间,总之可以去做很多的事情。
我仔细想了想
这里我分三篇博客来介绍HandlerInterceptor的使用,从基本的使用、到自定义注解、最后到读取body中的流解决无法多次读取的问题。

1、定义实现类

定义一个Interceptor 非常简单方式也有几种,我这里简单列举两种
1、类要实现Spring 的HandlerInterceptor 接口
2、类继承实现了HandlerInterceptor 接口的类,例如 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter

这里博主用的是第二种方法继承HandlerInterceptorAdapter

2、HandlerInterceptor方法介绍


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

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

	void afterCompletion(
			HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception;
  • preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
  • postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView (这个博主就基本不怎么用了);
  • afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);

接下来让我们来实现一个登陆 and 访问权限校验的拦截器吧

拦截器实现

  • 新建TestFilter
package com.xxx.core.filter;

import com.xxx.common.exception.FastRuntimeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

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


public class TestFilter extends HandlerInterceptorAdapter {
	private final Logger logger = LoggerFactory.getLogger(TestFilter.class);
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		logger.info("request请求地址path[{}] uri[{}]", request.getServletPath(),request.getRequestURI());
		//request.getHeader(String) 从请求头中获取数据
		//从请求头中获取用户token(登陆凭证根据业务而定)
		Long userId= getUserId(request.getHeader("H-User-Token"));
		if (userId != null && checkAuth(userId,request.getRequestURI())){
			return true;
		}
		//这里的异常是我自定义的异常,系统抛出异常后框架捕获异常然后转为统一的格式返回给前端, 其实这里也可以返回false
		throw new FastRuntimeException(20001,"No access");
	}

	/**
	 * 根据token获取用户ID
	 * @param userToken
	 * @return
	 */
	private Long getUserId(String userToken){
		Long userId = null;
		return userId;
	}

	/**
	 * 校验用户访问权限
	 * @param userId
	 * @param requestURI
	 * @return
	 */
	private boolean checkAuth(Long userId,String requestURI){
		return true;
	}

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

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {}
}
  • 新建WebAppConfigurer 实现WebMvcConfigurer接口

其实以前都是继承WebMvcConfigurerAdapter类 不过springBoot2.0以上 WebMvcConfigurerAdapter 方法过时,有两种替代方案:
1、继承WebMvcConfigurationSupport
2、实现WebMvcConfigurer
但是继承WebMvcConfigurationSupport会让Spring-boot对mvc的自动配置失效。根据项目情况选择。现在大多数项目是前后端分离,并没有对静态资源有自动配置的需求所以继承WebMvcConfigurationSupport也未尝不可。

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 可添加多个
        registry.addInterceptor(new TestFilter()).addPathPatterns("/**");
    }

    ....
}

其实下面还有很多方法我这里就省略了,过滤器可以添加多个,可以指定Path,这里的/**是对所有的请求都做拦截。

是否感觉配置这个地址是不特别方便?下一篇博客介绍2.0版本引入注解来协助完成一系列的拦截任务。
SpringBoot之HandlerInterceptor拦截器的使用 ——(二)自定义注解
SpringBoot之HandlerInterceptor拦截器的使用 ——(三)获取请求参数解决java.io.IOException: Stream closed
SpringBoot之HandlerInterceptor拦截器的使用 ——(四)防重复提交

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160940.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月25日 下午3:36
下一篇 2022年7月25日 下午3:46


相关推荐

  • resttemplate post请求发送body_java发送post请求

    resttemplate post请求发送body_java发送post请求当使用RestTemplate进行http请求时,的确很方便,但是当需要进行post请求时遇到了坑1POST传递参数:采用LinkedMultiValueMap,不能使用HashMapStringurl=’http://posturl’;MultiValueMap<String,String>map=newLinkedMultiValueMap&lt……

    2025年8月31日
    7
  • 移动ipv6不是公网_移动光纤申请公网ip

    移动ipv6不是公网_移动光纤申请公网ip 之前有人看到我的蜗牛在移动宽带下还能搞外网访问《奶妈级教程:移动宽带下的IPV6+DDNS+私有域名访问黑群晖》,各种问我怎么申请IPv6?搞得我一头雾水,因为真的不需要申请!!!  早在2018年5月份,全网已经开始实施IPv6全覆盖了,移动宽带光纤能到的地方貌似都已经开通了IPv6了,所以我们需要的只是一个能获取IPv6的光猫而已。  最直接的方法当然是打10086去问问啦,不过貌似客服知道的也不多,甚至不知道IPv6是啥?  那就自己度娘“光猫型号+参数”,自己去看支不支持吧?  又

    2022年8月30日
    3
  • ADO.net中常用的对象介绍

    ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation。DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表

    2021年12月20日
    47
  • 【已解决】戴尔笔记本电脑的卡顿问题.

    【已解决】戴尔笔记本电脑的卡顿问题.卡顿检测(主要用于戴尔笔记本):卡顿超过300ms的时候会记录卡顿发生的时间点和卡顿持续的时间.用的是一个Timer(定时器)来检测触发间隔,原理非常简单.此程序使用VB.NET编写,绝无病毒,你可以使用ilspy反编译来查看源代码.在每次开机的时候打开此软件,在每次关机前查看此软件的显示内容,判断是否有卡顿.你可以根据卡顿的状况来判断卡顿是哪些软件造成的.若卡顿出现的不频…

    2025年10月29日
    10
  • MySQL 嵌套查询_嵌套查询和嵌套结果的区别

    MySQL 嵌套查询_嵌套查询和嵌套结果的区别自测题:1、查询哪些课程没有人选修列出课程号和课程名;[code]selectcno,cnamefromcoursewherecnonotin(selectdistinctcnofromsc)[/code]2、用子查询实现如下查询:(1)查询选修了1号课程的学生姓名和所在系;[code]selectsname,snofromstudentwheresnoin(select…

    2022年8月10日
    9
  • node.js实现CURL功能

    PHP中的CURL功能很好实现,直接四五行代码封装一下就OK了。node.js中如何实现CURL的功能呢,下面详细介绍。这里需要用到request这个库,所以先安装此包:npminstallreq

    2021年12月21日
    183

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号