SpringBoot 中拦截器的简介及使用方式
程序员文章站
2022-03-08 14:14:03
拦截器简介 拦截器通常通过动态代理的方式来执行。 拦截器的生命周期由IoC容器管理,可以通过注入等方式来获取其他Bean的实例,使用更方便。 过滤器配置使用方式 实现拦截器接口: 将拦截器加入到配置中: 备注: 由于 preHandle、postHandle、afterCompletion 是不同的 ......
拦截器简介
- 拦截器通常通过动态代理的方式来执行。
- 拦截器的生命周期由ioc容器管理,可以通过注入等方式来获取其他bean的实例,使用更方便。
过滤器配置使用方式
实现拦截器接口:
import java.io.ioexception; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.web.servlet.handlerinterceptor; import org.springframework.web.servlet.modelandview; private class authenticationinterceptor implements handlerinterceptor { // 在请求处理之前进行调用(controller方法调用之前) @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws ioexception{ system.out.println(request.getrequesturl()); user user = (user)request.getsession().getattribute("user"); if(user != null){ return true; }else { system.out.println("no login..."); // request.getrequestdispatcher("/index.html").forward(request, response); response.sendredirect(request.getcontextpath()+"login.html"); return false; } return false; } // 在请求处理之后视图被渲染之前进行调用(controller方法调用之后) @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) { system.out.println("posthandle..."); } // 在请求结束之后、也就是视图被渲染之后进行调用(主要是用于进行资源清理工作) @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) { system.out.println("aftercompletion..."); } }
将拦截器加入到配置中:
import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.interceptorregistration; import org.springframework.web.servlet.config.annotation.interceptorregistry; import org.springframework.web.servlet.config.annotation.webmvcconfigurer; @configuration public class websecurityconfig implements webmvcconfigurer{ @override public void addinterceptors(interceptorregistry registry){ registry.addinterceptor(new authenticationinterceptor()) //所有路径都被拦截 .addpathpatterns("/**") //添加不拦截的路径 .excludepathpatterns("/userlogin", "/css/**", "/images/**", "/js/**", "/login.html"); registry.addinterceptor(new otherinterceptor()) .addpathpatterns("/**"); } }
备注:
由于 prehandle、posthandle、aftercompletion 是不同的方法,如果在这些方法之间使用共享变量来储存值,会存在线程安全问题。而使用过滤器实现则不存在此问题。
上一篇: 一身正气、两袖清风,包拯都做过哪些事?
下一篇: JavaScript监听触摸事件代码实例
推荐阅读
-
使用Numpy对特征中的异常值进行替换及条件替换方式
-
详解Angular.js中$http拦截器的介绍及使用
-
Web开发基础之JS中创建对象的方式及对象使用
-
android开发AIDL跨进程通信:AIDL中RemoteCallbackList的使用及权限验证方式详解
-
php中的OOP思想简介及如何使用oop面向对象实现一个’软件’
-
vue中lodash的简介、安装及_.cloneDeep(value)深拷贝的使用
-
如何在springboot中扩展springmvc的功能以及使用拦截器
-
jackson在springboot中的使用方式-自定义参数转换器
-
Springboot之restTemplate的配置及使用方式
-
正则表达式简介及在C++11中的简单使用教程