一:任务

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. Android Apk 瘦身大法

    原文地址: https://mp.weixin.qq.com/s/XS0tuLgTfyp4rW4h69wyQQ 一, 我们在多人开发项目 或者 遗留项目中开发时,会有些自己没用到的资源文件,但是自己也 ...

  2. Confluence 6 使用 Fail2Ban 来限制登录尝试

    什么是 Fail2Ban? 我们需要在我们网站中防止密码的暴利破解.Fail2Ban 是一个 Python 的应用来查看日志文件,使用的是正则表达式,同时还可以与Shorewall (或者 iptab ...

  3. Confluence 6 新 Confluence 安装配置一个数据源连接

    如果在你的 Tomcat 中配置了数据源,并且Confluence 设置指南在安装的时候检测到这个配置的时候,配置数据源的选项将会提供给你进行配置.入股你希望使用数据源,请参考下面的配置. 1. 停止 ...

  4. 【shell】两种字符串提取场景的实现

    shell虽然比batch顺眼点儿,但还是老话,入门容易,精通难. 1.场景一是这样的,现有字符串的内容 name: tiger; age:18; location:china; 需求:提取每个属性的 ...

  5. nginx代理跨域(mac)

    首先找到nginx.conf文件,修改并添加如下配置 html 文件 <!DOCTYPE html> <html lang="en"> <head&g ...

  6. 【层次聚类】python scipy实现

    层次聚类 原理 有一个讲得很清楚的博客:博客地址 主要用于:没有groundtruth,且不知道要分几类的情况 用scipy模块实现聚类 参考函数说明: pdist squareform linkag ...

  7. django----基于Form组件实现的增删改和基于ModelForm实现的增删改

    一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...

  8. bzoj 1951

    这道题告诉了我们一个很重要的道理:看到题,先想明白再动手! 题意:求对999911659取模的值 首先,由于n的数据范围不是很大(至少不是很大),所以可以O()枚举所有约数分别求组合数 但是有个问题: ...

  9. Ubuntu 更改屏幕分辨率

    安装完Ubuntu后发现分辨率不合适,平时习惯了看小一点的文字,所以搜了一下修改屏幕分辨率的命令,具体操作如下: 1.先用 xrandr 命令查看一下当前系统支持的分辨率 wayde@wayde-Al ...

  10. know yourself

    Know yourself! ------Socrates 麦穗 古希腊有一位大学者,名叫苏格拉底.一天,他带领几个弟子来到一块麦地边.那正是收获的季节,地里满是沉甸甸的麦穗.苏格拉底对弟子们说:“你 ...