SpringMVC之JSR303和拦截器

一.什么是JSR303

二.JSR303

常用注解

作用

使用 导入pom.xml

在实体类相对应的属性中增加注解用来指定校验 

 在hpjyController里面新加以下代码

 修改eidt.jsp

测试结果

​编辑 

二.拦截器

 什么是拦截器

 拦截器与过滤器的区别

 应用场景日志记录:拦截器可以用于记录请求的相关信息,如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。

 使用编写一个OneInterceptor

在spring-mvc中配置拦截器 

测试结果

 ​编辑

编写拦截器链

编写TwoInterceptor类

测试结果

三.用户登录权限控制

编写LoginInterceptor

  编写LoginController

编写login.jsp

编写Spring-Mvc

测试结果


一.什么是JSR303

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将生成相应的错误信息,并将其与视图进行绑定,以便显示给用户。这种验证机制可以帮助开发人员快速、便捷地进行输入数据的验证,提高应用程序的数据质量和安全性。 

二.JSR303

常用注解

JSR 303定义了多个注解来支持对象验证。以下是一些常用的JSR 303注解:

  1. @NotNull:验证字段不能为null。
  2. @NotEmpty:验证字段不能为空,对于String、Collection、Map和数组类型的字段有效。
  3. @NotBlank:验证字段不能为空且长度必须大于0,用于字符串类型的字段。
  4. @Size(min, max):验证字段的大小必须在指定的范围内。
  5. @Min(value):验证字段的值必须大于或等于指定的最小值。
  6. @Max(value):验证字段的值必须小于或等于指定的最大值。
  7. @Pattern(regex):验证字段的值必须符合指定的正则表达式模式。
  8. @Email:验证字段的值必须是有效的电子邮件地址。
  9. @Valid:用于嵌套验证,表示需要对嵌套对象进行验证。

以上只是一些常见的JSR 303注解,实际上还有其他很多注解可供使用。开发人员可以根据具体的需求选择适合的注解来对对象进行验证。

作用

Spring MVC JSR 303的作用是在Spring MVC应用程序中提供一种方便的数据验证机制。它的主要目的是确保输入数据的合法性和一致性,从而提高应用程序的数据质量和安全性。

通过使用JSR 303规范定义的验证注解,开发人员可以对请求参数、表单数据或任何Java对象进行验证。Spring MVC框架会自动触发验证,并根据验证结果生成相应的错误信息。

具体来说,Spring MVC JSR 303的作用包括:

  1. 验证请求参数:可以在Controller的方法参数上添加@Valid注解,触发对请求参数的验证。
  2. 验证表单数据:可以在表单对象的字段上使用JSR 303注解,通过校验注解定义的约束条件来验证表单数据的合法性。
  3. 验证任意Java对象:可以对任意Java对象进行验证,通过在对象的字段上添加相应的验证注解来指定验证规则。
  4. 生成错误消息:当验证失败时,Spring MVC会自动将错误信息与视图进行绑定,以方便在页面上显示给用户。
  5. 简化验证逻辑:Spring MVC JSR 303简化了开发人员对输入数据进行验证的逻辑,提供了一种便捷的方式进行数据验证。

总的来说,Spring MVC JSR 303使数据验证变得简单而便捷,提高了应用程序的健壮性和安全性。

使用 导入pom.xml




  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.source}
            ${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;
    }
}

 在hpjyController里面新加以下代码

 //    给数据添加服务端校验
    @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";
    }

 修改eidt.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


编辑信息

枪械编号:${errorMap.id}
枪械名称:${errorMap.name}
枪械类型:${errorMap.type}

测试结果

SpringMVC之JSR303和拦截器_第1张图片 

SpringMVC之JSR303和拦截器_第2张图片 

二.拦截器

 什么是拦截器

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处理的请求

拦截器工作原理  

SpringMVC之JSR303和拦截器_第3张图片 

 应用场景
日志记录:拦截器可以用于记录请求的相关信息,如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。

权限验证:拦截器可以用于对用户进行权限验证,判断用户是否具有访问特定资源的权限。例如,在用户访问某个需要登录的页面之前,拦截器可以检查用户是否已登录,并根据用户的角色判断是否有权限访问该页面。

请求预处理:拦截器可以用于对请求进行预处理,如字符编码转换、请求参数解析、请求数据的封装等。通过拦截器进行预处理,可以减轻目标处理器的负担,提高请求的处理效率和系统的稳定性。

性能监控:拦截器可以用于监控请求的处理时间,用于系统的性能分析和优化。例如,拦截器可以记录请求的处理时间,并根据时间阈值进行性能告警或者对慢请求进行分析和优化。
 

 使用编写一个OneInterceptor

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...");
    }
}

在spring-mvc中配置拦截器 



    
    

    
    

    
    
        
        
        
        
    



    



    

    
    
        
        
        
        
        
        
    

    
    
        
    

    
    

测试结果

 SpringMVC之JSR303和拦截器_第4张图片

SpringMVC之JSR303和拦截器_第5张图片

编写拦截器链



    
    

    
    

    
    
        
        
        
        
    



    



    

    
    
        
        
        
        
        
        
    

    
   
    
        
        
            
            
        
        
            
            
        
    
    
    

编写TwoInterceptor类

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...");
    }
}

测试结果

SpringMVC之JSR303和拦截器_第6张图片

三.用户登录权限控制

编写LoginInterceptor

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 {

    }
}

  编写LoginController

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";
    }
}

编写login.jsp

<%--
  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


登录界面

用户:

编写Spring-Mvc



    
    

    
    

    
    
        
        
        
        
    



    



    

    
    
        
        
        
        
        
        
    

    
    
      

    

        
    
        
    
    

测试结果

SpringMVC之JSR303和拦截器_第7张图片

你可能感兴趣的:(Springmvc)