`

springmvc拦截器

 
阅读更多

拦截器源代码如下

public interface 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;

}

 

先来看看这个方法boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler),里面有一个handler,其实它属于HandlerMethod。

 

       public Object getBean() {
       //获得要操作控制层
		return this.bean;
	}

	public Method getMethod() {
      //获得要操作的方法
		return this.method;
	}
       public MethodParameter[] getMethodParameters() {
      //获得要操作的参数
		return this.parameters;
	}

 

所以此方法是在前置控制器后,真实控制器之前进行操作的。

而postHandle里面含有ModleAndView,这个是在真实控制器操作之后进行的。

先编写正则验证类,此类把构造器私有化,所有的验证方法都是类方法。

 

import org.springframework.util.StringUtils;

/** 
*  类说明 专门对数据格式进行认证
*  @author rfk
*/
public class ValueRuleValidator {
	private ValueRuleValidator() {}
	/**
	 * 使用正则验证数据是否为整数
	 * @param str 需要验证的数据
	 * @return 如果数据全部为数字,返回为真,否则返回为假
	 */
	public static boolean isInt(String str) {
		if(!StringUtils.isEmpty(str)) {
			return str.matches("\\d+");
		}
		return false;
	}
	/**
	 * 使用正则验证数据是否为long类型
	 * @param str 需要验证的数据
	 * @return 需要验证的数据如果全部是数字返回为true,否则返回为false
	 */
	public static boolean isLong(String str) {
		return isInt(str);
	}
	/**
	 * 使用正则验证数据是否为double类型
	 * @param str 需要验证的数据
	 * @return 需要验证的数据如果为Double类型返回为true,否则返回为false
	 */
	public static boolean isDouble(String str) {
		if(!StringUtils.isEmpty(str)) {
			return str.matches("\\d+(\\.\\d+)?");
		}
		return false;
	}
	/**
	 * 使用正则验证数据是否为date类型
	 * @param str 需要验证的数据
	 * @return 如果验证的数据为xxxx-xx-xx类型返回为true,否则返回为false,传输过来的数据需要在前面处理成xxxx-xx-xx类型
	 */
	public static boolean isDate(String str) {
		if(!StringUtils.isEmpty(str)) {
			return str.matches("\\d{4}-\\d{2}-\\d{2}");
		}
		return false;
	}
	/**
	 * 使用正则验证数据是否为xxxx-xx-xx xx:xx:xx类型
	 * @param str 需要验证的数据
	 * @return 验证的数据符合标准格式返回为true,否则返回为false
	 */
	public static boolean isDateTime(String str) {
		if(!StringUtils.isEmpty(str)) {
			str.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
		}
		return false;
	}
	/**
	 * 验证用户输入的验证码和后台验证码是否一致
	 * @param str 用户输入的验证码
	 * @param rand 后台获得的验证码
	 * @return 如果验证码一致,返回为true,否则返回为false;
	 */
	public static boolean isRand(String str,String rand) {
		if(!StringUtils.isEmpty(str) && !StringUtils.isEmpty(rand)) {
			return str.equalsIgnoreCase(rand);
		}
		return false;
	}
	/**
	 * 判断数据是否为boolean类型
	 * @param str 需要验证的数据
	 * @return 如果数据为boolen类型,返回为true,否则为false;
	 */
	public static boolean isBoolean(String str) {
		if(!StringUtils.isEmpty(str)) {
			return "true".equalsIgnoreCase(str)||"false".equalsIgnoreCase(str);
		}
		return false;
	}
	/**
	 * 
	 * @param rule 编写的规则
	 * @param contentType  传输数据类型
	 * @return
	 */
	public static boolean isPhoto(String rule,String contentType) {
		if(!StringUtils.isEmpty(rule)&&!StringUtils.isEmpty(contentType)) {
			String result [] =rule.split("\\|");
			for(int x=0;x<result.length;x++) {
				if(contentType.equalsIgnoreCase(result[x]))
					return true;
			}
		}
		return false;
	}
}

 

 然后编写一个数据验证类,此类主要是针对常用数据判断;

 

/**
 * 类说明
 * 
 * @author rfk
 */
public class ValidationUtil {
	private HttpServletRequest request;
	private String rule;
	private MessageSource message;
	private Map<String, String> map = new HashMap<>();

	public ValidationUtil(HttpServletRequest request, String rule, MessageSource message) {
		this.request = request;
		this.rule = rule;
		this.message = message;
		this.handleValidateion();
	}
	/**
	 * 
	 * @return 返回验证的错误信息
	 */
	public Map<String, String> getErrors() {
		return this.map;
	}

	/**
	 * 进行数据验证
	 */
	private void handleValidateion() {
		String[] result = rule.split("//|");
		for (int x = 0; x < result.length; x++) {
			String[] temp = result[x].split(":");
			String parameterValue = this.request.getParameter(temp[0]);
			switch (temp[1]) {
			case "int":
				//int.msg=验证的数据不是int类型
				if (!ValueRuleValidator.isInt(parameterValue)) {
					this.map.put(temp[0], this.message.getMessage("int.msg", null, null));
				}
				break;
			case "long":
				if (!ValueRuleValidator.isLong(parameterValue)) {
					this.map.put(temp[0], this.message.getMessage("long.msg", null, null));
				}
				break;
			case "double":
				if (!ValueRuleValidator.isDouble(parameterValue)) {
					this.map.put(temp[0], this.message.getMessage("int.msg", null, null));
				}
				break;
			case "string":
				if (!StringUtils.isEmpty(parameterValue)) {
					this.map.put(temp[0], this.message.getMessage("string.msg", null, null));
				}
				break;
			case "date":
				if (!ValueRuleValidator.isDate(parameterValue)) {
					this.map.put(temp[0], this.message.getMessage("date.msg", null, null));
				}
				break;
			case "datatime":
				if (!ValueRuleValidator.isDateTime(parameterValue)) {
					this.map.put(temp[0], this.message.getMessage("datetime.msg", null, null));
				}
				break;
			case "rand":
				if (!ValueRuleValidator.isRand(parameterValue,
						(String) this.request.getSession().getAttribute("rand"))) {
					this.map.put(temp[0], this.message.getMessage("rand.msg", null, null));
				}
				break;
			case "boolean":
				if (!ValueRuleValidator.isBoolean(parameterValue)) {
					this.map.put(temp[0], this.message.getMessage("boolean.msg", null, null));
				}
				break;
			}
		}
	}
}

 

编写一个文件上传的类,主要是针对上传文件进行判断

public class FileValidationUtil {
	private HttpServletRequest request;
	private MultipartResolver multipartResolver;
	private String key;
	private MessageSource messageSource;
	private Map<String, String> errors = new HashMap<>();
	/**
	 * 
	 * @param request  
	 * @param multipartResolver 封装后的表单
	 * @param key 验证的规则
	 * @param messageSource 国际化资源读取类
	 */
	public FileValidationUtil(HttpServletRequest request, MultipartResolver multipartResolver, String key,
			MessageSource messageSource) {
		super();
		this.request = request;
		this.multipartResolver=new CommonsMultipartResolver();
		this.key = key;
		this.messageSource = messageSource;
	}

	public void validateMime() {
		if (this.multipartResolver.isMultipart(request)) {
			String rule = this.messageSource.getMessage(this.key, null, null);
			if (request instanceof DefaultMultipartHttpServletRequest) {
				DefaultMultipartHttpServletRequest newRequest = (DefaultMultipartHttpServletRequest) request;
				Map<String, MultipartFile> filemap = newRequest.getFileMap();
				if (filemap.size() > 0) {
					Iterator<Map.Entry<String, MultipartFile>> iterator = filemap.entrySet().iterator();
					while (iterator.hasNext()) {
						Map.Entry<String, MultipartFile> mEntry = iterator.next();
						if (mEntry.getValue().getSize() > 0) {
							if (!ValueRuleValidator.isPhoto(rule, mEntry.getValue().getContentType())) {
								this.errors.put(mEntry.getKey(),
										messageSource.getMessage(this.key + "error", null, null));
							}
						}
					}

				}
			}
		}

	}
	public Map<String, String> getErrors() {
		return this.errors;
	}

}

 

编写拦截器

 

public class VaildationInterceptor implements HandlerInterceptor {
	private static final Log log = LogFactory.getLog(VaildationInterceptor.class);
	@Resource
	private MessageSource message;

	/**
	 * 此方法主要是在org.springframework.web.servlet.DispatcherServlet之后,Controller进行数据验证
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		if (handler instanceof HandlerMethod) {
			HandlerMethod newHandler = (HandlerMethod) handler;
			// 拼接出资源文件读取的key,例如 emp.add
			String key = newHandler.getBean().getClass().getSimpleName() + "." + newHandler.getMethod();
			// 根据key获得规则,比如emp.add=id:int|name:string|biredate:date
			String rule = this.message.getMessage(key, null, null);
			if (rule != null) {
				// 进行数据的认证,此处主要是标准数据的认证
				ValidationUtil validat = new ValidationUtil(request, rule, message);
				//基本数据验证,如果有错误返回为false
				/* ValidationUtil validat = new ValidationUtil(request, rule, message);
				 * FileValidationUtil fileValidationUtil =new FileValidationUtil(request, key, message);
				 * if (validat.getErrors().size() > 0 ||fileValidationUtil.getErrors().size() > 0 ) {
				 * 		if(validat.getErrors().size() > 0){
				 * 			//怎么做
				 * 			}
				 * 		if(fileValidationUtil.getErrors().size() > 0){
				 * 			//怎么做
				 * 			}
				 * 		if(validat.getErrors().size() > 0 &&fileValidationUtil.getErrors().size() > 0 ){
				 * 			//怎么做。
				 * 		} 
					// 有数据没有通过认证,讲数据放到errors里面
					request.setAttribute("errors", validat.getErrors());
					String errorsUrl = null;
					try {
						// 例如emp.add.err.page页面就是数据增加的页面
						errorsUrl = this.message.getMessage(key + ".error.page", null, null);
					} catch (Exception e) {
						errorsUrl = this.message.getMessage("error.page", null, null);
						log.error(e);
					}
					request.getRequestDispatcher(errorsUrl).forward(request, response);
					return false;
				}
				 */
				if (validat.getErrors().size() > 0) {
					// 有数据没有通过认证,讲数据放到errors里面
					request.setAttribute("errors", validat.getErrors());
					String errorsUrl = null;
					try {
						// 例如emp.add.err.page页面就是数据增加的页面
						errorsUrl = this.message.getMessage(key + ".error.page", null, null);
					} catch (Exception e) {
						errorsUrl = this.message.getMessage("error.page", null, null);
						log.error(e);
					}
					request.getRequestDispatcher(errorsUrl).forward(request, response);
					return false;
				}else {
					//基本数据判断无错误,肯定进入此处,所以此处需要判断是否有错误,有错误返回false,无错误返回true
					/*本来想讲此处验证放到ValidationUtil validat = new ValidationUtil(request, rule, message);后面
					 * 后来发现如果放在他后面,判断错误使用||判断后,在放入错误时候仍然需要判断
					 */
					FileValidationUtil fileValidationUtil =new FileValidationUtil(request, key, message);
					if(fileValidationUtil.getErrors().size()>0) {
						request.setAttribute("errors", validat.getErrors());
						String errorsUrl = null;
						try {
							// 例如emp.add.err.page页面就是数据增加的页面
							errorsUrl = this.message.getMessage(key + ".error.page", null, null);
						} catch (Exception e) {
							errorsUrl = this.message.getMessage("error.page", null, null);
							log.error(e);
						}
						request.getRequestDispatcher(errorsUrl).forward(request, response);
						return false;
					}
					return true;
				}
			}
		}
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		//此方法主要是在controller之后进行,所以此处可以获得modlerAndview
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		//最后执行
	}

}

 

分享到:
评论

相关推荐

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    在本文中,我们讨论了三种解决SpringMVC拦截器拦截静态资源文件的方法,并对这些方法的优劣进行了分析。 方案一是在拦截器中排除静态资源路径。在SpringMVC的配置文件中(通常是spring-mvc.xml),可以通过配置元素...

    springMVC拦截器项目

    SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...

    SpringMVC拦截器源代码.zip

    这个名为“SpringMVC拦截器源代码.zip”的压缩包可能包含了Spring MVC拦截器的实现源码,这对于理解和学习如何自定义拦截器以增强应用功能非常有帮助。 1. **拦截器的基本概念** - 拦截器是AOP(面向切面编程)的...

    SpringMVC拦截器

    ### SpringMVC拦截器 #### 一、拦截器概述 拦截器(Interceptor)是一种轻量级、低侵入式的AOP实现方式,在SpringMVC框架中有着广泛的应用。它主要用于处理那些与业务逻辑无关但又频繁出现的功能需求,如日志记录...

    springmvc 拦截器

    如果一个请求被拦截器链中的某个拦截器阻止,后面的拦截器都不会被执行。 8. **应用场景** - 权限验证:在请求到达Controller之前检查用户是否有权限访问。 - 日志记录:记录用户的请求信息,便于跟踪和调试。 -...

    SpringMvc 拦截器

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的逻辑。它们可以用来实现通用的功能,如权限验证、日志记录、性能统计等,避免在每个控制器方法中重复编写...

    企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告.docx

    本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能访问特定的受保护资源。 首先,我们来看一下实验的基本步骤: 1. 创建 `User` 类:这是表示用户...

    SpringMVC 拦截器 实现 登录退出功能

    综上所述,本项目是一个适合初学者了解和实践SpringMVC拦截器功能的小程序。通过学习和实践,你可以掌握如何使用拦截器实现登录验证和安全退出,同时加深对Intelli IDEA的使用理解。在实际应用中,拦截器常用于权限...

    SpringMVC拦截器源码.rar

    SpringMVC拦截器是基于AOP(面向切面编程)的概念实现的,它们遵循HandlerInterceptor接口。这个接口定义了三个方法: 1. `preHandle`: 在请求被处理器处理之前调用,返回`true`表示继续执行处理器,`false`则中断...

    SpringMVC拦截器实现登录认证

    SpringMVC拦截器是实现登录认证的一种常见方法,它允许开发者在请求被实际处理之前或之后执行特定的逻辑。本文将深入探讨如何利用SpringMVC拦截器来实现这一功能。 首先,了解SpringMVC的核心组件是必要的。...

    SpringMVC拦截器例子详解

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的逻辑。它们可以用来实现通用的功能,如权限验证、日志记录、性能统计等,避免在每个控制器方法中重复代码...

    使用SessionListener+持久化Session+Springmvc拦截器实现单点登录

    在这个过程中,`SessionListener`、持久化`Session`和`Springmvc拦截器`是关键组件,让我们逐一深入探讨。 ### SessionListener `SessionListener`是Java Servlet API中的一个接口,用于监听`HttpSession`事件。...

    SpringMVC拦截器实现单点登录

    SpringMVC 拦截器实现单点登录是一种常见的安全控制机制,主要用于确保在同一时间只有一个用户能够使用同一账号进行操作。这种功能在多用户、多设备登录的环境中尤为重要,可以防止用户账号被盗用或者误操作。 单点...

    springMVC拦截器

    SpringMVC 拦截器是 Spring MVC 框架中的一个重要组成部分,它允许开发者在控制器处理请求之前或之后执行自定义逻辑。拦截器可以用于实现登录检查、权限验证、日志记录、性能监控等多种功能。本文将详细介绍 ...

    11SpringMVC拦截器.md

    11SpringMVC拦截器.md

    springmvc拦截器入门实例.zip

    SpringMVC 拦截器(HandlerInterceptor)是 SpringMVC 框架中的一个重要组成部分,它在请求处理之前、之后以及视图渲染之前执行,提供了预处理和后处理的功能。这个入门实例是为了帮助开发者理解如何在实际项目中...

    SpringMVC拦截器配置及运行流程解析

    SpringMVC拦截器配置及运行流程解析 SpringMVC拦截器是指在SpringMVC框架中,用于拦截和处理请求的组件。拦截器可以在请求处理之前、之后或抛出异常时执行某些操作,例如身份验证、日志记录、异常处理等。SpringMVC...

    springMVC拦截器HandlerInterceptor用法代码示例

    "springMVC拦截器HandlerInterceptor用法代码示例" springMVC拦截器HandlerInterceptor是一种非常重要的技术,它可以帮助我们拦截用户的请求,从而知道页面请求的是哪个class的哪个方法。本文将详细介绍springMVC...

Global site tag (gtag.js) - Google Analytics