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 {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("Time filter init");
- }
- @Override
- public 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");
- }
- @Override
- public 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 {
- @Bean
- public 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
- */
- @Override
- public 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
- */
- @Override
- public 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
- */
- @Override
- public 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 {
- @Autowired
- private TimeInterceptor timeInterceptor;
- @Override
- public 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请求和响应的对象
spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别的更多相关文章
- 使用 JSONDoc 记录 Spring Boot RESTful API
这个博文可以分为两部分:第一部分我将编写一个Spring Boot RESTful API,第二部分将介绍如何使用JSONDoc来记录创建的API.做这两个部分最多需要15分钟,因为使用Spring ...
- 过滤器和拦截器filter和Interceptor的区别
1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...
- Spring Boot & Restful API 构建实战!
作者:liuxiaopeng https://www.cnblogs.com/paddix/p/8215245.html 在现在的开发流程中,为了最大程度实现前后端的分离,通常后端接口只提供数据接口, ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】03、创建RESTful API,并统一处理返回值
本节应用Spring对RESTful的支持,使用了如@RestController等注解实现RESTful控制器. 如果对Spring中的RESTful不太明白,请查看相关书籍 1.创建一个数据对象, ...
- Spring Boot - Restful API
基本用法 @GetMapping与@PostMapping不指定参数时就是指直接使用到controller一级的url就行 @GetMapping与@PathVariable对应,前者{}中的字符串和 ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】06、Mybatis+SQLServer集成
1.增加POM依赖 注意pagehelper插件,我重写过,可以到我的这篇文章了解https://www.cnblogs.com/LiveYourLife/p/9176934.html <dep ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】05、Shiro集成
1.POM文件中加入Shiro和fastJSON依赖 <dependency> <groupId>org.apache.shiro</groupId> <ar ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】04、统一处理异常
本节讨论如何使用Spring的异常处理机制,当我们程序出现错误时,以相同的一种格式,把错误信息返回给客户端 1.创建一些自定义异常 public class TipsException extends ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】01、环境准备
开发环境 windows+STS(一个针对Spring优化的Eclipse版本)+Maven+SQLServer 环境部署 1.安装SQLServer(使用版本2008R2) 自行安装,此处略过 2. ...
随机推荐
- python的简介及入门
前言 为何使用Python Python 是一种效率极高的语言.与其他众多的语言相比,实现相同功能,使用Python编写的程序包含的代码更少.Python的语法简单,易上手,使用Python编写的代码 ...
- python glob fnmatch 用于文件查找操作
參考: http://python.jobbole.com/81552/:Python模块学习:glob文件路径查找 http://blog.csdn.net/suiyunonghen/article ...
- 一、OpenStack入门 之 初步认识
OpenStack入门 之 初步认识 写在前面 从 OpenStack 基础知识開始学起,剖析 OpenStack 架构.分析 OpenStack 的各个组件的功能.原理和用法,通过实战演练来掌握 O ...
- hdu 4939
题意: 长度为n个单位的map,每一个单位须要时间t来走完. 每一个单位能够放置一个塔.一共同拥有三种塔,每种塔的作用不同: 1.仅仅能攻击当前单位.每秒x点伤害(红塔) 2.攻击当前单位之后的全部单 ...
- 将CSS放头部,JS放底部,可以提高页面的性能的原因
css不阻止dom的解析 js阻止dom的解析 css js都会阻止dom的渲染 原因: js有可能影响dom的解析,比如在js里面新增dom等这些操作 css不能影响dom的解析 而 dom的渲染 ...
- Java web轻量级开发面试教程的前言
本文来是从 java web轻量级开发面试教程从摘录的. 为什么要从诸多的Java书籍里选择这本?为什么在当前网络信息量如此大的情况下还要买这本书,而不是自己通过查阅网络资料学习?我已经会开发Java ...
- tomcat启动失败的一种可能性
今天搭建一个新的项目,采用spring+hibernate框架,项目框架搭建完成以后,启动tomcat,报错,如下图. 第一反应是tomcat的问题,于是clean了tomcat,没用,再把tomca ...
- java实现播放mp3功能
1.首先引入jlayer.jar <!-- https://mvnrepository.com/artifact/javazoom/jlayer --> <dependency> ...
- 自学Zabbix3.8.1.3-可视化Visualisation-Graphs特殊图表
自学Zabbix3.8.1.3-可视化Visualisation-Graphs特殊图表 虽然一个简单的图表和自定义图标很适合访问一个项目的数据,但这两个都不允许在多个项目中快速创建一个比较图表.为了解 ...
- IdentityServer(12)- 使用 ASP.NET Core Identity
IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...