今天学习一下RESTFul api拦截

大概有三种方式

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

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

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

package com.nbkj.webFilter;import org.springframework.stereotype.Component;import javax.servlet.*;
import java.io.IOException;
import java.util.Date;@Component
public class TimerFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Time  filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Time filter start");long startTime = new Date().getTime();filterChain.doFilter(servletRequest, servletResponse);System.out.println("time filter:"+(new Date().getTime()-startTime));System.out.println("time filter finish");}@Overridepublic void destroy() {System.out.println("Time filter destroy");}
}

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

package com.nbkj.config;import com.nbkj.webFilter.TimerFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.ArrayList;
import java.util.List;/*** Web配置** @author hsj* @Configuration 这个注解声明这个类是配置类* @create 2017-11-11 18:00**/@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean timeFilter() {FilterRegistrationBean registrationBean = new FilterRegistrationBean();TimerFilter timerFilter = new TimerFilter();registrationBean.setFilter(timerFilter);List<String> urls = new ArrayList<>();urls.add("/*");registrationBean.setUrlPatterns(urls);return registrationBean;}
}

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

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

package com.nbkj.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.persistence.Convert;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;/*** this is spring interceptor** @author hsj* @create 2017-11-11 18:16**/@Component
public class TimeInterceptor implements HandlerInterceptor {/*** 控制器方法处理之前** @param httpServletRequest* @param httpServletResponse* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {System.out.println("preHandle");System.out.println(((HandlerMethod) handler).getBean().getClass().getName());System.out.println(((HandlerMethod) handler).getMethod().getName());httpServletRequest.setAttribute("startTime", new Date().getTime());return false;}/*** 控制器方法处理之后* 控制器方法调用不抛异常调用** @param httpServletRequest* @param httpServletResponse* @param o* @param modelAndView* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");Long startTime = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));}/*** 控制器方法抛不抛异常都会被调用** @param httpServletRequest* @param httpServletResponse* @param o* @param e* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");Long startTime = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor 耗时" + (new Date().getTime() - startTime));System.out.println("ex is" + e);}
}

package com.nbkj.config;import com.nbkj.interceptor.TimeInterceptor;
import com.nbkj.webFilter.TimerFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import java.util.ArrayList;
import java.util.List;/*** Web配置** @author hsj* @Configuration 这个注解声明这个类是配置类* @create 2017-11-11 18:00**/@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate TimeInterceptor timeInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(timeInterceptor);}}

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

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

package com.nbkj.aspect;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;import java.util.Date;/*** this is a acpect* 切入点* 在那些方法上起作用* 在什么时候起作用** @author hsj* @create 2017-11-11 20:52**/
@Aspect
@Component
public class TimeAspect {@Around("execution(* com.nbkj.controller.UserController.*(..))")public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("time aspect start");Object[] args = proceedingJoinPoint.getArgs();for (Object arg : args) {System.out.println(arg.getClass().getName());System.out.println("arg is " + arg);}long startTime = new Date().getTime();Object obj = proceedingJoinPoint.proceed();System.out.println("time aspect 耗时" + (new Date().getTime() - startTime));System.out.println("time aspect end");return obj;}
}

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

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

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

转载于:https://www.cnblogs.com/bigben0123/p/9234816.html

spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别相关推荐

  1. api分层内部外部 spring_java - Spring boot restful API分层架构验证 - SO中文参考 - www.soinside.com...

    [今天,我与我们的一位团队成员就Controller和Service层中的RESTful API输入的验证进行了大讨论,我觉得这是提出更大论点的糟糕日子.因此,我们有一个具有分层体系结构的spring ...

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

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

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

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

  4. Spring boot restful api 方法参数 BindException 异常处理

    BindException位于org.springframework.validation中 客户端 发起接口请求,Controller在接收的参数在进行绑定注解校验规则时出现异常,会抛出  Bind ...

  5. 构建Spring Boot RESTful服务+ Spring Boot执行器

    总览 什么是REST? REST(代表状态转移)是Web构建的体系结构样式,已成为用于Web应用程序的标准软件设计模式 . 代表性国家转移一词最早由REST的发起人,HTTP规范的主要作者之一Roy ...

  6. Spring Boot 实现登录拦截器,这才是正确的姿势!!

    原文:https://blog.csdn.net/qq_27198345/article/details/111401610 对于管理系统或其他需要用户登录的系统,登录验证都是必不可少的环节,在Spr ...

  7. Spring Boot Restful框架搭建和使用【持续更新中】

    2019独角兽企业重金招聘Python工程师标准>>> 1 Spring Boot Restful框架搭建 项目源码地址 2 SpringBoot框架使用技巧记录 2.1 pagea ...

  8. 必会系列之 filter 和 interceptor 的区别

    什么是Filter 在java的javax.servlet下有一个接口Filter.任何实现了Filter接口的类都可以称之为filter.Filter的主要用途是设置字符集.控制权限.控制转向等等. ...

  9. filter和interceptor的区别

    前言 最近在面试的时候,被问到了这个问题,觉得答得不是很好,在此进行整理和记录,供自己学习,也希望能帮助到大家. 什么是Filter 在java的javax.servlet下有一个接口Filter.任 ...

  10. 一个基于Spring Boot的API、RESTful API项目骨架

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:简单的土豆 www.jianshu.com/p/99fcea ...

最新文章

  1. 百度自动驾驶出租车服务在北京全面开放 可免费试乘
  2. git查找两个分支的共同节点
  3. 如何评估自己对外界认知是否正确?
  4. LimeSDR性能参数介绍及如何用它实现通信过程
  5. 4.6 大数据集-机器学习笔记-斯坦福吴恩达教授
  6. 数据结构与算法 -- 二叉树 ADT
  7. PHP语言 -- Ajax 查询数据
  8. 工作407-启动vue项目出现Module build failed (from ./node_modules/sass-loader/dist/cjs.js): ValidationError: I
  9. pat乙级 1014 java_pat乙级1014 福尔摩斯的约会
  10. (21)System Verilog设计D触发器
  11. vue 一个页面多个router-view如何配置子路由_浅谈vue前端开发架构
  12. docker镜像启动后端口号是多少_java项目docker云化入门
  13. Uncaught Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)
  14. use texstudio with chinese on ubuntu
  15. #上位机开发大师之路# 串口控制模块开发
  16. SVM多分类的几种方式
  17. 电子科技大学《图论及其应用》复习(史上最全汇总)
  18. java cmyk和rgb的转换_CMYK和RGB怎么转换
  19. 游戏视频怎么录制,游戏录制软件哪个好
  20. hdu2037-简单dp

热门文章

  1. Vue cli3使用vue-awesome-swiper
  2. python做前端mongodb_python-mongodb基本操作都在这了
  3. mac sqlite可视化工具_Navicat for SQLite 12 for mac(强大数据库管理及开发工具)
  4. 计算机逻辑运算进位,二进位数进行逻辑运算1010AND1001的运算结果
  5. Redo Log的逻辑与物理结构
  6. mysql join不加关联条件的含义
  7. 安装配置管理 之 安装和配置 JPackage Java
  8. CentOS6系统编译部署LAMP(Linux, Apache, MySQL, PHP)环境
  9. vue(2)学习历程----从iview框架入手
  10. Spring AOP 浅析