# 背景

在实际项目中,接口出于安全考虑,都会有验签的计算。目前接触的项目来看基本都是时间戳+干扰因子 然后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的更多相关文章

  1. spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法

    在spring boot 1.5.x中,resources/static目录下的静态资源可以直接访问,并且访问路径上不用带static,比如静态资源放置位置如下图所示: 那么访问静态资源的路径可以是: ...

  2. (22)Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    上一篇对过滤器的定义做了说明,也比较简单.过滤器属于Servlet范畴的API,与Spring 没什么关系.     Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Sprin ...

  3. 22. Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    转:http://blog.csdn.net/linxingliang/article/details/52069495 上一篇对过滤器的定义做了说明,也比较简单.过滤器属于Servlet范畴的API ...

  4. Spring boot 基于Spring MVC的Web应用和REST服务开发

    Spring Boot利用JavaConfig配置模式以及"约定优于配置"理念,极大简化了基于Spring MVC的Web应用和REST服务开发. Servlet: package ...

  5. Spring Boot 学习(2)

    文 by / 林本托 Tips 做一个终身学习的人. 源代码:github下的/code01/ch2. 配置 Web 应用程序 在上一章中,我们学习了如何创建一个基本的应用程序模板,并添加了一些基本功 ...

  6. spring boot / cloud (八) 使用RestTemplate来构建远程调用服务

    spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...

  7. Spring Boot实战:拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

  8. 玩转spring boot——简单登录认证

    前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...

  9. Spring Boot 定制URL匹配规则的方法

    事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...

随机推荐

  1. Java的反射和代理以及注解

    最近接触到java的反射和代理(接触的有点迟了...),还是有必要总结下 1. Java的反射 有的时候我们需要在程序运行的时候获取类.方法等信息用于动态运行,这个时候反射就能够帮我们找到类.方法.成 ...

  2. Python property() 函数

    Python property() 函数  Python 内置函数 描述 property() 函数的作用是在新式类中返回属性值. 语法 以下是 property() 方法的语法: class pro ...

  3. 89. Gray Code (Bit)

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  4. Spring AOP开发

    --------------------siwuxie095                                 Spring AOP 开发         1.在 Spring 中进行 ...

  5. python连接redis,redis集群

    python连接redis: import redis r = redis.Redis(host='192.168.50.181',port=6002) r.set('user_phone_14900 ...

  6. 利用python计算windows全盘文件md5值的脚本

    import hashlib import os import time import configparser import uuid def test_file_md5(file_path): t ...

  7. 不同的路径12障碍物 · Unique Paths12

    [抄题]: 有一个机器人的位于一个 m × n 个网格左上角. 机器人每一时刻只能向下或者向右移动一步.机器人试图达到网格的右下角. 问有多少条不同的路径? [思维问题]: 以为要用count来计数: ...

  8. jquery 处理重新绑定插件的方法

    比如有一个slide的jquery插件,页面打开就对dom进行了绑定. <div class="expert"> <div class="expert- ...

  9. 搭建事务管理转账案例的环境(强调:简化开发,以后DAO可以继承JdbcDaoSupport类)

    1. 步骤一:创建WEB工程,引入需要的jar包 * IOC的6个包 * AOP的4个包 * C3P0的1个包 * MySQL的驱动包 * JDBC目标2个包 * 整合JUnit测试包2.步骤二:创建 ...

  10. 【hh】我胡汉三又回来了

    hh 差不多半年没来机房了,高一的都已经碾压我100题了 开始得比较晚,估计比高一的早两三个月吧,停了这半年落下了不少. 但是没有关系啊,学OI纯粹是好玩嘛,一开始报名的时候根本不知道有联赛这回事(其 ...