一:任务

1.任务

  过滤器Filter

  拦截器Interceptor

  切片Aspect

二:过滤器

1.新建包

  

2.自定义过滤器程序

  加了注解,这个过滤器在springboot中就起作用了

 package com.cao.web.filter;

 import java.io.IOException;
import java.util.Date; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import org.springframework.stereotype.Component; //使得过滤器起作用
@Component
public class TimeFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("time filter init"); } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("time filter start");
//进行下一个调用链
long start=new Date().getTime();
chain.doFilter(request, response);
System.out.println("time filter 耗时: "+(new Date().getTime()-start));
System.out.println("time filter finish"); } @Override
public void destroy() {
System.out.println("time filter destroy"); } }

  将要访问的控制器

     @JsonView(User.UserDetailView.class)
@GetMapping(value="/{id:\\d+}")
public User getInfo(@PathVariable(value="id") String idid){
/**
* 演示filter调用
*/
System.out.println("进入getInfo服务"); System.out.println("idtt="+idid);
User user=new User();
user.setUsername("tom");
return user;
/**
* 下面的主要是演示Spring booter异常的处理机制,现在先注释掉
*/
// throw new UserNotExistException(idid); }

3.效果

  先启动,这个时候,过滤器一样会被启动

  

  进行访问

  

  效果

  

4.引用第三方Filter,加到过滤器链上

  在Spring boot上没有web.xml。

  新建一个过滤器,用于表示第三方的过滤器

 package com.cao.web.filter;

 import java.io.IOException;
import java.util.Date; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import org.springframework.stereotype.Component; /**
* 假设这里是一个第三方的Filter,用来演示
* @author dell
*
*/
public class TimeFilter2 implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("time filter init2"); } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("time filter start2");
//进行下一个调用链
long start=new Date().getTime();
chain.doFilter(request, response);
System.out.println("time filter2 耗时: "+(new Date().getTime()-start));
System.out.println("time filter finish2"); } @Override
public void destroy() {
System.out.println("time filter destroy2"); } }

  新建一个包,为config

  新建一个类,为配置类

 package com.cao.web.config;

 import java.util.ArrayList;
import java.util.List; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.cao.web.filter.TimeFilter2; /**
* 这里相当于在配置web.xml
* @author dell
*/ //说明这是一个配置类
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean timeFilter2() {
//加入Filter
FilterRegistrationBean registrationBean=new FilterRegistrationBean();
TimeFilter2 timeFilter2=new TimeFilter2();
registrationBean.setFilter(timeFilter2);
//起作用的url
List<String> url=new ArrayList<>();
url.add("/*");
registrationBean.setUrlPatterns(url);
//返回
return registrationBean; }
}

  启动

  

  访问

  

  发现,这里的服务只会走一次,外面包裹的是其过滤器的处理。

三:拦截器

1.过滤器的问题

  不知道是那个过滤器的哪个方法处理的。

  过滤器是Java EE提供的。

  拦截器是spring提供的。

  会拦截所有的控制器。

2.新建一个interception的包

  新建TimeInterception的程序

 package com.cao.web.config;

 import java.util.ArrayList;
import java.util.List; 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 com.cao.web.filter.TimeFilter2;
import com.cao.web.interceptor.TimeInterceptor; /**
* 这里相当于在配置web.xml
* @author dell
*/ //说明这是一个配置类
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{ //已经把TimeInterceptor变成了spring的一个组件了,现在需要autowired进来
@Autowired
private TimeInterceptor timeInterceptor; /**
* 这里是拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
super.addInterceptors(registry);
} /**
* 过滤器注册
* @return
*/
@Bean
public FilterRegistrationBean timeFilter2() {
//加入Filter
FilterRegistrationBean registrationBean=new FilterRegistrationBean();
TimeFilter2 timeFilter2=new TimeFilter2();
registrationBean.setFilter(timeFilter2);
//起作用的url
List<String> url=new ArrayList<>();
url.add("/*");
registrationBean.setUrlPatterns(url);
//返回
return registrationBean;
// return null;
}
}

  配置类

    因为只有一个Component的注解不能是的拦截器像过滤器一样可以工作

 package com.cao.web.interceptor;

 import java.util.Date;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
//使得成为Spring的组件
@Component
public class TimeInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle init");
//比过滤器的优势,有第三个参数,handler
System.out.println("类:"+((HandlerMethod)handler).getBean().getClass().getName());
System.out.println("方法:"+((HandlerMethod)handler).getMethod().getName()); //朝请求里添加属性
request.setAttribute("startTime", new Date().getTime());
return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle init");
//处理
Long start=(Long)request.getAttribute("startTime");
System.out.println("postHandle time interceptor 耗时: "+(new Date().getTime()-start)); } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion init");
} }

  访问效果

  

四:切片

1.问题

  拦截器也有问题,不能拿到方法的具体参数。

  也是spring的核心功能之一,AOP

2.步骤

  

3.添加pom

 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

4.新建包

  aspect包。

5.程序

  切片

 package com.cao.web.aspect;

 import java.util.Date;

 import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component; //切片
@Aspect
//成为spring容器的一部分
@Component
public class TimeAcpect {
@Around("execution(* com.cao.web.controller.UserController.*(..))")
public Object handleControlledrMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("time aspect start");
Object[] args=pjp.getArgs();
for(Object arg : args) {
System.out.println("args is "+arg);
}
//
long start=new Date().getTime();
Object object=pjp.proceed();
System.out.println("time aspect 耗时: "+(new Date().getTime()-start));
//
System.out.println("time aspect end"); return object;
}
}

  控制类

 @RequestMapping(value="/user/{id:\\d+}",method=RequestMethod.GET)
@JsonView(User.UserDetailView.class)
@GetMapping(value="/{id:\\d+}")
public User getInfo(@PathVariable(value="id") String idid){
/**
* 演示filter调用
*/
System.out.println("进入getInfo服务"); System.out.println("idtt="+idid);
User user=new User();
user.setUsername("tom");
return user;
/**
* 下面的主要是演示Spring booter异常的处理机制,现在先注释掉
*/
// throw new UserNotExistException(idid); }

6.效果

  访问

  

  控制台:

  

五:先后之行顺序

1.顺序

  上完上面的示例,应该没有问题了,这里使用一个图做一个总结。

  具体的文字就不再描述了,不懂的话,可以看上面的控制台效果

  

  

008 RestFul API 拦截器的更多相关文章

  1. spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别

    今天学习一下RESTFul api拦截 大概有三种方式 一.通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求.在springboot中一般有两种配置方式. 这种过滤器拦截 ...

  2. 微信小程序api拦截器

    微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大 ...

  3. SpringMVC【校验器、统一处理异常、RESTful、拦截器】

    前言 本博文主要讲解的知识点如下: 校验器 统一处理异常 RESTful 拦截器 Validation 在我们的Struts2中,我们是继承ActionSupport来实现校验的...它有两种方式来实 ...

  4. JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器

    1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...

  5. 三种实现日志过滤器的方式 (过滤器 (Filter)、拦截器(Interceptors)和切面(Aspect))

    1.建立RequestWrapper类 import com.g2.order.server.utils.HttpHelper; import java.io.BufferedReader; impo ...

  6. .NET MVC4 ApiController拦截器的使用

    目前在公司新开发了一个项目,第一次正式使用.NET MVC4来搭建,用拦截器来处理权限验证. 自定义拦截器需继承ActionFilterAttribute类,重写OnActionExecuting和O ...

  7. SpringBoot中过滤器、监听器以及拦截器

    属于javax.servlet所提供的Api 拦截器原理 简单来讲是通过动态代理实现,被访问的目标方法通过代理类(方法)来执行,这样我们就可以在真正要执行的方法执行前.后做一些处理: 通过拦截器这种方 ...

  8. springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展

    1.视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4 讲的比较的经典,后 ...

  9. SpringMVC第七篇【RESTful支持、拦截器】

    RESTful支持 我们在学习webservice的时候可能就听过RESTful这么一个名词,当时候与SOAP进行对比的-那么RESTful究竟是什么东东呢??? RESTful(Representa ...

随机推荐

  1. 关于socket.io获取客户端真实IP地址

    1 前言 由于使用了CDN加速,导致了socket.handshake.address拿到值都是服务器的,而没有使用CDN加速时,可以拿到客户端真实IP. 2 代码 if(socket.handsha ...

  2. Spring通过SchedulerFactoryBean实现调度任务的配置(定时器)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. cocos2d内存管理,类的生命周期

    下面资料来自<Cocos2d-x之Lua核心编程>

  4. 深入Golang之sync.Pool详解

    我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池. sync.Pool ...

  5. JdbcUtil

    package com.todaytech.pwp.core.exception; public class BizException extends RuntimeException { publi ...

  6. UINavigationController 、navigationBar 、 UINavigationItem、UIBarButtonItem之间的关系

  7. centos7查看yum安装的软件及路径

    rpm -qa 查看所有已安装软件名称 rpm -ql 软件名 显示软件的安装路径

  8. CentOS 7 安装 Redis

    1.Redis 下载地址:https://redis.io/download 2.上传到服务器指定文件夹 ,我这边传到了根目录下 /mysoft 这个目录下 解压  tar  -zxvf redis- ...

  9. 【Vue】组件watch props属性值

    转载: https://www.cnblogs.com/mqxs/p/8972368.html #HTML <div id="example"> <p> & ...

  10. 简单(基本)的风光摄影照片后期处理-新手教程-ps照片后期基本处理

    前言 Photoshop虽然不是万能的,但缺少Photoshop却是万万不能的!风光摄影不是一个记录过程,做到的不能仅仅是“拍到了”,我觉得应该是一个创作的过程,特别是在后期处理的过程中,创作意味更浓 ...