1 有这样一个需求

服务端对部分请求URL需要验证身份。如果验证错误,停止请求,按照既定的数据格式返回;如果验证正确,继续执行请求。

2 需要这样做

1. 将指定格式的请求拦截下来;

2. 获取参数,验证参数;

3. 验证不通过,返回既定数据格式。

3 步骤

  需要对参数进行逻辑操作,所以需要在拦截器中注入实例,返回的数据是指定格式,所以要重写response

1.定义拦截器,要继承HandlerInterceptorAdapter ,重写“处理请求前”方法,在该方法中进行逻辑验证。

代码如下:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.web.servlet.ModelAndView;
  3. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  4.  
  5. import com.boco.osmp.entities.TokenOriginEntity;
  6. import com.boco.osmp.model.TokenModel;
  7.  
  8. import java.io.PrintWriter;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. /**
  13. *
  14. *
  15. * @author
  16. *
  17. */
  18. public class CommonInterceptor extends HandlerInterceptorAdapter {
  19. @Autowired
  20. private TokenModel tokenModel;
  21.  
  22. @Override
  23. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  24. throws Exception {
  25.  
  26. String requestUri = request.getRequestURI();
  27. String contextPath = request.getContextPath();
  28. String url = requestUri.substring(contextPath.length());
  29.  
  30. if ("GET".equalsIgnoreCase(request.getMethod()) || "POST".equalsIgnoreCase(request.getMethod())) {
  31. if (url.contains("/api/")) {
  32. String token = request.getHeader("authorization");
  33. String userId = request.getParameter("userId");
  34. if (token != null && userId != null) {
  35. String tokenSource = tokenModel.getToken(userId);
  36. // 如果token验证不通过,返回已经登录的用户信息
  37. if (!token.equals(tokenSource)) {
  38. String p = tokenModel.decryptTokenToResponse(tokenSource, TokenOriginEntity.class);
  39. response.setContentType("application/json;charset=utf-8");
  40. PrintWriter writer;
  41. writer = response.getWriter();
  42. writer.write(p);
  43. return false;
  44. }
  45. } else {
  46. throw new Exception("token或 用户ID不能为空");
  47. }
  48. }
  49. return true;
  50. } else {
  51. throw new Exception("不支持的请求类型!");
  52. }
  53.  
  54. }
  55. @Override
  56. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  57. ModelAndView modelAndView) throws Exception {
  58. super.postHandle(request, response, handler, modelAndView);
  59. }
  60. @Override
  61. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  62. throws Exception {
  63. super.afterCompletion(request, response, handler, ex);
  64. }
  65.  
  66. @Override
  67. public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
  68. throws Exception {
  69. super.afterConcurrentHandlingStarted(request, response, handler);
  70. }
  71. }

拦截器中需要写的是,如果验证错误,需要返回既定格式数据,

是这几行代码实现的

  1. response.setContentType("application/json;charset=utf-8"); //JSON
  2. PrintWriter writer;
  3. writer = response.getWriter();
  4. writer.write(p); //数据

2. 重写配置文件,添加新增的拦截器

在配置文件中需要实例化一个拦截器,这样才能保证在拦截器中注入的实例有效。

swagger U的默认地址也需要手动添加进去。

代码

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  5. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  6. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  7.  
  8. import com.boco.osmp.interceptor.CommonInterceptor;
  9.  
  10. /**
  11. * 配置拦截器
  12. * 初始化拦截器,这样在拦截器中可以注入@service
  13. * @author
  14. */
  15. @EnableWebMvc
  16. @Configuration
  17. public class WebMvcConfig extends WebMvcConfigurerAdapter {
  18.  
  19. /**
  20. * 需要重新该方法,将swagger-ui.html手动加入,否则会请求不到
  21. */
  22. @Override
  23. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  24. registry.addResourceHandler("swagger-ui.html")
  25. .addResourceLocations("classpath:/META-INF/resources/");
  26.  
  27. registry.addResourceHandler("/webjars/**")
  28. .addResourceLocations("classpath:/META-INF/resources/webjars/");
  29. }
  30.  
  31. @Bean
  32. public CommonInterceptor interceptor() {
  33. return new CommonInterceptor();
  34. }
  35.  
  36. @Override
  37. public void addInterceptors(InterceptorRegistry registry) {
  38. registry.addInterceptor(interceptor()).addPathPatterns("/**");
  39. super.addInterceptors(registry);
  40. }
  41. }

springboot 配置拦截器的更多相关文章

  1. SpringBoot配置拦截器

    [配置步骤] 1.为类添加注解@Configuration,配置拦截器 2.继承WebMvcConfigurerAdapter类 3.重写addInterceptors方法,添加需要拦截的请求 @Co ...

  2. SpringBoot——配置类实现WebMvcConfigurer接口来配置拦截器、view-controller、视图解析器等

    目的:为了保留SpringBoot对SpringMVC自动配置,另外我们还想要做一些自己拓展的功能 如何做扩展? 以配置view-controller实现跳转为例: 原先在SpringMvc中我们写v ...

  3. springboot的拦截器Interceptor的性质

    Interceptor在springboot2.x版本的快速入门 实现HandlerInterceptor的接口,并重载它的三个方法:preHandle.postHandle.afterComplet ...

  4. SpringBoot MVC 拦截器

    SpringBoot MVC 环境搭建 在pom.xml添加spring-boot-starter-web   <dependency>   <groupId>org.spri ...

  5. SpringBoot使用拦截器

    SpringBoot的拦截器只能拦截流经DispatcherServlet的请求,对于自定义的Servlet无法进行拦截. SpringMVC中的拦截器有两种:HandlerInterceptor和W ...

  6. springboot+springmvc拦截器做登录拦截

    springboot+springmvc拦截器做登录拦截 LoginInterceptor 实现 HandlerInterceptor 接口,自定义拦截器处理方法 LoginConfiguration ...

  7. SpringMVC拦截器与SpringBoot自定义拦截器

    首先我们先回顾一下传统拦截器的写法: 第一步创建一个类实现HandlerInterceptor接口,重写接口的方法. 第二步在XML中进行如下配置,就可以实现自定义拦截器了 SpringBoot实现自 ...

  8. spring原拦截器配置与新命名空间mvc:interceptors配置拦截器对照与注意事项

    原先,我们是这么配置拦截器的 <bean id="openSessionInViewInterceptor"class="org.springframework.o ...

  9. SpringBoot自定义拦截器实现IP白名单功能

    SpringBoot自定义拦截器实现IP白名单功能 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8993331.html 首先,相关功能已经上线了,且先让我先 ...

随机推荐

  1. 【t070】二进制

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 求所有可以只用1和00拼成的长度为N的二进制数的个数除以15746的余数. 比如当N=4的时候,有5个 ...

  2. [Angular Router] Lazy loading Module with Auxiliary router

    Found the way to handle Auxiliary router for lazy loading moudle and erge load module are different. ...

  3. BAT实习内推笔试卷(第一场)——个人答案以及分析

    第一题: 给定一个长度不小于2的数组arr. 写一个函数调整arr,使arr中要么全部的偶数位上都是偶数,要么全部的奇数位上都是奇数上. 要求:假设数组长度为N.时间复杂度请达到O(N),额外空间复杂 ...

  4. 【iOS】自己定义TabBarController

    一.自己定义的思路 iOS中的TabBarController确实已经非常强大了.大部分主流iOS应用都会採用. 可是往往也不能满足所有的需求,因此须要自己定义TabBar,自己定义须要对系统的Tab ...

  5. 阿里云域名和ip绑定步骤

    阿里云域名和ip绑定步骤 一.总结 一句话总结:域名转IP信息存在所在地运营商那,比如电信联通等. 1.给域名添加对应ip的过程叫做什么? 域名解析 2.域名解析中的记录代表什么意思,记录值呢? 记录 ...

  6. Opencv中使用Surf特征实现图像配准及对透视变换矩阵H的平移修正

    图像配准需要将一张测试图片按照第二张基准图片的尺寸.角度等形态信息进行透视(仿射)变换匹配,本例通过Surf特征的定位和匹配实现图像配准. 配准流程: 1. 提取两幅图像的Surf特征 2. 对Sur ...

  7. python 单向循环列表

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/23 下午 6:54 # 单向循环列表 # 单向循环列表与单向列表的不同之处在于最后 ...

  8. BZOJ 2330 - 差分约束系统

    传送门 题目分析 差分约束 这里做个简单介绍:形如\(x_i - x_j >= d\)的不等式,可以联想到我们求最短路时\(d_v <= d_u + len\),则上式可以变形为\(x_i ...

  9. 【u242】排名系统

    Time Limit: 1 second Memory Limit: 64 MB [问题描述] F1的影响力越来越大,因此国际汽联决定扩大规模,让更多有天赋的车手加入这一行列. 不过规模的扩大带来了一 ...

  10. 【codeforces 777B】Game of Credit Cards

    [题目链接]:http://codeforces.com/contest/777/problem/B [题意] 等价题意: 两个人都有n个数字, 然后两个人的数字进行比较; 数字小的那个人得到一个嘲讽 ...