008 RestFul API 拦截器
一:任务
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 拦截器的更多相关文章
- spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别
今天学习一下RESTFul api拦截 大概有三种方式 一.通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求.在springboot中一般有两种配置方式. 这种过滤器拦截 ...
- 微信小程序api拦截器
微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大 ...
- SpringMVC【校验器、统一处理异常、RESTful、拦截器】
前言 本博文主要讲解的知识点如下: 校验器 统一处理异常 RESTful 拦截器 Validation 在我们的Struts2中,我们是继承ActionSupport来实现校验的...它有两种方式来实 ...
- JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器
1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...
- 三种实现日志过滤器的方式 (过滤器 (Filter)、拦截器(Interceptors)和切面(Aspect))
1.建立RequestWrapper类 import com.g2.order.server.utils.HttpHelper; import java.io.BufferedReader; impo ...
- .NET MVC4 ApiController拦截器的使用
目前在公司新开发了一个项目,第一次正式使用.NET MVC4来搭建,用拦截器来处理权限验证. 自定义拦截器需继承ActionFilterAttribute类,重写OnActionExecuting和O ...
- SpringBoot中过滤器、监听器以及拦截器
属于javax.servlet所提供的Api 拦截器原理 简单来讲是通过动态代理实现,被访问的目标方法通过代理类(方法)来执行,这样我们就可以在真正要执行的方法执行前.后做一些处理: 通过拦截器这种方 ...
- springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展
1.视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4 讲的比较的经典,后 ...
- SpringMVC第七篇【RESTful支持、拦截器】
RESTful支持 我们在学习webservice的时候可能就听过RESTful这么一个名词,当时候与SOAP进行对比的-那么RESTful究竟是什么东东呢??? RESTful(Representa ...
随机推荐
- 【原创】大叔经验分享(33)hive select count为0
hive建表后直接将数据文件拷贝到table目录下,select * 可以查到数据,但是select count(1) 一直返回0,这个是因为hive中有个配置 hive.stats.autogath ...
- ios NSTimer的强引用问题
在一个controller中,使用 NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest ...
- 机器学习之SVD分解
一.SVD奇异值分解的定义 假设是一个的矩阵,如果存在一个分解: 其中为的酉矩阵,为的半正定对角矩阵,为的共轭转置矩阵,且为的酉矩阵.这样的分解称为的奇异值分解,对角线上的元素称为奇异值,称为左奇异矩 ...
- selenium 获取input输入框中的值的方法
方法一:获取input的文本值 <input class="form-text-normal" id="txtName" name="Name& ...
- C语言实现split以某个字符分割一个字符串
方式一: 使用strtok # include <string.h> # include <stdio.h> void split(char *src,const char * ...
- Python GUI界面编程
常用GUI框架 wxPython 安装wxPython pip install -U wxPython C:\Users> pip install -U wxPython Collecting ...
- yslow V2 准则详细讲解
主要有12条: 1. Make fewer HTTP requests 尽可能少的http请求..我们有141个请求(其中15个JS请求,3个CSS请求,47个CSS background ima ...
- Eclipse编写ExtJS5卡死问题
本篇以eclipse为例,导入后在编译时很容易出现eclipse的卡死现象,这主要是js文件的校验引起的. 我们可通过如下方法进行配置: 打开该项目的.project文件,删除如下配置即可: < ...
- json如果不在pom中添加依赖会抛出500异常
所以必须添加以下依赖: <!--jackson相关依赖--><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson ...
- eclipse工具下hadoop环境搭建
eclipse工具下hadoop环境搭建: window10操作系统中搭建eclipse64开发系统,配置hadoop的eclipse插件,让eclipse可以查看Hdfs中的文件内容. ...