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 ...
随机推荐
- 关于socket.io获取客户端真实IP地址
1 前言 由于使用了CDN加速,导致了socket.handshake.address拿到值都是服务器的,而没有使用CDN加速时,可以拿到客户端真实IP. 2 代码 if(socket.handsha ...
- Spring通过SchedulerFactoryBean实现调度任务的配置(定时器)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- cocos2d内存管理,类的生命周期
下面资料来自<Cocos2d-x之Lua核心编程>
- 深入Golang之sync.Pool详解
我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池. sync.Pool ...
- JdbcUtil
package com.todaytech.pwp.core.exception; public class BizException extends RuntimeException { publi ...
- UINavigationController 、navigationBar 、 UINavigationItem、UIBarButtonItem之间的关系
- centos7查看yum安装的软件及路径
rpm -qa 查看所有已安装软件名称 rpm -ql 软件名 显示软件的安装路径
- CentOS 7 安装 Redis
1.Redis 下载地址:https://redis.io/download 2.上传到服务器指定文件夹 ,我这边传到了根目录下 /mysoft 这个目录下 解压 tar -zxvf redis- ...
- 【Vue】组件watch props属性值
转载: https://www.cnblogs.com/mqxs/p/8972368.html #HTML <div id="example"> <p> & ...
- 简单(基本)的风光摄影照片后期处理-新手教程-ps照片后期基本处理
前言 Photoshop虽然不是万能的,但缺少Photoshop却是万万不能的!风光摄影不是一个记录过程,做到的不能仅仅是“拍到了”,我觉得应该是一个创作的过程,特别是在后期处理的过程中,创作意味更浓 ...