一.什么是JSR303
二.JSR303
常用注解
作用
使用 导入pom.xml
在实体类相对应的属性中增加注解用来指定校验
在hpjyController里面新加以下代码
修改eidt.jsp
测试结果
编辑
二.拦截器
什么是拦截器
拦截器与过滤器的区别
应用场景日志记录:拦截器可以用于记录请求的相关信息,如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。
使用编写一个OneInterceptor
在spring-mvc中配置拦截器
测试结果
编辑
编写拦截器链
编写TwoInterceptor类
测试结果
三.用户登录权限控制
编写LoginInterceptor
编写LoginController
编写login.jsp
编写Spring-Mvc
测试结果
Spring MVC JSR 303是结合了Spring MVC和JSR 303规范的一种验证机制。Spring MVC是Spring框架的一部分,用于构建基于Java的Web应用程序。而JSR 303是Java中的一个规范,用于定义对象验证的注解和API。
Spring MVC JSR 303提供了一种方便的方式来在Spring MVC应用程序中进行数据验证。通过在Controller的方法参数上添加验证注解,如
@Valid
,可以触发对请求参数的验证。该机制能够自动校验请求数据与JSR 303注解中定义的约束条件是否一致,例如非空、长度、范围等。如果验证失败,Spring MVC将生成相应的错误信息,并将其与视图进行绑定,以便显示给用户。这种验证机制可以帮助开发人员快速、便捷地进行输入数据的验证,提高应用程序的数据质量和安全性。
JSR 303定义了多个注解来支持对象验证。以下是一些常用的JSR 303注解:
@NotNull
:验证字段不能为null。@NotEmpty
:验证字段不能为空,对于String、Collection、Map和数组类型的字段有效。@NotBlank
:验证字段不能为空且长度必须大于0,用于字符串类型的字段。@Size(min, max)
:验证字段的大小必须在指定的范围内。@Min(value)
:验证字段的值必须大于或等于指定的最小值。@Max(value)
:验证字段的值必须小于或等于指定的最大值。@Pattern(regex)
:验证字段的值必须符合指定的正则表达式模式。@Valid
:用于嵌套验证,表示需要对嵌套对象进行验证。以上只是一些常见的JSR 303注解,实际上还有其他很多注解可供使用。开发人员可以根据具体的需求选择适合的注解来对对象进行验证。
Spring MVC JSR 303的作用是在Spring MVC应用程序中提供一种方便的数据验证机制。它的主要目的是确保输入数据的合法性和一致性,从而提高应用程序的数据质量和安全性。
通过使用JSR 303规范定义的验证注解,开发人员可以对请求参数、表单数据或任何Java对象进行验证。Spring MVC框架会自动触发验证,并根据验证结果生成相应的错误信息。
具体来说,Spring MVC JSR 303的作用包括:
- 验证请求参数:可以在Controller的方法参数上添加
@Valid
注解,触发对请求参数的验证。- 验证表单数据:可以在表单对象的字段上使用JSR 303注解,通过校验注解定义的约束条件来验证表单数据的合法性。
- 验证任意Java对象:可以对任意Java对象进行验证,通过在对象的字段上添加相应的验证注解来指定验证规则。
- 生成错误消息:当验证失败时,Spring MVC会自动将错误信息与视图进行绑定,以方便在页面上显示给用户。
- 简化验证逻辑:Spring MVC JSR 303简化了开发人员对输入数据进行验证的逻辑,提供了一种便捷的方式进行数据验证。
总的来说,Spring MVC JSR 303使数据验证变得简单而便捷,提高了应用程序的健壮性和安全性。
4.0.0
org.example
xyzy
1.0-SNAPSHOT
war
xyzy Maven Webapp
http://www.example.com
UTF-8
1.8
1.8
3.7.0
5.0.2.RELEASE
3.4.5
5.1.44
5.1.2
1.3.1
2.1.1
2.4.3
2.9.1
3.2.0
1.7.13
4.12
4.0.0
1.18.2
1.1.0
2.10.0
2.9.0
1.7.1.RELEASE
2.9.3
1.2
1.1.2
8.0.47
1.3.3
5.0.2.Final
1.3.2
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
mysql
mysql-connector-java
${mysql.version}
com.github.pagehelper
pagehelper
${pagehelper.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
org.springframework
spring-context-support
${spring.version}
org.mybatis.caches
mybatis-ehcache
${mybatis.ehcache.version}
net.sf.ehcache
ehcache
${ehcache.version}
redis.clients
jedis
${redis.version}
org.springframework.data
spring-data-redis
${redis.spring.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
org.apache.commons
commons-dbcp2
${commons.dbcp2.version}
commons-pool2
org.apache.commons
org.apache.commons
commons-pool2
${commons.pool2.version}
org.springframework
spring-webmvc
${spring.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
jcl-over-slf4j
${slf4j.version}
runtime
org.apache.logging.log4j
log4j-api
${log4j2.version}
org.apache.logging.log4j
log4j-core
${log4j2.version}
org.apache.logging.log4j
log4j-slf4j-impl
${log4j2.version}
org.apache.logging.log4j
log4j-web
${log4j2.version}
runtime
com.lmax
disruptor
${log4j2.disruptor.version}
junit
junit
${junit.version}
javax.servlet
javax.servlet-api
${servlet.version}
provided
org.projectlombok
lombok
${lombok.version}
provided
jstl
jstl
${jstl.version}
taglibs
standard
${standard.version}
org.apache.tomcat
tomcat-jsp-api
${tomcat-jsp-api.version}
commons-fileupload
commons-fileupload
${commons-fileupload.version}
org.hibernate
hibernate-validator
${hibernate-validator.version}
org.apache.shiro
shiro-core
${shiro.version}
org.apache.shiro
shiro-web
${shiro.version}
org.apache.shiro
shiro-spring
${shiro.version}
xyzy
src/main/java
**/*.xml
src/main/resources
*.properties
*.xml
org.apache.maven.plugins
maven-compiler-plugin
${maven.compiler.plugin.version}
${maven.compiler.target}
${project.build.sourceEncoding}
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
${mysql.version}
true
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
package com.xy.model;
import lombok.ToString;
import org.hibernate.validator.constraints.NotBlank;
import org.junit.Test;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@ToString
public class hpjy {
@NotNull(message = "班级编号不能为空")
// @Size(max = 100,min = 10,message = "大小必须在10至100之间")
protected Integer id;
@NotBlank(message = "班级名不能为空")
protected String name;
@NotBlank(message = "班级教员老师不能为空")
protected String type;
private String image="暂无图片";
public hpjy(Integer id, String name, String type, String image) {
this.id = id;
this.name = name;
this.type = type;
this.image = image;
}
public hpjy() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
// 给数据添加服务端校验
@RequestMapping("/valiAdd")
public String valiAdd(@Validated hpjy hpjy,
BindingResult result,
HttpServletRequest req){
// 如果服务端验证不通过,有错误
if(result.hasErrors()){
// 服务端验证了实体类的多个属性,多个属性都没有验证通过
List fieldErrors = result.getFieldErrors();
Map 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.hpjyBiz.insertSelective(hpjy);
return "redirect:list";
}
return "hpjy/edit";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
编辑信息
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller生命周期之内可以多次调用。
过滤器(filter)
1.filter属于Servlet技术,只要是web工程都可以使用
2.filter主要由于对所有请求过滤
3.filter的执行时机早于Interceptor
拦截器(interceptor)
1.interceptor属于SpringMVC技术,必须要有SpringMVC环境才可以使用
2.interceptor通常由于对处理器Controller进行拦截
3.interceptor只能拦截dispatcherServlet处理的请求
拦截器工作原理
应用场景
日志记录:拦截器可以用于记录请求的相关信息,如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。权限验证:拦截器可以用于对用户进行权限验证,判断用户是否具有访问特定资源的权限。例如,在用户访问某个需要登录的页面之前,拦截器可以检查用户是否已登录,并根据用户的角色判断是否有权限访问该页面。
请求预处理:拦截器可以用于对请求进行预处理,如字符编码转换、请求参数解析、请求数据的封装等。通过拦截器进行预处理,可以减轻目标处理器的负担,提高请求的处理效率和系统的稳定性。
性能监控:拦截器可以用于监控请求的处理时间,用于系统的性能分析和优化。例如,拦截器可以记录请求的处理时间,并根据时间阈值进行性能告警或者对慢请求进行分析和优化。
package com.xy.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OneInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("【OneInterceptor】:preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("【OneInterceptor】:postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("【OneInterceptor】:afterCompletion...");
}
}
package com.xy.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TwoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("【TwoInterceptor】:preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("【TwoInterceptor】:postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("【TwoInterceptor】:afterCompletion...");
}
}
package com.xy.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public 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;
}
@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 {
}
}
package com.xy.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @author bing人
* @site
* @company xy集团
* @create 2023-09-12 14:28
*/
@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:/hpjy/list";
}
@RequestMapping("/logout")
public String logout(HttpServletRequest req){
req.getSession().invalidate();
return "redirect:/hpjy/list";
}
}
<%--
Created by IntelliJ IDEA.
User: 30340
Date: 2023/9/12
Time: 14:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
登录界面