写点什么

SpringMVC 之拦截器

作者:andy
  • 2022-10-27
    北京
  • 本文字数:1712 字

    阅读完需:约 6 分钟

一、攔截器


拦截器就是用户通过客户端发送请求至服务器端,在服务器端控制层接收请求之前,建立的一个屏障,验证请求参数的有效性,保证用户请求服务得到正确回应。



图 拦截器示意图


Spring 拦截器由 org.springframework.web.servlet.HandlerInterceptor 接口定义功能,主要有以下方法:

控制层方法执行前调用

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception

控制层方法执行过程中调用

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception

控制层方法执行结束后调用

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception


二、拦截器定义


2.1、定义实现接口的子类


package org.fuys.own.sys;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;/** * define interceptor by HandlerInterceptor of spring-web module  * @author ys * */public class InterceptorSys implements HandlerInterceptor{	private Logger logger = LoggerFactory.getLogger(InterceptorSys.class);	@Override	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)			throws Exception {		logger.info("<<<<<< before method of controller >>>>>>" + handler.getClass());		return true;	}	@Override	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,			ModelAndView modelAndView) throws Exception {		logger.info("<<<<<< post method of controller >>>>>>" + handler.getClass());	}	@Override	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)			throws Exception {		logger.info("<<<<<< after method of controller >>>>>>" + handler.getClass());	}}
复制代码


2.2.、applicationContext-mvc.xml 文件配置拦截器信息


<mvc:interceptors>		<mvc:interceptor>			<mvc:mapping path="/**/*"/>			<bean class="org.fuys.own.sys.InterceptorSys"/>		</mvc:interceptor>	</mvc:interceptors>
复制代码


程序执行结果:


INFO  InterceptorSys - <<<<<< before method of controller >>>>>>class org.springframework.web.method.HandlerMethodINFO  GoalController - Goal is Goal [goalId=null, name=null, description=null, date=null]INFO  InterceptorSys - <<<<<< post method of controller >>>>>>class org.springframework.web.method.HandlerMethodINFO  InterceptorSys - <<<<<< after method of controller >>>>>>class org.springframework.web.method.HandlerMethod
复制代码


2.3、由以上执行结果得知,拦截器的程序控制主要涉及 org.springframework.web.method.HandlerMethod 和 org.springframework.core.MethodParameter 程序类,通过这两个程序类可得出控制层的类、类中的方法以及请求的参数等等信息,从而进行请求控制。


三、服务器端验证


拦截器对用户请求进行整体验证,需要考虑这些方面:

  • 用户提交的参数名称以及参数值

  • 具体的参数验证规则

常规来说,控制层需要接收合理的参数,那么,拦截器通常对参数的数据类型进行判断。如果需要更多的验证,可添加规则。

3.1、基本数据类型参数值有效性定义,可通过正则表达式实现

int:\d+

double:\d+(\.\d+)?

日期数据:\d{4}-\d{1,2}-\d{1,2}

3.2、字符串数据类型则可通过验证数据是否为空

3.3.、具体实现方式,可以根据需要进行设计,在此不做过多叙述。


四、上传文件验证


对上传文件进行验证,可以添加属性文件 validation.properties,配置验证规则。当需要对上传文件进行验证,则通过规则进行判断。


用户头像

andy

关注

还未添加个人签名 2019-11-21 加入

还未添加个人简介

评论

发布
暂无评论
SpringMVC之拦截器_andy_InfoQ写作社区