SpringBoot拦截器原理解析及使用方法
程序员文章站
2022-03-20 13:43:46
拦截器简介拦截器通常通过动态代理的方式来执行。拦截器的生命周期由ioc容器管理,可以通过注入等方式来获取其他bean的实例,使用更方便。拦截器配置使用方式实现拦截器接口:import java.io....
拦截器简介
拦截器通常通过动态代理的方式来执行。
拦截器的生命周期由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 是不同的方法,如果在这些方法之间使用共享变量来储存值,会存在线程安全问题。而使用过滤器实现则不存在此问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: PHP实现的操作数组类库定义与用法示例
推荐阅读