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是不同的方法,如果在这些方法之间使用共享变量来储存值,会存在线程安全问题。而使用过滤器实现则不存在此问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。