spring boot 使用 HandlerInterceptor
# 背景
在实际项目中,接口出于安全考虑,都会有验签的计算。目前接触的项目来看基本都是时间戳+干扰因子 然后md5计算的方式。现在学习,写一个简单demo,
其实如果不引入拦截器的话,验签计算全部在controller层实现也是可以的,但每个请求都需要去做一次计算,这种把公共功能的抽离,针对于所有请求前的判断,个人感觉有点切面的意思;
# DEMO
核心点:
1. controller层还是和原来的一模一样,不做修改
2. 创建一个ApiSignInterceptor 类 ,实现HandlerInterceptor 接口,完成 验签计算的核心代码;
3. 创建一个WebConfig类,继承WebMvcConfigurationSupport类,引入步骤2中创建的拦截器;
前言:
jdk8+spring boot2.0 版本 如果低版本些许不一致
show CODE
controller层:
@RestController
public class PeopleController { @GetMapping(value = "/1/people/{people_id}")
public String getPeopleInfo(@PathVariable(value = "people_id", required = true) String peopleId) {
return "hello world, this is people info of " + peopleId;
} @GetMapping(value = "/2/people/{people_id}")
public String getPeopleInfoV2(@PathVariable(value = "people_id", required = true) String peopleId) {
return "hello THIS is v2 world, this is people info V2 of " + peopleId;
}
}
没有任何变化,简单demo例子
拦截器,ApiSignInterceptor :
public class ApiSignInterceptor implements HandlerInterceptor {
private final static String SEPERATOR = "_";
private final static String SECRET = "jwentest";
private final static String NO_PERMISSION_ERROR_MESSAGE = "Api Token Error, You have no permission to access this api";
// md5计算
private String md5Hex(String data) {
return DigestUtils.md5Hex(data).toLowerCase();
}
private String getSign(String t) {
return md5Hex(t + SEPERATOR + SECRET);
}
// sign计算,t为时间戳,sign为md5(t+"_"+"jwentest")
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
String t = request.getParameter("t");
String sign = request.getParameter("sign");
if (t.isEmpty() || sign.isEmpty()) {
response.sendError(403, NO_PERMISSION_ERROR_MESSAGE);
return false;
}
String expectedSign = getSign(t);
if (!expectedSign.equals(sign)) {
response.sendError(403, NO_PERMISSION_ERROR_MESSAGE);
return false;
}
} catch (Throwable t) {
response.sendError(403, NO_PERMISSION_ERROR_MESSAGE);
return false;
}
return true;
}
}
其中HandlerInterceptor 接口定义了三个方法,第一次看到我有点懵逼了,为啥接口定义的方法里面会有方法体呢,为什么可以不实现所有的方法了的,原因是JDK8中可以这样写了:
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 {
}
本次我们使用到的是preHandle方法,三个方法的执行顺序如下:
preHandler -> Controller -> postHandler -> model渲染-> afterCompletion
因此可以在进入controller层之前拦截判断是否符合我们的安全要求;
使用,WebConfig 类:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport { @Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ApiSignInterceptor()).addPathPatterns("/1/people/**").excludePathPatterns("/2/people/**");
super.addInterceptors(registry);
}
}
这里是在项目引入拦截器,
@Configuration ,config形式加载在容器中
其中addPathPatterns 和 excludePathPatterns 方法,从方法名就可以看出来,是针对拦截器的范围控制,上面的代码就是针对/1/people/** 生效,对/2/people/** 不生效
目录结构如下:

spring boot 使用 HandlerInterceptor的更多相关文章
- spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法
在spring boot 1.5.x中,resources/static目录下的静态资源可以直接访问,并且访问路径上不用带static,比如静态资源放置位置如下图所示: 那么访问静态资源的路径可以是: ...
- (22)Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】
上一篇对过滤器的定义做了说明,也比较简单.过滤器属于Servlet范畴的API,与Spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Sprin ...
- 22. Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】
转:http://blog.csdn.net/linxingliang/article/details/52069495 上一篇对过滤器的定义做了说明,也比较简单.过滤器属于Servlet范畴的API ...
- Spring boot 基于Spring MVC的Web应用和REST服务开发
Spring Boot利用JavaConfig配置模式以及"约定优于配置"理念,极大简化了基于Spring MVC的Web应用和REST服务开发. Servlet: package ...
- Spring Boot 学习(2)
文 by / 林本托 Tips 做一个终身学习的人. 源代码:github下的/code01/ch2. 配置 Web 应用程序 在上一章中,我们学习了如何创建一个基本的应用程序模板,并添加了一些基本功 ...
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...
- Spring Boot实战:拦截器与过滤器
一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...
- 玩转spring boot——简单登录认证
前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...
- Spring Boot 定制URL匹配规则的方法
事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...
随机推荐
- 注册google账号 解决国内手机注册失败的问题
1. PC端下载夜神安卓模拟器.安装,启动. 2. 在模拟器里的市场应用里下载qq邮箱. 3. 启动邮箱,选择gmail,注册.后续一切顺利. 这是迄今为止,唯一注册顺利的方法.其他方法,手机验证一关 ...
- keras—多层感知器识别手写数字算法程序
#coding=utf-8 #1.数据预处理 import numpy as np #导入模块,numpy是扩展链接库 import pandas as pd import tensorflow im ...
- Json解析数据的简单使用
简单的记一下Json解析的简单实用: 使用场景:后台传到客户端的Json数据,类似于: string jsonObject="{'Name':'Jack','Age':25}"; ...
- 关于"undefined reference"错误
这个错误换句话说: 链接的时候找不到实现的文件(谨记从这个入手!). 可能导致的原因有: 1. 没有链接库文件,包括静态库或动态库. 2. 链接文件的顺序问题,先后依赖问题,把被依赖的放后面. 3. ...
- 165. Compare Version Numbers比较版本号的大小
[抄题]: Compare two version numbers version1 and version2.If version1 > version2 return 1; if versi ...
- repeater嵌套RadioButtonList赋值
<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Rep ...
- Tomcat:A cookie header was received[xxxxxx] that contained an invalid cookie. That cookie will be ignored.
搬运来源:https://blogs.yahoo.co.jp/dk521123/36721868.html 原因: *从Tomcat 8,Cookie的解析已经符合RFC 6265. *由于RFC 6 ...
- java文件读写操作指定编码格式
读文件: BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,R ...
- FutureTask详解
1 基本概念 1.1 Callable与Future Runnable封装一个异步运行的任务,可以把它想象成为一个没有参数和返回值的异步方法.Callable与Runnable类似,但是有返回值.Ca ...
- PAT 1034 有理数四则运算(20)(代码框架+思路+测试点错误分析)
1034 有理数四则运算(20)(20 分)提问 本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的 ...