结合jeesite开发平台谈谈HandlerInterceptor拦截器的简单应用

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界面的转化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值