spring boo 拦截器教程推荐:http://lihao312.iteye.com/blog/2078139
自定义web请求参数校验拦截器,通过xml(request-validation.xml)配置url对应的字段进行校验,使校验代码通过配置文件分开,保持代码完整,更加符合领域驱动设计模式。
1.配置spring mvc的拦截器WebMvcConfigurerAdapter
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class WebMvcConfiguration extends WebMvcConfigurerAdapter { /** * 添加拦截器 */ public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new ValidationHandlerInterceptor()); } }
2、配置拦截器
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.whtr.nginf.infrastructure.util.JsonUtil; import com.whtr.nginf.infrastructure.web.validation.DateValidation; import com.whtr.nginf.infrastructure.web.validation.DatetimeValidation; import com.whtr.nginf.infrastructure.web.validation.DigitValidation; import com.whtr.nginf.infrastructure.web.validation.GEValidation; import com.whtr.nginf.infrastructure.web.validation.GTValidation; import com.whtr.nginf.infrastructure.web.validation.LEValidation; import com.whtr.nginf.infrastructure.web.validation.LTValidation; public class ValidationHandlerInterceptor implements HandlerInterceptor { public static Map<String, ValidationConfig> vcMap = new ConcurrentHashMap<>(); protected Map<String, ParameterValidation> validationMap = new ConcurrentHashMap<>(); public ValidationHandlerInterceptor() { //参数拦截拦截项参考附件 List<ParameterValidation> list = new ArrayList<>(); list.add(new StringNotBlankValidation()); list.add(new StringLengthValidation()); list.add(new DatetimeValidation()); list.add(new DateValidation()); list.add(new DigitValidation()); list.add(new NumberValidation()); list.add(new RegexValidation()); list.add(new GEValidation()); list.add(new GTValidation()); list.add(new LEValidation()); list.add(new LTValidation()); list.forEach((validation) -> validationMap.put(validation.getName(), validation)); if(validationMap.size() != list.size()) { throw new RuntimeException("验证器名称有重复,请检查"); } } /** * 预处理 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String url = request.getRequestURI(); ValidationConfig vc = vcMap.get(url); if(vc != null) { for(ValidationItem item : vc.getItems()) { ParameterValidation pv = validationMap.get(item.getType()); String value = request.getParameter(item.getName()); boolean result = pv.validation(value, item.getAttach()); if(!result) { /** * 验证失败,直接返回 */ response.setCharacterEncoding("UTF-8"); response.setContentType("application/json"); response.getWriter().write(JsonUtil.toJson(new ResponseResult(item.getMsg(), -1))); return false; } } } return true; } /** * */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //空方法 } /** * */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //空方法 } }
3、解析request-validation.xml,并且注册注册到拦截器
package com.whtr.nginf.application.initializer; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public final class ValidationInitializer { private ValidationInitializer() { throw new IllegalAccessError("Utility class"); } private static final Logger LOG = LoggerFactory.getLogger(ValidationInitializer.class); private static boolean initializationed = false; /** * doInitialization */ public static void doInitialization() { if (initializationed) { throw new RuntimeException("ValidationInitializer 已经初始化了"); } try { loadValidationConfig(); } catch (Exception e) { LOG.error(e.getMessage(),e); throw new RuntimeException("初始化验证配置出错", e); } initializationed = true; } /** * 加载配置 * @throws IOException * @throws ParserConfigurationException * @throws SAXException * * @throws Exception */ private static void loadValidationConfig() throws IOException, ParserConfigurationException, SAXException { try (InputStream input = ClassLoader.getSystemResourceAsStream("request-validation.xml")) { int count = 0; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(input); NodeList nl = doc.getElementsByTagName("validation"); for (int i = 0; i < nl.getLength(); i++) { Element node = (Element) nl.item(i); String enable = node.getAttribute("enable"); if (StringUtils.isBlank(enable) || "true".equals(enable)) { NodeList items = node.getElementsByTagName("item"); if (items.getLength() > 0) { ValidationConfig vc = new ValidationConfig(); vc.setId(node.getAttribute("id")); for (int index = 0; index < items.getLength(); index++) { Element item = (Element) items.item(index); vc.addItem(new ValidationItem(item.getAttribute("name"), item.getAttribute("type"), item.getAttribute("msg"), item.getAttribute("attach"))); } count++; ValidationHandlerInterceptor.vcMap.put(vc.getId(), vc); } } } if (ValidationHandlerInterceptor.vcMap.size() != count) { throw new RuntimeException("request-validation.xml 配置重复,请检查是否有相同的ID"); } LOG.info("读取配置成功,总共读取" + count + "个配置项"); } } }4、配置request-validate.xml
<?xml version="1.0" encoding="UTF-8"?> <validations> <validation id="/demo/list" enable="true"> <item name="orderKey" type="regex" msg="排序key只能是1、2、3" attach="[1|2|3]"/> <item name="clientType" type="digit" msg="clientType只能是整数" /> <item name="endDate" type="date" msg="结束日期错误,正确格式:(yyyy-MM-dd)" /> <item name="name" type="length" msg="用户名称长度不能超过10" attach="10"/> <item name="amount" type="gt" msg="本金必须大于0" attach="0"/> <item name="balance" type="number" msg="金额必须是数字" /> <item name="accountType" type="notBlank" msg="账户类型不能为空" /> </validation> <validation id="/demo/xxx" enable="true"> <item name="age" type="notBlank" msg="数据不能为空" /> </validation> </validations>
相关推荐
拦截器配置 @ControllerAdivce @ExceptionHandler @InitBinder @ModelAttribute 其他配置 ViewController 路径匹配参数配置 WebMvcConfigurerAdapter WebMvcConfigurer ...
1.25 Spring Boot 拦截器HandlerInterceptor 1.26 Spring Boot启动加载数据CommandLineRunner 1.27 Spring Boot环境变量读取和属性对象的绑定 1.28 Spring Boot使用自定义的properties 1.29 改变自动扫描的包 1.30 ...
- Spring Boot 基础知识,包括SpringBoot起步、配置详解、aop、filter、拦截器、监听、启动器、全局异常处理、外部Tomcat启动、HTTPS、监控 等。 - springboot-data - Spring Boot 数据库操作,包括SpringJDBC、...
springboot工程通过自定义response注解、java反射机制、自定义java拦截器、自定义功能类实现WebMvcConfigurer接口等功能,实现自定义规范化返回数据结构。
Mybatis自定义插件生成...通过拦截器拦截Mybatis的insert语句,通过自定义注解获取到主键,并为该主键赋值雪花ID,插入数据库中。 2、技术架构 项目总体技术选型 SpringBoot2.1.7 + Mybatis + Maven3.5.4 + Mysql + lom
因为这篇博客讲的是基于JWT和spring,springMVC的整合,所以如果有小伙伴想整合JWT和spring-boot,只需要将spring基于xml文件的拦截器配置方式转换成 spring-boot的配置方式就ok了。 欢迎大家讨论,分享!
新增全新的springboot2的框架技术点(代码位于当前仓库的spring-boot2-study目录下) 基于springboot 2.0.6.RELEASE版本实现的代码演示集合,欢迎使用star / fork 新子项目列表 介绍Springboot2【自动化单元测试】的...
spring-boot-starter-web     spring-boot-starter-test org.mybatis.spring.boot     mybatis-spring-boot-starter mysql:    &emsp...
spring-boot-starter-web     spring-boot-starter-test org.mybatis.spring.boot     mybatis-spring-boot-starter mysql:    &emsp...
Spring Boot实战(连接MySQL数据库+使用Spring Data Jpa+配置拦截器及实现跨域访问+整合Redis使用Docker部署Spring Boot项目+使用AOP的正确姿势+整合Mybatis并完成CRUD操作+整合 thymeleaf+整合 MyBatis (XML 版))
springboot spring aop 拦截器 注解方式实现脱敏(涉及到:pom.xml -->application.properties --->启动类-->拦截器)
项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存...
教程合集 项目地址 教程合集示例代码: : 教程合集示例代码(Spring Boot): ... Spring Boot配置拦截器拦截器 Spring Boot配置Servlet / Filter / Listener Spring Boot配置ViewController Spring Boot配置转换器
4.4.2 拦截器配置 89 4.4.3 @ControllerAdvice 91 4.4.4 其他配置 94 4.5 Spring MVC 的高级配置 98 4.5.1 文件上传配置 98 4.5.2 自定义HttpMessageConverter 101 4.5.3 服务器端推送技术 106 4.6 Spring MVC 的...
上手简单方便,自动帮你配置了很多东西,几行代码一个服务就跑起来了。抛弃了烦人的xml,连tomcat都自带了,直接编译出个jar包就能布署。已做了分页,拦截器,定时任务等功能模块
4.4.2 拦截器配置 89 4.4.3 @ControllerAdvice 91 4.4.4 其他配置 94 4.5 Spring MVC 的高级配置 98 4.5.1 文件上传配置 98 4.5.2 自定义HttpMessageConverter 101 4.5.3 服务器端推送技术 106 4.6 Spring MVC 的...
4.4.2 拦截器配置 89 4.4.3 @ControllerAdvice 91 4.4.4 其他配置 94 4.5 Spring MVC 的高级配置 98 4.5.1 文件上传配置 98 4.5.2 自定义HttpMessageConverter 101 4.5.3 服务器端推送技术 106 4.6 Spring MVC 的...
项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存...
包含druid数据源, druid的sql监控, druid过滤, mybatis xml配置, mybatis分页插件, logback日志配置, springboot多环境配置, 发送邮件, AOP拦截, 过滤器 spring拦截器, 全局异常, 统一响应, 自定义事务, 动态数据源...