今天学习一下RESTFul api拦截

大概有三种方式

一、通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求。在springboot中一般有两种配置方式。

这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用哪一个方法处理。

(1)第一种直接写类实现这个接口。代码如下这个要使用Component注解,当你你请求服务器的时候他会对每一个请求进行处理。

  1. package com.nbkj.webFilter;
  2.  
  3. import org.springframework.stereotype.Component;
  4.  
  5. import javax.servlet.*;
  6. import java.io.IOException;
  7. import java.util.Date;
  8.  
  9. @Component
  10. public class TimerFilter implements Filter {
  11. @Override
  12. public void init(FilterConfig filterConfig) throws ServletException {
  13. System.out.println("Time filter init");
  14. }
  15.  
  16. @Override
  17. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  18. System.out.println("Time filter start");
  19. long startTime = new Date().getTime();
  20. filterChain.doFilter(servletRequest, servletResponse);
  21. System.out.println("time filter:"+(new Date().getTime()-startTime));
  22. System.out.println("time filter finish");
  23. }
  24.  
  25. @Override
  26. public void destroy() {
  27. System.out.println("Time filter destroy");
  28. }
  29. }

(2)第二种可以在WebConfig中配置,这种配置方式为了使用第三方的Filter没有@Compont注解所以使用。代码如下

  1. package com.nbkj.config;
  2.  
  3. import com.nbkj.webFilter.TimerFilter;
  4. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.List;
  10.  
  11. /**
  12. * Web配置
  13. *
  14. * @author hsj
  15. * @Configuration 这个注解声明这个类是配置类
  16. * @create 2017-11-11 18:00
  17. **/
  18.  
  19. @Configuration
  20. public class WebConfig {
  21. @Bean
  22. public FilterRegistrationBean timeFilter() {
  23. FilterRegistrationBean registrationBean = new FilterRegistrationBean();
  24. TimerFilter timerFilter = new TimerFilter();
  25. registrationBean.setFilter(timerFilter);
  26. List<String> urls = new ArrayList<>();
  27. urls.add("/*");
  28. registrationBean.setUrlPatterns(urls);
  29. return registrationBean;
  30. }
  31. }

二、使用Interceptor这种事spring框架自己带的拦截器,代码如下 它会处理自己写的拦截器,也会拦截的拦截BasicErrorController

可以拿到处理的Controller和拿到处理的方法 但是拿不到具体的请求参数。

  1. package com.nbkj.interceptor;
  2.  
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.web.method.HandlerMethod;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.ModelAndView;
  7.  
  8. import javax.persistence.Convert;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.util.Date;
  12.  
  13. /**
  14. * this is spring interceptor
  15. *
  16. * @author hsj
  17. * @create 2017-11-11 18:16
  18. **/
  19.  
  20. @Component
  21. public class TimeInterceptor implements HandlerInterceptor {
  22.  
  23. /**
  24. * 控制器方法处理之前
  25. *
  26. * @param httpServletRequest
  27. * @param httpServletResponse
  28. * @param handler
  29. * @return
  30. * @throws Exception
  31. */
  32. @Override
  33. public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
  34. System.out.println("preHandle");
  35. System.out.println(((HandlerMethod) handler).getBean().getClass().getName());
  36. System.out.println(((HandlerMethod) handler).getMethod().getName());
  37. httpServletRequest.setAttribute("startTime", new Date().getTime());
  38. return false;
  39. }
  40.  
  41. /**
  42. * 控制器方法处理之后
  43. * 控制器方法调用不抛异常调用
  44. *
  45. * @param httpServletRequest
  46. * @param httpServletResponse
  47. * @param o
  48. * @param modelAndView
  49. * @throws Exception
  50. */
  51. @Override
  52. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {
  53. System.out.println("postHandle");
  54. Long startTime = (Long) httpServletRequest.getAttribute("startTime");
  55. System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));
  56. }
  57.  
  58. /**
  59. * 控制器方法抛不抛异常都会被调用
  60. *
  61. * @param httpServletRequest
  62. * @param httpServletResponse
  63. * @param o
  64. * @param e
  65. * @throws Exception
  66. */
  67. @Override
  68. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  69. System.out.println("afterCompletion");
  70. Long startTime = (Long) httpServletRequest.getAttribute("startTime");
  71. System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));
  72. System.out.println("ex is" + e);
  73. }
  74. }
  1. package com.nbkj.config;
  2.  
  3. import com.nbkj.interceptor.TimeInterceptor;
  4. import com.nbkj.webFilter.TimerFilter;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  11.  
  12. import java.util.ArrayList;
  13. import java.util.List;
  14.  
  15. /**
  16. * Web配置
  17. *
  18. * @author hsj
  19. * @Configuration 这个注解声明这个类是配置类
  20. * @create 2017-11-11 18:00
  21. **/
  22.  
  23. @Configuration
  24. public class WebConfig extends WebMvcConfigurerAdapter {
  25.  
  26. @Autowired
  27. private TimeInterceptor timeInterceptor;
  28.  
  29. @Override
  30. public void addInterceptors(InterceptorRegistry registry) {
  31. registry.addInterceptor(timeInterceptor);
  32. }
  33.  
  34. }

三、使用Aspect切片,代码如下

使用环绕通知,切入要切入的类,当请求的时候回拦截下来,这样可以获取拦截的方法的参数

  1. package com.nbkj.aspect;
  2.  
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.Around;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.springframework.stereotype.Component;
  7.  
  8. import java.util.Date;
  9.  
  10. /**
  11. * this is a acpect
  12. * 切入点
  13. * 在那些方法上起作用
  14. * 在什么时候起作用
  15. *
  16. * @author hsj
  17. * @create 2017-11-11 20:52
  18. **/
  19. @Aspect
  20. @Component
  21. public class TimeAspect {
  22. @Around("execution(* com.nbkj.controller.UserController.*(..))")
  23. public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
  24. System.out.println("time aspect start");
  25. Object[] args = proceedingJoinPoint.getArgs();
  26. for (Object arg : args) {
  27. System.out.println(arg.getClass().getName());
  28. System.out.println("arg is " + arg);
  29. }
  30. long startTime = new Date().getTime();
  31. Object obj = proceedingJoinPoint.proceed();
  32. System.out.println("time aspect 耗时" + (new Date().getTime() - startTime));
  33. System.out.println("time aspect end");
  34. return obj;
  35. }
  36. }

过滤器(Filter)         :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

切片   (Aspect)       :  可以拿到方法的参数,但是却拿不到http请求和响应的对象

spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别的更多相关文章

  1. 使用 JSONDoc 记录 Spring Boot RESTful API

    这个博文可以分为两部分:第一部分我将编写一个Spring Boot RESTful API,第二部分将介绍如何使用JSONDoc来记录创建的API.做这两个部分最多需要15分钟,因为使用Spring ...

  2. 过滤器和拦截器filter和Interceptor的区别

    1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...

  3. Spring Boot & Restful API 构建实战!

    作者:liuxiaopeng https://www.cnblogs.com/paddix/p/8215245.html 在现在的开发流程中,为了最大程度实现前后端的分离,通常后端接口只提供数据接口, ...

  4. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】03、创建RESTful API,并统一处理返回值

    本节应用Spring对RESTful的支持,使用了如@RestController等注解实现RESTful控制器. 如果对Spring中的RESTful不太明白,请查看相关书籍 1.创建一个数据对象, ...

  5. Spring Boot - Restful API

    基本用法 @GetMapping与@PostMapping不指定参数时就是指直接使用到controller一级的url就行 @GetMapping与@PathVariable对应,前者{}中的字符串和 ...

  6. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】06、Mybatis+SQLServer集成

    1.增加POM依赖 注意pagehelper插件,我重写过,可以到我的这篇文章了解https://www.cnblogs.com/LiveYourLife/p/9176934.html <dep ...

  7. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】05、Shiro集成

    1.POM文件中加入Shiro和fastJSON依赖 <dependency> <groupId>org.apache.shiro</groupId> <ar ...

  8. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】04、统一处理异常

    本节讨论如何使用Spring的异常处理机制,当我们程序出现错误时,以相同的一种格式,把错误信息返回给客户端 1.创建一些自定义异常 public class TipsException extends ...

  9. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】01、环境准备

    开发环境 windows+STS(一个针对Spring优化的Eclipse版本)+Maven+SQLServer 环境部署 1.安装SQLServer(使用版本2008R2) 自行安装,此处略过 2. ...

随机推荐

  1. python的简介及入门

    前言 为何使用Python Python 是一种效率极高的语言.与其他众多的语言相比,实现相同功能,使用Python编写的程序包含的代码更少.Python的语法简单,易上手,使用Python编写的代码 ...

  2. python glob fnmatch 用于文件查找操作

    參考: http://python.jobbole.com/81552/:Python模块学习:glob文件路径查找 http://blog.csdn.net/suiyunonghen/article ...

  3. 一、OpenStack入门 之 初步认识

    OpenStack入门 之 初步认识 写在前面 从 OpenStack 基础知识開始学起,剖析 OpenStack 架构.分析 OpenStack 的各个组件的功能.原理和用法,通过实战演练来掌握 O ...

  4. hdu 4939

    题意: 长度为n个单位的map,每一个单位须要时间t来走完. 每一个单位能够放置一个塔.一共同拥有三种塔,每种塔的作用不同: 1.仅仅能攻击当前单位.每秒x点伤害(红塔) 2.攻击当前单位之后的全部单 ...

  5. 将CSS放头部,JS放底部,可以提高页面的性能的原因

    css不阻止dom的解析 js阻止dom的解析 css js都会阻止dom的渲染 原因: js有可能影响dom的解析,比如在js里面新增dom等这些操作 css不能影响dom的解析 而 dom的渲染 ...

  6. Java web轻量级开发面试教程的前言

    本文来是从 java web轻量级开发面试教程从摘录的. 为什么要从诸多的Java书籍里选择这本?为什么在当前网络信息量如此大的情况下还要买这本书,而不是自己通过查阅网络资料学习?我已经会开发Java ...

  7. tomcat启动失败的一种可能性

    今天搭建一个新的项目,采用spring+hibernate框架,项目框架搭建完成以后,启动tomcat,报错,如下图. 第一反应是tomcat的问题,于是clean了tomcat,没用,再把tomca ...

  8. java实现播放mp3功能

    1.首先引入jlayer.jar <!-- https://mvnrepository.com/artifact/javazoom/jlayer --> <dependency> ...

  9. 自学Zabbix3.8.1.3-可视化Visualisation-Graphs特殊图表

    自学Zabbix3.8.1.3-可视化Visualisation-Graphs特殊图表 虽然一个简单的图表和自定义图标很适合访问一个项目的数据,但这两个都不允许在多个项目中快速创建一个比较图表.为了解 ...

  10. IdentityServer(12)- 使用 ASP.NET Core Identity

    IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...