SpringBoot拦截器原理解析及使用方法
拦截器简介
拦截器通常通过动态代理的方式来执行。
拦截器的生命周期由IoC容器管理,可以通过注入等方式来获取其他Bean的实例,使用更方便。
拦截器配置使用方式
实现拦截器接口:
importjava.io.IOException; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.springframework.web.servlet.HandlerInterceptor; importorg.springframework.web.servlet.ModelAndView; privateclassAuthenticationInterceptorimplementsHandlerInterceptor{ //在请求处理之前进行调用(Controller方法调用之前) @Override publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsIOException{ System.out.println(request.getRequestURL()); Useruser=(User)request.getSession().getAttribute("USER"); if(user!=null){ returntrue; }else{ System.out.println("nologin..."); //request.getRequestDispatcher("/index.html").forward(request,response); response.sendRedirect(request.getContextPath()+"login.html"); returnfalse; } returnfalse; } //在请求处理之后视图被渲染之前进行调用(Controller方法调用之后) @Override publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView){ System.out.println("postHandle..."); } //在请求结束之后、也就是视图被渲染之后进行调用(主要是用于进行资源清理工作) @Override publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){ System.out.println("afterCompletion..."); } }
将拦截器加入到配置中:
importorg.springframework.context.annotation.Configuration; importorg.springframework.web.servlet.config.annotation.InterceptorRegistration; importorg.springframework.web.servlet.config.annotation.InterceptorRegistry; importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration publicclassWebSecurityConfigimplementsWebMvcConfigurer{ @Override publicvoidaddInterceptors(InterceptorRegistryregistry){ registry.addInterceptor(newAuthenticationInterceptor()) //所有路径都被拦截 .addPathPatterns("/**") //添加不拦截的路径 .excludePathPatterns("/userLogin","/css/**","/images/**","/js/**","/login.html"); registry.addInterceptor(newOtherInterceptor()) .addPathPatterns("/**"); } }
备注:
由于preHandle、postHandle、afterCompletion是不同的方法,如果在这些方法之间使用共享变量来储存值,会存在线程安全问题。而使用过滤器实现则不存在此问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。