• JSR303和拦截器


    目录

    一、JSR303

    1.1简介

    1.2步骤

    二、拦截器

    1、什么是拦截器

     2、拦截器和过滤器的区别

    3、应用场景

    4、 案例


    一、JSR303

    1.1简介

    服务端验证

    1.2步骤

    ①、导入pom依赖

    1. <dependency>
    2. <groupId>org.hibernategroupId>
    3. <artifactId>hibernate-validatorartifactId>
    4. <version>6.0.7.Finalversion>
    5. dependency>

    ②、给实体类加入注解

    1. package com.mgy.ssm.model;
    2. import javax.validation.constraints.NotBlank;
    3. import javax.validation.constraints.NotNull;
    4. /**
    5. * @NotNull :作用于基本数据类型
    6. * @NotEmpty 作用于集合
    7. * @NotBlank 作用于字符串
    8. */
    9. public class Clazz {
    10. @NotNull(message = "cid不能为空")
    11. protected Integer cid;
    12. @NotBlank(message = "班级名称不能为空")
    13. protected String cname;
    14. @NotBlank(message = "教员老师不能为空")
    15. protected String cteacher;
    16. protected String pic;
    17. public Clazz(Integer cid, String cname, String cteacher, String pic) {
    18. this.cid = cid;
    19. this.cname = cname;
    20. this.cteacher = cteacher;
    21. this.pic = pic;
    22. }
    23. public Clazz() {
    24. super();
    25. }
    26. public Integer getCid() {
    27. return cid;
    28. }
    29. public void setCid(Integer cid) {
    30. this.cid = cid;
    31. }
    32. public String getCname() {
    33. return cname;
    34. }
    35. public void setCname(String cname) {
    36. this.cname = cname;
    37. }
    38. public String getCteacher() {
    39. return cteacher;
    40. }
    41. public void setCteacher(String cteacher) {
    42. this.cteacher = cteacher;
    43. }
    44. public String getPic() {
    45. return pic;
    46. }
    47. public void setPic(String pic) {
    48. this.pic = pic;
    49. }
    50. }

    ③、将以下方法加入到ClazzController类中

    1. /**
    2. * @Valid 是与实体类中 的服务端校验 注解佩环使用的
    3. * BindingResult 存放了所有微博 校验的错信息
    4. * @param clazz
    5. * @param bindingResult
    6. * @return
    7. */
    8. @RequestMapping("/valiAdd")
    9. public String valiAdd(@Valid Clazz clazz, BindingResult bindingResult,HttpServletRequest req){
    10. if(bindingResult.hasErrors()){
    11. Map msg=new HashMap();
    12. // 违背规则
    13. List fieldErrors =bindingResult.getFieldErrors();
    14. for (FieldError fieldError:fieldErrors) {
    15. // cid: cid 不能为空
    16. System.out.println(fieldError.getField()+":"+fieldError.getDefaultMessage());
    17. // msg.put(cid,cid不能·为空);
    18. msg.put(fieldError.getField(),fieldError.getDefaultMessage());
    19. }
    20. req.setAttribute("msg",msg);
    21. // 如何出现了错误,应该将提示与显示在 表单提交元素后方
    22. return "clzEdit";
    23. }
    24. else{
    25. this.clazzBiz.insertSelective(clazz);
    26. }
    27. return "redirect:/clz/list";
    28. }

    ④、页面修改

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. 博客的编辑界面
    5. <%--
    6. --%>
    7. id:${msg.cid}
    8. cname:${msg.cname}
    9. cteacher:${msg.cteacher}

     效果:

     

     步骤总结:

    1.1 pom依赖导入

    1.2 在待校验的数据库列段对应的实体类属性打上校验标签 非空校验

    1.3 在controller层,方法上添加@valid注解配合前面的校验标签;

            添加bindingResult,此对象包含了所有 校验未通过的错误信息

    1.4 可以将所有的错误信息以map集合的方式保持,并且传递到前台页面

    二、拦截器

    1、什么是拦截器

    依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例
        只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,比如:在过滤器中修改字符编码;
        在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

     2、拦截器和过滤器的区别

        过滤器(filter):

        1) filter属于Servlet技术,只要是web工程都可以使用
        2) filter主要对所有请求过滤
        3) filter的执行时机早于Interceptor

        拦截器(interceptor)

        1) interceptor属于SpringMVC技术,必须要有SpringMVC环境才可以使用
        2) interceptor通常对处理器Controller进行拦截
        3) interceptor只能拦截dispatcherServlet处理的请求

    3、应用场景

        1)日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

        2)权限检查:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面;

        3)性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);

        4)通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个Controller中的处理方法都需要的,我们就可以使用拦截器实现。

    4、 案例

    步骤:

    1、实现HandlerInterceptor接口 对应实现三个方法

    2、完成springmvc.xml中的配置

    拦截器链的配置:

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**/"/>
    4. <bean class="com.mgy.ssm.intercept.OneHadlerInterceptor">bean>
    5. mvc:interceptor>
    6. <mvc:interceptor>
    7. <mvc:mapping path="/clz/**/"/>
    8. <bean class="com.mgy.ssm.intercept.TwoHadlerInterceptor">bean>
    9. mvc:interceptor>
    10. mvc:interceptors>

    OneHadlerIntercerptor类

    1. package com.mgy.ssm.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import javax.servlet.http.HttpServletRequest;
    5. /**
    6. * @author 云鹤衫
    7. * @site www.yunheshan.com
    8. * @company xxx公司
    9. * @create  2022-08-20 0:52
    10. */
    11. @Controller
    12. public class LoginController {
    13. @RequestMapping("/login")
    14. public String login(HttpServletRequest req){
    15. // 登录成功 需要 保存 用户信息
    16. String uname=req.getParameter("uname");
    17. if("zhangsan".equals(uname)){
    18. req.getSession().setAttribute("uname",uname);
    19. }
    20. return "redirect:/clz/list";
    21. }
    22. @RequestMapping("/logout")
    23. public String logout(HttpServletRequest req){
    24. req.getSession().invalidate();
    25. return "index";
    26. }
    27. }

    springmvc的配置:

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**/"/>
    4. <bean class="com.mgy.ssm.intercept.OneHadlerInterceptor">bean>
    5. mvc:interceptor>
    6. mvc:interceptors>

    效果:

     

     

     

     

     

  • 相关阅读:
    LeetCode.15. 三数之和
    springboot毕设项目潮流数码社区系统0k849(java+VUE+Mybatis+Maven+Mysql)
    并查集解析
    19.Lock锁介绍与应用案例
    JVM垃圾回收算法
    QT - 简易画板
    分布式事务----seata
    linux安装Zookeeper3.5.7详解
    day11_api_Object类_String类
    工欲善其事,必先利其器,Markdown和Mermaid的梦幻联动(2)
  • 原文地址:https://blog.csdn.net/m0_62604616/article/details/126433055