什么是HandlerInterceptorAdapter?
HandlerInterceptorAdapter 这个适配器是由Spring MVC提供的(org.springframework.web.servlet.handler.HandlerInterceptorAdapter)继承此类,可以非常方便的实现自己的拦截器,而且不仅可实现Filter的所有功能,还可以更精确的控制拦截精度(shiro中的拦截器可以说是基于此实现的)
它有三个方法:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
//preHandle在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制等处理;
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {
//在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView;
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {
//在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面),可以根据ex是否为null判断是否发生了异常,进行日志记录;
}
基于xml配置拦截器及使用
继承 HandlerInterceptorAdapter 实现请求之前拦截的方法
@Slf4j
public class HttpAclInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//..........权限验证代码
HandlerMethod handlerMethod = (HandlerMethod) handler;
AclAnnotaion aclAnnotaion = handlerMethod.getMethodAnnotation(AclAnnotaion.class);
return true;
}
配置xml
<!--启动注解驱动的spring mvc 功能-->
<mvc:annotation-driven/>
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**" />
<!-- 配置一些放行的资源不进行拦截 -->
<mvc:exclude-mapping path="/**/loginvid.dcw" />
<mvc:exclude-mapping path="/**/login.dcw" />
<mvc:exclude-mapping path="/**/international.dcw" />
<mvc:exclude-mapping path="/**/captcha.dcw" />
<mvc:exclude-mapping path="/**/getVersionInfo.dcw" />
<mvc:exclude-mapping path="/**/noAuthUrl.dcw" />
<!-- 注入该拦截的拦截策略的bean -->
<bean class="com.dcw.ivs.filter.HttpAclInterceptor" />
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
本文详细介绍了SpringMVC中的HandlerInterceptorAdapter类,解释了如何通过继承此类来实现自定义拦截器,包括preHandle、postHandle和afterCompletion三个关键方法的作用及应用场景,并提供了基于XML配置的拦截器实现示例。
&spm=1001.2101.3001.5002&articleId=102828543&d=1&t=3&u=85c95a9ddfdc4ba8a57c541432dda40f)
1790

被折叠的 条评论
为什么被折叠?



