spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别
今天学习一下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区别相关推荐
- api分层内部外部 spring_java - Spring boot restful API分层架构验证 - SO中文参考 - www.soinside.com...
[今天,我与我们的一位团队成员就Controller和Service层中的RESTful API输入的验证进行了大讨论,我觉得这是提出更大论点的糟糕日子.因此,我们有一个具有分层体系结构的spring ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】05、Shiro集成
1.POM文件中加入Shiro和fastJSON依赖 <dependency><groupId>org.apache.shiro</groupId><arti ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】04、统一处理异常...
本节讨论如何使用Spring的异常处理机制,当我们程序出现错误时,以相同的一种格式,把错误信息返回给客户端 1.创建一些自定义异常 public class TipsException extends ...
- Spring boot restful api 方法参数 BindException 异常处理
BindException位于org.springframework.validation中 客户端 发起接口请求,Controller在接收的参数在进行绑定注解校验规则时出现异常,会抛出 Bind ...
- 构建Spring Boot RESTful服务+ Spring Boot执行器
总览 什么是REST? REST(代表状态转移)是Web构建的体系结构样式,已成为用于Web应用程序的标准软件设计模式 . 代表性国家转移一词最早由REST的发起人,HTTP规范的主要作者之一Roy ...
- Spring Boot 实现登录拦截器,这才是正确的姿势!!
原文:https://blog.csdn.net/qq_27198345/article/details/111401610 对于管理系统或其他需要用户登录的系统,登录验证都是必不可少的环节,在Spr ...
- Spring Boot Restful框架搭建和使用【持续更新中】
2019独角兽企业重金招聘Python工程师标准>>> 1 Spring Boot Restful框架搭建 项目源码地址 2 SpringBoot框架使用技巧记录 2.1 pagea ...
- 必会系列之 filter 和 interceptor 的区别
什么是Filter 在java的javax.servlet下有一个接口Filter.任何实现了Filter接口的类都可以称之为filter.Filter的主要用途是设置字符集.控制权限.控制转向等等. ...
- filter和interceptor的区别
前言 最近在面试的时候,被问到了这个问题,觉得答得不是很好,在此进行整理和记录,供自己学习,也希望能帮助到大家. 什么是Filter 在java的javax.servlet下有一个接口Filter.任 ...
- 一个基于Spring Boot的API、RESTful API项目骨架
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:简单的土豆 www.jianshu.com/p/99fcea ...
最新文章
- 百度自动驾驶出租车服务在北京全面开放 可免费试乘
- git查找两个分支的共同节点
- 如何评估自己对外界认知是否正确?
- LimeSDR性能参数介绍及如何用它实现通信过程
- 4.6 大数据集-机器学习笔记-斯坦福吴恩达教授
- 数据结构与算法 -- 二叉树 ADT
- PHP语言 -- Ajax 查询数据
- 工作407-启动vue项目出现Module build failed (from ./node_modules/sass-loader/dist/cjs.js): ValidationError: I
- pat乙级 1014 java_pat乙级1014 福尔摩斯的约会
- (21)System Verilog设计D触发器
- vue 一个页面多个router-view如何配置子路由_浅谈vue前端开发架构
- docker镜像启动后端口号是多少_java项目docker云化入门
- Uncaught Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)
- use texstudio with chinese on ubuntu
- #上位机开发大师之路# 串口控制模块开发
- SVM多分类的几种方式
- 电子科技大学《图论及其应用》复习(史上最全汇总)
- java cmyk和rgb的转换_CMYK和RGB怎么转换
- 游戏视频怎么录制,游戏录制软件哪个好
- hdu2037-简单dp
热门文章
- Vue cli3使用vue-awesome-swiper
- python做前端mongodb_python-mongodb基本操作都在这了
- mac sqlite可视化工具_Navicat for SQLite 12 for mac(强大数据库管理及开发工具)
- 计算机逻辑运算进位,二进位数进行逻辑运算1010AND1001的运算结果
- Redo Log的逻辑与物理结构
- mysql join不加关联条件的含义
- 安装配置管理 之 安装和配置 JPackage Java
- CentOS6系统编译部署LAMP(Linux, Apache, MySQL, PHP)环境
- vue(2)学习历程----从iview框架入手
- Spring AOP 浅析