南昌网站制作公司,网站运行速度慢,京东自营网上商城,栅格系统做的网站目录 一、JSR303
二、拦截器#xff08;interceptor#xff09; 一、JSR303 1.1.什么是JSR303 JSR 303#xff0c;它是Java EE#xff08;现在称为Jakarta EE#xff09;规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范#xff0c;也称为Bean验证。 Bean验…
目录 一、JSR303
二、拦截器interceptor 一、JSR303 1.1.什么是JSR303 JSR 303它是Java EE现在称为Jakarta EE规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范也称为Bean验证。 Bean验证是一种用于验证对象属性的框架它可以确保对象符合特定的规则和约束。这些规则可以包括字段的非空性、长度限制、格式验证等。通过使用Bean验证开发人员可以在应用程序中轻松地定义和应用验证规则以确保数据的完整性和一致性。 1.2 为什么要使用JSR-303 当我们开发应用程序时经常需要对用户输入的数据进行验证以确保数据的有效性和一致性。例如我们可能需要验证用户注册表单中的用户名是否符合要求、密码是否足够强壮、电子邮件地址是否有效等等。 在学这个之前我们都是通过前端进行验证的如果说前端代码校验没写好又或者是对于会一点编程的人来说可以直接绕过前端发请求通过类似Postman这样的测试工具进行非常数据请求把一些错误的参数传过来这样是不安全的。 所以我们一般都是前端做一套校验后端再做一套校验这样安全性就能够大大得到提升了。 1.3.常用注解 注解 说明 Null 用于验证对象为null NotNull 用于对象不能为null无法查检长度为0的字符串 NotBlank 只用于String类型上不能为null且trim()之后的size0 NotEmpty 用于集合类、String类不能为null,且size0。但是带有空格的字符串校验不出来 Size 用于对象Array,Collection,Map,String长度是否在给定的范围之内 Length 用于String对象的大小必须在指定的范围内 Pattern 用于String对象是否符合正则表达式的规则 Email 用于String对象是否符合邮箱格式 Min 用于Number和String对象是否大等于指定的值 Max 用于Number和String对象是否小等于指定的值 AssertTrue 用于Boolean对象是否为true AssertFalse 用于Boolean对象是否为false 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 package com.lya.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotBlank;Data//相当于set get toString方法
AllArgsConstructor //有参构造器
NoArgsConstructor //无参构造器public class book {NotBlank(message 书籍编号不能为空)private Integer bid;NotBlank(message 书籍名称不能为空)private String bname;NotBlank(message 书籍价格不能为空)private Float price;private String pic 暂未上传图片;public Integer getBid() {return bid;}public void setBid(Integer bid) {this.bid bid;}public String getBname() {return bname;}public void setBname(String bname) {this.bname bname;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price price;}public String getPic() {return pic;}public void setPic(String pic) {this.pic pic;}前端代码
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
headmeta http-equivContent-Type contenttext/html; charsetUTF-8title书籍的编辑界面/title
/head
body
form action${pageContext.request.contextPath }/clz/${empty bs ? add : edit} methodpostid:input typetext namebid value${bs.bid }span stylecolor: red${Map.bid}/spanbrbname:input typetext namebname value${bs.bname }span stylecolor: red${Map.bid}/spanbrprice:input typetext nameprice value${bs.price }span stylecolor: red${Map.bid}/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生命周期之内可以多次调用。 拦截器主要用于实现以下功能 预处理操作拦截器可以在请求被处理之前进行一些预处理操作例如参数校验、权限验证、请求日志记录等。这样可以在进入具体的请求处理逻辑之前对请求进行一些统一的处理。 后处理操作拦截器可以在请求处理完成后进行一些后处理操作例如统一的异常处理、结果封装、响应日志记录等。这样可以在请求处理完成后对响应进行一些统一的处理。 请求拦截和过滤拦截器可以对请求进行拦截和过滤根据一定的条件判断是否允许请求继续处理。例如可以根据用户的权限进行拦截如果用户没有权限访问某个资源可以直接拦截请求并返回相应的错误信息。 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.lya.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.lya.interceptor.OneInterceptor/bean/mvc:interceptors preHandle用于对拦截到的请求进行预处理方法接收布尔(true,false)类型的返回值返回true放行false不放行。 执行时机在处理器方法执行前执行 方法参数 参数说明request请求对象response响应对象handler拦截到的方法处理 postHandle用于对拦截到的请求进行后处理可以在方法中对模型数据和视图进行修改 执行时机在处理器的方法执行后视图渲染之前 方法参数 参数说明request请求对象response响应对象handler拦截到的处理器方法ModelAndView处理器方法返回的模型和视图对象可以在方法中修改模型和视图 afterCompletion用于在整个流程完成之后进行最后的处理如果请求流程中有异常可以在方法中获取对象 执行时机视图渲染完成后(整个流程结束之后) 方法参数 参数说明request请求参数response响应对象handler拦截到的处理器方法ex异常对象
2.5.拦截器链 如果多个拦截器能够对相同的请求进行拦截则多个拦截器会形成一个拦截器链主要理解拦截器链中各个拦截器的执行顺序。拦截器链中多个拦截器的执行顺序根拦截器的配置顺序有关先配置的先执行。 public class TwoInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(【TwoInterceptor】preHandle...);
return true;}
Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(【TwoInterceptor】postHandle...);
}
Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(【TwoInterceptor】afterCompletion...);}
} !-- 多拦截器拦截器链--mvc:interceptorsmvc:interceptormvc:mapping path/**/bean classcom.lya.interceptor.OneInterceptor//mvc:interceptormvc:interceptormvc:mapping path/book/**/bean classcom.lya.interceptor.TwoInterceptor//mvc:interceptor/mvc:interceptors
2.6.用户登录权限案例 public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(【implements】preHandle...);StringBuffer url request.getRequestURL();if (url.indexOf(/login) 0 || url.indexOf(/logout) 0){// 如果是 登录、退出 中的一种return true;}
// 代表不是登录也不是退出
// 除了登录、退出其他操作都需要判断是否 session 登录成功过String uname (String) request.getSession().getAttribute(uname);if (uname null || .equals(uname)){response.sendRedirect(/page/login);return false;}return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
SpringMVC.xml
mvc:interceptorsbean classcom.lya.interceptor.LoginInterceptor/bean
/mvc:interceptors
LoginController.java
Controller
public class LoginController {RequestMapping(/login)public String login(HttpServletRequest req){String uname req.getParameter(uname);HttpSession session req.getSession();if (zs.equals(uname)){session.setAttribute(uname,uname);}return redirect:/clz/list;}RequestMapping(/logout)public String logout(HttpServletRequest req){req.getSession().invalidate();return redirect:/clz/list;}
}
登录jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle登陆页面/title
/head
body
h1登陆页面/h1
form action/login methodpost用户名:input nameunameinput typesubmit
/form
/body
/html