前言
springmvc有两个常见的AOP实现。
1 .过滤器(过滤器)。
2 .拦截(拦截器)。
本篇面对着刚刚接触springboot的人们
因此,我们主要介绍过滤器和拦截器的简单实现及其区别
(一些复杂的功能稍后会发表文章,请关注)
过滤器的简单实现
正如文字所示,过滤器是过滤角色,用于过滤web开发中指定的url
那么你能帮我过滤什么呢?
它的功能会更多:
例如,拦截过我们不需要的接口的请求
修改请求和响应的内容
CORS跨域请求的完成等
现在让我们来做一个简单的过滤器:
可以创建新的过滤器包。 随着项目的扩大,过滤器也会增加
在此新建了TestFilter类,实现了Filter接口
@Component
@webfilter(URLpatterns='/blogs ',filterName='blosTest ' )。
publicclasstestfilterimplementsfilter { }
我们一步一步来
1.@Component是将这个等级注入IOC容器
2.@ web filter (URL patterns='/blogs ',filterName='blosTest ' )这是监听到的URL为/blogs、过滤器名称为blogsTest的web filter
发布实现接口后的三种重构方法。
@Override
公共void init (过滤器配置文件配置) throws ServletException {
}
@Override
publicvoiddofilter (servletrequestservletrequest,ServletResponse servletResponse,过滤器通道过滤器通道) throws IOException
http servlet请求=(http servlet请求) servlet请求;
http servlet响应=(http servlet响应) servlet响应;
System.out.printf ('过滤器实现');
filter chain.do filter (请求,响应;
}
@Override
公共语音目录
}
初始化(init )和破坏)的方法一般不使用。 具体来说,看看源代码就知道了
doFilter ()是过滤器的核心
注意:在实现接口方法后,将request和response类型转换为http servlet。 如果不进行转换,以下操作可能会发生错误:
如果过滤器通过,请运行filter chain.do filter (请求,响应)。
显示这个url通过了我们的过滤器
正如您所见,我们只在一个类中实现了简单的过滤器
当然,可以在没有注释的情况下设置启动类
//过滤器
@Bean
publicfilterregistrationbeanfilterregistrationbean {
filterregistrationbeanfilterregistrationbean=newfilterregistrationbean (;
List urlPatterns=new ArrayList (;
testfiltertestfilter=new test filter (; //new过滤器
URLpatterns.add(/blogs ); //指定要过滤的url
filterregistrationbean.set filter (测试过滤器;//集
filterregistrationbean.set URL patterns (URL patterns;//集
return filterRegistrationBean;
}
这也可以,但本人其实建议用这种方式添加过滤器
Interceptor的简单实现
拦截器的实现比过滤器稍微复杂一些
我们也可以制作新的interceptor包
smdxs创建一个名为MyInterceptor的新类
p>public class MyInterceptor implements HandlerInterceptor {}这个类实现了HandleInterceptor接口
直接贴类代码,我会在代码中注释功能
public class MyInterceptor implements HandlerInterceptor {
//在请求处理之前进行调用(Controller方法调用之前
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.printf("preHandle被调用");
return true; //如果false,停止流程,api被拦截
}
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle被调用");
}
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion被调用");
}
}
它依次实现了三个方法
相比过滤器,拦截器还需要在springmvc中注入
所以我们打开启动类,写入以下代码
public class WarApplication {
public static void main(String[] args) {
SpringApplication.run(WarApplication.class, args);
}
//mvc控制器
//@Configuration
static class WebMvcConfigurer extends WebMvcConfigurerAdapter{
//增加拦截器
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new MyInterceptor()) //指定拦截器类
.addPathPatterns("/Handles"); //指定该类拦截的url
}
}
}
这里我在/Handles这个url中进行拦截
代码写完了,来看下结果
当进入指定url时,我们执行到了拦截器
接下来就可以根据需求去使用拦截器了
区别
过滤器和拦截器非常相似,但是它们有很大的区别
最简单明了的区别就是过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法
区别很多,大家可以去查下
总的来说
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程
以上这篇详谈springboot过滤器和拦截器的实现及区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。