HandlerInterceptor简介
拦截器在SpringBoot项目开发十分常见,最常用的譬如登录拦截、权限校验、防重复提交、或是限制只有一台设备登录账号等,总之通过拦截器HandlerInterceptor可以实现各种各种的功能。
1.定义HandlerInterceptor类
想要在代码中定义一个HandlerInterceptor类其实十分简单,主要有两种方法:
1.类本身需要实现Spring的HandlerInterceptor接口的相关功能
2.类继承了已经实现了HandlerInterceptor接口的相关功能的类
2.HandlerInterceptor函数介绍
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
preHandle 请求处理之前进行调用(Controller方法调用之前),可以进行安全控制、权限校验等处理;
postHandle 请求处理之后进行调用(Controller方法调用之后),即调用了Service并返回ModelAndView,但未进行页面渲染,有机会修改ModelAndView;
afterCompletion 渲染了对应的视图之后执行(主要是用于进行资源清理工作),返回处理(已经渲染了页面);
3.jeesite拦截器简单实现
public class MobileInterceptor extends BaseService implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
if (modelAndView != null) {
// 如果是手机或平板访问的话,则跳转到手机视图页面。
if (UserAgentUtils.isMobileOrTablet(request)
&& !StringUtils.startsWithIgnoreCase(modelAndView.getViewName(), "redirect:")) {
modelAndView.setViewName("mobile/" + modelAndView.getViewName());
}
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
上图所示的代码是jeesite开发平台源码中一个MobileInterceptor拦截器的具体实现,下面我们进行深入分析:
1.首先MobileInterceptor继承了HandlerInterceptor接口类,并实现了preHandle()、postHandle()、afterCompletion()三个函数
2.MobileInterceptor拦截器在jeesite项目中主要实现的功能就是实现jeesite项目在手机端和PC端的界面UI可以做到自适应调整
3.由第二条需求可知,我们的需求实现应该是在请求页面之后,在页面渲染实现之前。由此可以判断出,我们具体的函数应该放到postHandle()函数中实现,因为postHandle()函数是调用了Service并返回ModelAndView,但未进行页面渲染。此时我们可以通过UserAgentUtils.isMobileOrTablet(request)判断用户登录的是手机端还是PC端,下面分成两种情况:1.如果是PC端,则不对ModelAndView做任何修改,即PC端是jeesite项目的默认访问形式;
2.如果是手机端,则通过调用ModelAndView.setViewName()函数,并将ModelAndView的值修改成"mobile/" + modelAndView.getViewName(),这样就完成了从PC端到手机端的UI界面的转化。