Springmvc拦截器执行顺序及各方法作用详解
实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter,下面讲实现其接口的写法,先看一下这个接口的三个方法.
-方法preHandle:顾名思义,该方法将在请求处理之前进行调用,在controller之前执行。SpringMVC中的Interceptor是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,比如说获取cookie的值或者判断是否已经登录,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法。
-方法postHandle:由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。postHandle方法,顾名思义就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作,比如说设置cookie,返回给前端。postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行
-方法afterCompletion:该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
例:
@Component publicclassAuthInterceptorimplementsHandlerInterceptor{ privatestaticfinalStringTOKEN_COOKIE="token"; @Autowired privateUserDaouserDao; @Override publicbooleanpreHandle(HttpServletRequestreq,HttpServletResponseres,Objecthandler) throwsException{ Mapmap=req.getParameterMap(); map.forEach((k,v)->req.setAttribute(k,Joiner.on(",").join(v))); StringrequestURI=req.getRequestURI(); if(requestURI.startsWith("/static")||requestURI.startsWith("/error")){ returntrue; } Cookiecookie=WebUtils.getCookie(req,TOKEN_COOKIE); if(cookie!=null&&StringUtils.isNoneBlank(cookie.getValue())){ Useruser=userDao.getUserByToken(cookie.getValue()); if(user!=null){ req.setAttribute(CommonConstants.LOGIN_USER_ATTRIBUTE,user); UserContext.setUser(user); } } returntrue; } @Override publicvoidpostHandle(HttpServletRequestreq,HttpServletResponseres,Objecthandler, ModelAndViewmodelAndView)throwsException{ StringrequestURI=req.getRequestURI(); if(requestURI.startsWith("/static")||requestURI.startsWith("/error")){ return; } Useruser=UserContext.getUser(); if(user!=null&&StringUtils.isNoneBlank(user.getToken())){ Stringtoken=requestURI.startsWith("logout")?"":user.getToken(); Cookiecookie=newCookie(TOKEN_COOKIE,token); cookie.setPath("/"); cookie.setHttpOnly(false); res.addCookie(cookie); } } @Override publicvoidafterCompletion(HttpServletRequestreq,HttpServletResponseresponse,Objecthandler,Exceptionex) throwsException{ UserContext.remove(); } }
总结
以上所述是小编给大家介绍的Springmvc拦截器执行顺序及各方法作用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!