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>
相关推荐
3. **扩展性强**:支持自定义过滤器(Filter)、拦截器(StatInterceptor)等,方便扩展功能。 4. **健康检查**:自动检测连接的有效性,避免因长时间无操作导致的连接失效问题。 5. **SQL解析**:Druid能解析SQL...
- 自定义拦截器:通过实现`Interceptor`接口,可以定制SQL执行前后的处理逻辑。 4. **Linux环境下的部署**: - 下载:在官方仓库或第三方平台找到"spring-boot-starter-mybatis-spring-boot-3.0.0.tar.gz",并...
拦截器配置 @ControllerAdivce @ExceptionHandler @InitBinder @ModelAttribute 其他配置 ViewController 路径匹配参数配置 WebMvcConfigurerAdapter WebMvcConfigurer ...
但需要注意,Dubbo本身并不支持异步调用,如果需要在Spring Boot中实现异步调用Dubbo服务,通常需要自定义拦截器或采用消息中间件等方式进行改造。 五、监控与日志 Dubbo提供了监控中心,可以实时查看服务调用情况...
2. ** starters**:Spring Boot的特性通过一系列的starters来提供,如`spring-boot-starter-data-jpa`用于JPA支持,`spring-boot-starter-web`用于Web服务。 3. **自动配置**:Spring Boot通过条件注解和组件扫描...
5. SQL拦截器:通过自定义拦截器,可以对SQL进行日志记录、性能监控等操作,提高系统的可维护性和可追踪性。 6. 健康检查:Druid支持连接健康检查,定期检测并关闭无效的连接,保证数据库连接的质量。 五、实际使用...
这个“spring-boot.zip”压缩包包含了一个使用Maven构建的Spring Boot工程模板,它整合了多种实用功能,如Swagger用于API文档,以及过滤器、拦截器、监听器和Servlet等核心组件。 1. Maven:Maven 是一个项目管理...
Spring Boot是基于Spring框架的快速开发工具,它通过自动化配置简化了Spring应用的初始化和配置过程。Druid则是一个强大的数据库连接池,它不仅提供基本的数据库连接池功能,还集成了监控、SQL解析、拦截器等功能,...
4. **spring-aop**: 实现了面向切面编程(AOP),允许定义方法拦截器和切面,用于实现如日志、事务管理等功能。 5. **spring-web**: 为Web应用提供支持,包括HTTP多部分请求处理、Servlet监听器等。 6. **spring-web...
这可以通过在Spring配置文件中声明拦截器并将其绑定到Bus或Endpoint来实现。 ```xml ``` 5. **测试客户端**:`cxfTestClient`可能是用来测试服务的CXF测试客户端。它可以生成并运行SOAP请求,帮助...
3. **过滤器链**:Spring Security 的核心是Filter Security Interceptor(过滤器安全拦截器)和Access Decision Manager(访问决策管理器)。过滤器链处理HTTP请求,进行身份验证和授权检查,而访问决策管理器根据...
5. 配置MyBatis Plus:在Spring Boot的配置类中,添加MyBatis Plus的相关配置,如全局配置、拦截器等。 四、使用MyBatis Plus进行数据操作 1. CRUD操作:通过继承BaseMapper的接口,可以直接调用insert、update、...
MyBatis-Spring-Boot支持MyBatis的插件机制,可以在拦截器中添加自定义逻辑,如日志记录、性能分析等。只需要在配置中声明插件,MyBatis就会自动应用。 **8. 分页支持** MyBatis-Spring-Boot可以配合分页插件(如...
Spring Boot允许开发者自定义MVC配置,例如添加拦截器: 1. **创建拦截器**:实现`HandlerInterceptor`接口,重写相关方法,如`preHandle`、`postHandle`和`afterCompletion`。 ```java @Slf4j public class ...
在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `postHandle()`, 和 `afterCompletion()` 来创建自定义的拦截器。 `preHandle()` 方法在目标处理方法调用之前执行...
在本文中,我们将深入...当然,实际的应用可能还需要添加更多的配置和功能,例如事务管理、分页插件、自定义拦截器等。通过不断学习和实践,我们可以进一步提升Spring Boot和MyBatis的使用技巧,构建更复杂的Web应用。
3. 配置Shiro,包括定义 Realm(身份验证和授权信息源)、创建SecurityManager并将其绑定到Servlet容器,以及定义拦截器规则。 4. 设计Thymeleaf模板,如登录页面、主页面等,使用Thymeleaf语法绑定数据。 5. 实现...
- 配置Druid的数据源,包括基本的连接池配置、监控配置以及拦截器设置等。 - 编写Repository或Service接口,使用MyBatis提供的SqlSession或Mapper接口进行数据库操作。 - 创建数据库表结构和初始化数据的SQL脚本。 -...
在Spring Boot中注册拦截器,我们需要在配置类中使用`@EnableAspectJAutoProxy`开启AOP代理,并通过`@Bean`注解声明拦截器实例。然后,使用`@Around`注解定义切点,即拦截所有的JPA操作。 在实际开发中,为了使分库...