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 ...
随机推荐
- Android Apk 瘦身大法
原文地址: https://mp.weixin.qq.com/s/XS0tuLgTfyp4rW4h69wyQQ 一, 我们在多人开发项目 或者 遗留项目中开发时,会有些自己没用到的资源文件,但是自己也 ...
- Confluence 6 使用 Fail2Ban 来限制登录尝试
什么是 Fail2Ban? 我们需要在我们网站中防止密码的暴利破解.Fail2Ban 是一个 Python 的应用来查看日志文件,使用的是正则表达式,同时还可以与Shorewall (或者 iptab ...
- Confluence 6 新 Confluence 安装配置一个数据源连接
如果在你的 Tomcat 中配置了数据源,并且Confluence 设置指南在安装的时候检测到这个配置的时候,配置数据源的选项将会提供给你进行配置.入股你希望使用数据源,请参考下面的配置. 1. 停止 ...
- 【shell】两种字符串提取场景的实现
shell虽然比batch顺眼点儿,但还是老话,入门容易,精通难. 1.场景一是这样的,现有字符串的内容 name: tiger; age:18; location:china; 需求:提取每个属性的 ...
- nginx代理跨域(mac)
首先找到nginx.conf文件,修改并添加如下配置 html 文件 <!DOCTYPE html> <html lang="en"> <head&g ...
- 【层次聚类】python scipy实现
层次聚类 原理 有一个讲得很清楚的博客:博客地址 主要用于:没有groundtruth,且不知道要分几类的情况 用scipy模块实现聚类 参考函数说明: pdist squareform linkag ...
- django----基于Form组件实现的增删改和基于ModelForm实现的增删改
一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...
- bzoj 1951
这道题告诉了我们一个很重要的道理:看到题,先想明白再动手! 题意:求对999911659取模的值 首先,由于n的数据范围不是很大(至少不是很大),所以可以O()枚举所有约数分别求组合数 但是有个问题: ...
- Ubuntu 更改屏幕分辨率
安装完Ubuntu后发现分辨率不合适,平时习惯了看小一点的文字,所以搜了一下修改屏幕分辨率的命令,具体操作如下: 1.先用 xrandr 命令查看一下当前系统支持的分辨率 wayde@wayde-Al ...
- know yourself
Know yourself! ------Socrates 麦穗 古希腊有一位大学者,名叫苏格拉底.一天,他带领几个弟子来到一块麦地边.那正是收获的季节,地里满是沉甸甸的麦穗.苏格拉底对弟子们说:“你 ...