php个人网站源码下载,专业做网站的,搜索引擎营销名词解释,网站建设从零开始教程一、JSR 303
1.1 JSR 303介绍 JSR 303#xff0c;它是Java EE#xff08;现在称为Jakarta EE#xff09;规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范#xff0c;也称为Bean验证。 Bean验证是一种用于验证对象属性的框架#xff0c;它可以确保对象符合特…一、JSR 303
1.1 JSR 303介绍 JSR 303它是Java EE现在称为Jakarta EE规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范也称为Bean验证。 Bean验证是一种用于验证对象属性的框架它可以确保对象符合特定的规则和约束。这些规则可以包括字段的非空性、长度限制、格式验证等。通过使用Bean验证开发人员可以在应用程序中轻松地定义和应用验证规则以确保数据的完整性和一致性。 1.2 为什么要使用JSR-303 当我们开发应用程序时经常需要对用户输入的数据进行验证以确保数据的有效性和一致性。例如我们可能需要验证用户注册表单中的用户名是否符合要求、密码是否足够强壮、电子邮件地址是否有效等等。 在学这个之前我们都是通过前端进行验证的如果说前端代码校验没写好又或者是对于会一点编程的人来说可以直接绕过前端发请求通过类似Postman这样的测试工具进行非常数据请求把一些错误的参数传过来这样是不安全的。
所以我们一般都是前端做一套校验后端再做一套校验这样安全性就能够大大得到提升了。 总的来说使用JSR 303可以让数据验证过程更加简单、直观和可靠。它可以帮助我们减少重复的验证代码提高代码的可读性和可维护性减少错误和漏洞的出现并提高开发效率。因此JSR 303是一个有用的工具可以在开发过程中帮助我们更好地处理数据验证的需求。 1.3、常用注解 Null 用于验证对象为nullNotNull 用于对象不能为null无法查检长度为0的字符串NotBlank 只用于String类型上不能为null且trim()之后的size0NotEmpty 用于集合类、String类不能为null,且size0。但是带有空格的字符串校验不出来Size 用于对象Array,Collection,Map,String长度是否在给定的范围之内Length 用于String对象的大小必须在指定的范围内Pattern 用于String对象是否符合正则表达式的规则Email 用于String对象是否符合邮箱格式Min 用于Number和String对象是否大等于指定的值Max 用于Number和String对象是否小等于指定的值AssertTrue 用于Boolean对象是否为trueAssertFalse 用于Boolean对象是否为false
1.4 使用示例
1.4.1 导入JSR303依赖
!-- JSR303 --
hibernate.validator.version6.0.7.Final/hibernate.validator.version!-- JSR303 --
dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion${hibernate.validator.version}/version
/dependency
1.4.2 配置校验规则
package com.liwen.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;Data//相当于set get toString方法
AllArgsConstructor //有参构造器
NoArgsConstructor //无参构造器
public class User {NotNull(message 用户编号不能为空)private Long id;NotBlank(message 用户名不能为空)private String name;NotBlank(message 账号不能为空)private String loginname;Length(min 6, max 15, message 用户名长度是6-15位)private String pwd;//权限private Long rid;
}
1.4.3 编写方法校验 使用Validated注解对User对象进行服务端校验。User对象需要使用JSR 303注解进行属性验证规则的定义。 //给数据添加服务端校验RequestMapping(/valiAdd)public String valiAdd(Validated User user, BindingResult result, HttpServletRequest req) {//如果服务端验证不通过有错误 booleanif (result.hasErrors()) {//得到所有错误ListFieldError fieldErrors result.getFieldErrors();//创建集合保存错误信息用户传输到前端进行显示MapString, Object map new HashMap();//迭代错误for (FieldError fieldError : fieldErrors) {//将多个属性的验证失败信息输送到控制台System.out.println(fieldError.getField() : fieldError.getDefaultMessage());//保存错误信息map.put(fieldError.getField(), fieldError.getDefaultMessage());}//将集合保存到域对象req.setAttribute(errorMap, map);} else {//如果校验没有错误则进行增加this.userBiz.insertSelective(user);//返回到主页return redirect:list;}//校验错误继续在本界面return user/edit;} 1.4.4 编写前端
通过span标签形式将后端保存的错误信息输出在页面。
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle用户编辑、新增公共页面/title
/head
body
form action${pageContext.request.contextPath }/${empty u ? users/valiAdd : users/edit} methodpost用户id:input typetext nameid value${u.id }span stylecolor: red${errorMap.id}/spanbr用户名:input typetext namename value${u.name }span stylecolor: red${errorMap.naem}/spanbr账号:input typetext nameloginname value${u.loginname }span stylecolor: red${errorMap.loginname}/spanbr密码:input typetext namepwd value${u.pwd }span stylecolor: red${errorMap.pwd}/spanbr权限:input typetext namerid value${u.rid }span stylecolor: red${errorMap.rid}/spanbrinput typesubmit
/form
/body
/html 1.5 Validated与Valid区别
Validated Spring提供的 支持分组校验 可以用在类型、方法和方法参数上。但是不能用在成员属性字段上 由于无法加在成员属性字段上所以无法单独完成级联校验需要配合Valid
Valid JDK提供的标准JSR-303规范 不支持分组校验 可以用在方法、构造函数、方法参数和成员属性字段上 可以加在成员属性字段上能够独自完成级联校验 二、拦截器interceptor 2.1 什么是拦截器 SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter用于对处理器进行预处理和后处理还有请求拦截和过滤。依赖于web框架在实现上基于Java的反射机制属于面向切面编程AOP的一种运用。由于拦截器是基于web框架的调用因此可以使用Spring的依赖注入DI进行一些业务操作同时一个拦截器实例在一个 controller生命周期之内可以多次调用。
拦截器主要用于实现以下功能
预处理操作拦截器可以在请求被处理之前进行一些预处理操作例如参数校验、权限验证、请求日志记录等。这样可以在进入具体的请求处理逻辑之前对请求进行一些统一的处理。后处理操作拦截器可以在请求处理完成后进行一些后处理操作例如统一的异常处理、结果封装、响应日志记录等。这样可以在请求处理完成后对响应进行一些统一的处理。请求拦截和过滤拦截器可以对请求进行拦截和过滤根据一定的条件判断是否允许请求继续处理。例如可以根据用户的权限进行拦截如果用户没有权限访问某个资源可以直接拦截请求并返回相应的错误信息。 例如在Java的Spring框架中可以通过实现HandlerInterceptor接口来创建自定义的拦截器。在Spring中拦截器可以通过配置来指定拦截的路径和顺序以及是否拦截子路径等。 拦截器的执行顺序一般是根据配置的顺序来确定的可以通过配置来控制拦截器的执行顺序。在请求处理过程中拦截器会按照配置的顺序依次执行每个拦截器都可以对请求进行拦截、处理和修改。 总之拦截器是一种在请求处理过程中对请求进行拦截和处理的组件可以用于实现一些预处理、后处理、请求拦截和过滤等功能。它提供了一种灵活的机制可以对请求进行统一的处理和控制。
2.2 拦截器与过滤器的区别 什么是过滤器Filter 依赖于servlet容器。在实现上基于函数回调可以对几乎所有请求进行过滤但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作比如在过滤器中修改字符编码在过滤器中修改HttpServletRequest的一些参数包括过滤低俗文字、危险字符等。 过滤器(filter) 1.filter属于Servlet技术只要是web工程都可以使用 2.filter主要由于对所有请求过滤 3.filter的执行时机早于Interceptor 拦截器(interceptor) 1.interceptor属于SpringMVC技术必须要有SpringMVC环境才可以使用 2.interceptor通常由于对处理器Controller进行拦截 3.interceptor只能拦截dispatcherServlet处理的请求
2.3 拦截器的应用场景及作用
权限验证拦截器可以用于验证用户的权限例如检查用户是否登录、是否具有访问某个资源的权限等。通过拦截请求并进行权限验证可以保护系统的安全性和数据的完整性。日志记录拦截器可以用于记录请求和响应的日志信息包括请求的URL、请求参数、处理时间、响应结果等。通过记录日志可以方便地进行系统的监控、故障排查和性能优化。参数预处理拦截器可以对请求参数进行预处理例如对参数进行验证、转换、修正等操作。这样可以确保请求参数的有效性和一致性减少错误和异常的发生。异常处理拦截器可以用于统一处理请求过程中出现的异常。通过拦截异常并进行统一的处理可以提供友好的错误提示页面或返回特定的错误信息提高系统的容错性和用户体验。缓存控制拦截器可以用于控制缓存的使用例如根据请求的URL、参数等条件判断是否使用缓存以及缓存的过期时间等。通过拦截请求并进行缓存控制可以提高系统的性能和响应速度。请求重定向拦截器可以根据一定的条件对请求进行重定向将请求转发到其他的URL或处理器进行处理。通过拦截请求并进行重定向可以实现请求的转发、路由和流程控制。统一处理拦截器可以用于实现一些统一的处理逻辑例如对请求进行统一的编码转换、字符集设置、响应头设置等。通过拦截请求并进行统一处理可以提高系统的一致性和可维护性。 拦截器在Web开发中的应用非常广泛它可以对请求进行拦截、处理和修改实现权限验证、日志记录、参数预处理、异常处理、缓存控制、请求重定向和统一处理等功能。通过使用拦截器可以提高系统的安全性、稳定性、性能和可维护性。 2.4 快速入门
2.4.1 创建拦截器
package com.liwen.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*
1. 定义拦截器类实现HandlerInterceptor接口
2. 注意当前类必须受Spring容器控制*/
public class OneInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(【OneInterceptor】preHandle...);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(【OneInterceptor】postHandle...);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(【OneInterceptor】afterCompletion...);}
}
2.4.2 配置拦截器
在spring-mvc.xml中配置 !--配置拦截器--mvc:interceptorsbean classcom.liwen.interceptor.OneInterceptor/bean/mvc:interceptors
2.4.3 运行测试
启动项目打开浏览器访问请求地址测试拦截器你会发现他们运行顺序是
preHandle -- postHandle -- afterCompletion
2.5 拦截器工作流程
当有拦截器后请求会先进入preHandle方法 如果方法返回true则放行继续执行后面的handle[controller的方法]和后面的方法 如果返回false则直接跳过后面方法的执行。 preHandle用于对拦截到的请求进行预处理方法接收布尔(true,false)类型的返回值返回true放行false不放行。 执行时机在处理器方法执行前执行 方法参数 参数说明request请求对象response响应对象handler拦截到的方法处理 postHandle用于对拦截到的请求进行后处理可以在方法中对模型数据和视图进行修改 执行时机在处理器的方法执行后视图渲染之前 方法参数
参数说明request请求对象response响应对象handler拦截到的处理器方法ModelAndView处理器方法返回的模型和视图对象可以在方法中修改模型和视图 afterCompletion用于在整个流程完成之后进行最后的处理如果请求流程中有异常可以在方法中获取对象 执行时机视图渲染完成后(整个流程结束之后) 方法参数
参数说明request请求参数response响应对象handler拦截到的处理器方法ex异常对象
2.6 拦截器链
在spring-mvc.xml中配置多个拦截器 !--2) 多拦截器拦截器链--mvc:interceptorsmvc:interceptor!--拦截所有--mvc:mapping path/**/bean classcom.liwen.interceptor.OneInterceptor//mvc:interceptormvc:interceptor!--拦截users下的controller--mvc:mapping path/users/**/bean classcom.liwen.interceptor.TwoInterceptor//mvc:interceptor/mvc:interceptors 运行测试走了两个拦截器如果运行的是 http://localhost:8080/file/list 将不会执行Two...拦截器。