【springboot】中使用--WebMvcConfigurer

news2024/11/11 5:57:30

WebMvcConfigurer

  • 一、页面跳转控制器
    • step1:创建视图,resources/templates/index.html
    • step2:创建SpringMVC配置类
    • step3:测试功能
  • 二、数据格式化
    • step1:创建 DeviceInfo 数据类
    • step2:自定义 Formatter
    • step3: 登记自定义的 DeviceFormatter
    • step4: 新建 Controller 接受请求设备数据
    • step5:单元测试
  • 三、拦截器
    • (一)、一个拦截器
      • step1:创建文章的 Controller
      • step2:创建有关权限拦截器
      • step3:登记拦截器
      • step4:测试拦截器
    • (二)、多个拦截器
      • step1:创建登录拦截器
      • step2:登记拦截器,设置顺序 order
      • step3:测试拦截器

WebMvcConfigurer 作为配置类是,采用 JavaBean 的形式来代替传统的 xml 配置文件形式进行针对框架个性化定制,就是 Spring MVC XML 配置文件的 JavaConfig(编码)实现方式。自定义 InterceptorViewResolver,
MessageConverter。WebMvcConfigurer 就是 JavaConfig 形式的 Spring MVC 的配置文件WebMvcConfigurer 是一个接口,需要自定义某个对象,实现接口并覆盖某个方法。主要方法功能介绍一下:
在这里插入图片描述

public interface WebMvcConfigurer {
//帮助配置 HandlerMapping
default void configurePathMatch(PathMatchConfigurer configurer) {
}
//处理内容协商
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}
//异步请求
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}
//配置默认 servlet
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}
//配置内容转换器
default void addFormatters(FormatterRegistry registry) {
}
//配置拦截器
default void addInterceptors(InterceptorRegistry registry) {
}
//处理静态资源
default void addResourceHandlers(ResourceHandlerRegistry registry) {
}
//配置全局跨域
default void addCorsMappings(CorsRegistry registry) {
}
//配置视图页面跳转
default void addViewControllers(ViewControllerRegistry registry) {
}
//配置视图解析器
default void configureViewResolvers(ViewResolverRegistry registry) {
}
//自定义参数解析器,处理请求参数
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}
//自定义控制器方法返回值处理器
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
}
//配置 HttpMessageConverters
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
//配置 HttpMessageConverters
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}
//配置异常处理器
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}
//扩展异常处理器
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}
//JSR303 的自定义验证器
default Validator getValidator() {
return null;
}
//消息处理对象
default MessageCodesResolver getMessageCodesResolver() {
return null;
}
}

一、页面跳转控制器

Spring Boot 中使用页面视图,比如 Thymeleaf。要跳转显示某个面,必须通过 Controller 对象。也就是我们需要创建一个 Controller,转发到一个视图才行。 如果我们现在需要显示页面,可以无需这个 Controller。
addViewControllers() 完成从请求到视图跳转。

  • 需求:访问/welcome 跳转到项目首页 index.html(Thyemeleaf 创建的对象)

项目代码结构:
在这里插入图片描述

step1:创建视图,resources/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>欢迎各位小伙伴!!!</h3>
</body>
</html>

step2:创建SpringMVC配置类

  • 重写addViewControllers()方法
  • 配置页面控制:addViewController(“请求的uri”).指定他的视图setViewName(目标视图)

在这里插入图片描述

package com.bjpowernode.mvc.settings;


import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * springmvc配置类
 */
@Configuration
public class MvcSettings implements WebMvcConfigurer {
    //页面跳转控制器,从请求直达视图
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //配置页面控制:addViewController("请求的uri").指定他的视图setViewName(目标视图)
        registry.addViewController("/welcome").setViewName("index");
    }
}

step3:测试功能

 浏览器访问http://localhost:8080/welcome

在这里插入图片描述

二、数据格式化

Formatter<T>是数据转换接口,将一种数据类型转换为另一种数据类型。与 Formatter<T>功能类型的还有Converter<S,T>。本节研究 Formatter<T>接口。Formatter<T>只能将 String 类型转为其他数据数据类型。这点在Web 应用适用更广。因为 Web 请求的所有参数都是 String,我们需要把 String 转为 Integer ,Long,Date 等等。
Spring 中内置了一下 Formatter:

  • DateFormatter : String 和 Date 之间的解析与格式化
  • InetAddressFormatter :String 和 InetAddress 之间的解析与格式化
  • PercentStyleFormatter :String 和 Number 之间的解析与格式化,带货币符合
  • NumberFormat :String 和 Number 之间的解析与格式化
  1. 我在使用@ DateTimeFormat , @NumberFormat 注解时,就是通过 Formatter解析 String 类型到我们期望的Date 或 Number 类型
  2. Formatter也是 Spring 的扩展点,我们处理特殊格式的请求数据时,能够自定义合适的 Formatter,将请求的 String 数据转为我们的某个对象,使用这个对象更方便我们的后续编码

接口原型
在这里插入图片描述
Formatter是一个组合接口,没有自己的方法。内容来自 Printer和 Parser

  • Printer:将 T 类型转为 String,格式化输出
  • Parser:将 String 类型转为期望的 T 对象。
  • 我们项目开发,可能面对多种类型的项目,复杂程度有简单,有难一些。特别是与硬件打交道的项目,数据的格式与一般的 name: lisi, age:20 不同。数据可能是一串“1111; 2222; 333,NF; 4; 561” 。
  • 需求:将“1111;2222;333,NF;4;561”接受,代码中用 DeviceInfo 存储参数值

step1:创建 DeviceInfo 数据类

import lombok.Data;

@Data
public class DeviceInfo {

    private String item1;
    private String item2;
    private String item3;
    private String item4;
    private String item5;
}

step2:自定义 Formatter

package com.bjpowernode.mvc.fomatter;

import com.bjpowernode.mvc.model.DeviceInfo;
import org.springframework.format.Formatter;
import org.springframework.util.StringUtils;

import java.text.ParseException;
import java.util.Locale;
import java.util.StringJoiner;

/**
 * 将请求参数字符串转为 DeviceInfo
 */
public class DeviceFormatter implements Formatter<DeviceInfo> {

    @Override
    public DeviceInfo parse(String text, Locale locale) throws ParseException {
        DeviceInfo info = null;
        if(StringUtils.hasLength(text)){
            String[] items = text.split(";");
            info = new DeviceInfo();
            info.setItem1(items[0]);
            info.setItem2(items[1]);
            info.setItem3(items[2]);
            info.setItem4(items[3]);
            info.setItem5(items[4]);
        }
        return info;
    }

    @Override
    public String print(DeviceInfo object, Locale locale) {
        StringJoiner joiner = new StringJoiner("#");
        joiner.add(object.getItem1()).add(object.getItem2())
                .add(object.getItem3()).add(object.getItem4()).add(object.getItem5());
        return joiner.toString();
    }
}

step3: 登记自定义的 DeviceFormatter

  • addFormatters() 方法登记 Formatter
    在这里插入图片描述
package com.bjpowernode.mvc.settings;

import com.bjpowernode.mvc.fomatter.DeviceFormatter;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * springmvc配置类
 */
@Configuration
public class MvcSettings implements WebMvcConfigurer {
    //页面跳转控制器,从请求直达视图
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //配置页面控制:addViewController("请求的uri").指定他的视图setViewName(目标视图)
        registry.addViewController("/welcome").setViewName("index");
    }

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new DeviceFormatter());
    }
}

step4: 新建 Controller 接受请求设备数据


import com.bjpowernode.mvc.model.DeviceInfo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController

public class DeviceController {
    @PostMapping("/device/add")
    public String addDeviceInfo(@RequestParam("device")DeviceInfo info){
        return "接受设备信息"+info.toString();
    }
}

step5:单元测试

POST http://localhost:8080/device/add
Content-Type: application/x-www-form-urlencoded

device=1111;2222;333,NF;4;561

在这里插入图片描述

三、拦截器

HandlerInterceptor 接口和它的实现类称为拦截器,是 SpringMVC 的一种对象。拦截器是 Spring MVC 框架的对象与 Servlet 无关。拦截器能够预先处理发给 Controller 的请求。可以决定请求是否被 Controller 处理。用户请求是先由 DispatcherServlet 接收后,在 Controller 之前执行的拦截器对象。
一个项目中有众多的拦截器:框架中预定义的拦截器, 自定义拦截器。下面我说说自定义拦截器的应用。根据拦截器的特点,类似权限验证,记录日志,过滤字符,登录 token 处理都可以使用拦截器。

拦截器定义步骤:

  1. 声明类实现 HandlerInterceptor 接口,重写三个方法(需要那个重写那个)
  2. 登记拦截器

(一)、一个拦截器

需求:zhangsan 操作员用户,只能查看文章,不能修改,删除。

step1:创建文章的 Controller

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ArticleController {

    @PostMapping("/article/add")
    public String addArticle(){
        return "发布新的文章";
    }

    @PostMapping("/article/edit")
    public String editArticle(){
        return "修改文章";
    }
    @DeleteMapping("/article/remove")
    public String removeArticle(){
        return "删除文章";
    }
    @GetMapping("/article/query")
    public String query(){
        return "查询文章";
    }
}

step2:创建有关权限拦截器

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class AuthInterceptor implements HandlerInterceptor {
    private static  final String COMMON_USER="zhangsan";
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("====AuthInterceptor权限拦截器====");
        String loginUser = request.getParameter("loginUser");
        String requestURI = request.getRequestURI();
        if(COMMON_USER.equals(loginUser) && (
                requestURI.startsWith("/article/add")||
                requestURI.startsWith("/article/edit")||
                requestURI.startsWith("/article/remove")
                )){
            return false;
        }
        return true;
    }
}

step3:登记拦截器

在这里插入图片描述

package com.bjpowernode.mvc.settings;

import com.bjpowernode.mvc.fomatter.DeviceFormatter;
import com.bjpowernode.mvc.interceptor.AuthInterceptor;
import com.bjpowernode.mvc.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * springmvc配置类
 */
@Configuration
public class MvcSettings implements WebMvcConfigurer {
    //页面跳转控制器,从请求直达视图
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //配置页面控制:addViewController("请求的uri").指定他的视图setViewName(目标视图)
        registry.addViewController("/welcome").setViewName("index");
    }

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new DeviceFormatter());
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //权限拦截器
        AuthInterceptor authInterceptor = new AuthInterceptor();
        registry.addInterceptor(authInterceptor)
                .order(2)
                .addPathPatterns("/article/**")
                .excludePathPatterns("/article/query");
        LoginInterceptor loginInterceptor = new LoginInterceptor();
    }

}

step4:测试拦截器

POST http://localhost:8080/article/add
Content-Type: application/x-www-form-urlencoded

loginUser=lisi&title=Vue3

在这里插入图片描述
在这里插入图片描述

(二)、多个拦截器

增加一个验证登录用户的拦截器,只有 zhangsan,lisi,admin 能够登录系统。其他用户不可以。
两个拦截器登录的拦截器先执行,权限拦截器后执行,order()方法设置顺序,整数值越小,先执行。 step1:创建登录拦截器

step1:创建登录拦截器

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class LoginInterceptor implements HandlerInterceptor {

    private List<String> permitUser = new ArrayList<>();

    public LoginInterceptor() {
        this.permitUser = Arrays.asList("zhangsan", "lisi", "admin");
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("=========LoginInterceptor执行了==========");
        //获取登录用户名
        String loginUser = request.getParameter("loginUser");
        if(StringUtils.hasText(loginUser) && permitUser.contains(loginUser)){
            return true;
        }
        return false;
    }
}

step2:登记拦截器,设置顺序 order

 @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //权限拦截器
        AuthInterceptor authInterceptor = new AuthInterceptor();
        registry.addInterceptor(authInterceptor)
                .order(2)
                .addPathPatterns("/article/**")
                .excludePathPatterns("/article/query");
        LoginInterceptor loginInterceptor = new LoginInterceptor();
        registry.addInterceptor(loginInterceptor)
                .order(1)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/article/query")//排除/article/query 请求;
        
    }

在这里插入图片描述

step3:测试拦截器

POST http://localhost:8080/article/add
Content-Type: application/x-www-form-urlencoded

loginUser=lisi&title=Vue3

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

杭州外贸网站建设 最好用wordpress模板来搭建

防护服wordpress外贸网站模板 消防服、防尘服、隔热服、防化服、防静电服、电焊服wordpress外贸网站模板。 https://www.jianzhanpress.com/?p4116 工业品wordpress外贸网站模板 机械及行业设备、五金工具、安全防护、包装、钢铁、纺织皮革等工业品wordpress外贸网站模板。…

实现高效离职管理,智慧校园人事管理功能全解析

智慧校园人事管理系统中的离职管理功能&#xff0c;为教职工提供了一个高效、透明且合规的离职流程&#xff0c;同时为学校管理层提供了优化人力资源配置的有力工具。教职工可以在线轻松提交离职申请&#xff0c;系统随即自动记录并启动后续流程&#xff0c;从申请审核到工作交…

C语言 | Leetcode C语言题解之第241题为运算表达式设计优先级

题目&#xff1a; 题解&#xff1a; #define ADDITION -1 #define SUBTRACTION -2 #define MULTIPLICATION -3int* diffWaysToCompute(char * expression, int* returnSize) {int len strlen(expression);int *ops (int *)malloc(sizeof(int) * len);int opsSize 0;for (in…

任务2:python+InternStudio 关卡

任务地址 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Python/task.md 文档 https://github.com/InternLM/Tutorial/tree/camp3/docs/L0/Python 任务 Python实现wordcount import re import collectionstext """ Got this panda plush to…

Qt Creator配置以及使用Valgrind - 检测内存泄露

Qt Creator配置以及使用Valgrind - 检测内存泄露 引言一、下载安装1.1 下载源码1.2 安装 二、配置使用2.1 Qt Creator配置2.2 使用2.3 更多详细信息可参考官方文档&#xff1a; 三、参考链接 引言 Valgrind是一个在Linux平台下广泛使用的开源动态分析工具&#xff0c;它提供了一…

ARM体系结构和接口技术(九)异常

文章目录 &#xff08;一&#xff09;异常模式&#xff08;二&#xff09;Cortex-A7核的异常处理流程分析1. 保存现场&#xff08;系统自动完成&#xff09;2. 恢复现场&#xff08;程序员手动完成&#xff09;3. 异常处理流程 &#xff08;三&#xff09;软中断验证异常处理函…

谷粒商城实战笔记-40-前端基础-Vue-计算属性、监听器、过滤器

文章目录 一&#xff0c;计算属性1&#xff0c;用途2&#xff0c;用法2.1 定义View2.2 声明计算属性 3&#xff0c;注意事项 二&#xff0c;监听器1. 使用 watch 监听属性的变化 三&#xff0c;过滤器1&#xff0c;定义局部过滤器2&#xff0c;定义全局过滤器3&#xff0c;使用…

level 6 day2-3 网络基础2---TCP编程

1.socket&#xff08;三种套接字&#xff1a;认真看&#xff09; 套接字就是在这个应用空间和内核空间的一个接口&#xff0c;如下图 原始套接字可以从应用层直接访问到网络层&#xff0c;跳过了传输层&#xff0c;比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

如何修复 CrowdStrike 蓝屏错误 Windows 11

如果您的 PC 出现 BSoD 错误&#xff0c;您不是唯一一个&#xff0c;但这里有一个解决方法来缓解该问题。 如果您有一台运行 Windows 11&#xff08;或 10&#xff09;的计算机使用 CrowdStrike 的 Falcon Sensor 应用程序连接到组织&#xff0c;并且遇到蓝屏死机 &#xff0…

JavaScript:节流与防抖

目录 一、前言 二、节流&#xff08;Throttle&#xff09; 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装节流函数 三、防抖&#xff08;Debounce&#xff09; 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装防抖函数 四、异同点总结 一、前言 …

AI算法22-决策树算法Decision Tree | DT

目录 决策树算法概述 决策树算法背景 决策树算法简介 决策树算法核心思想 决策树算法的工作过程 特征选择 信息增益 信息增益比 决策树的生成 ID3算法 C4.5的生成算法 决策树的修剪 算法步骤 决策树算法的代码实现 决策树算法的优缺点 优点 缺点 决策树算法的…

深入解析HNSW:Faiss中的层次化可导航小世界图

层次化可导航小世界&#xff08;HNSW&#xff09;图是向量相似性搜索中表现最佳的索引之一。HNSW 技术以其超级快速的搜索速度和出色的召回率&#xff0c;在近似最近邻&#xff08;ANN&#xff09;搜索中表现卓越。尽管 HNSW 是近似最近邻搜索中强大且受欢迎的算法&#xff0c;…

Latex使用心得1

本周暑期课程大作业需要使用Latex模板&#xff0c;采用的是老师给的IEEE的格式。从最开始不知道Latex是什么&#xff0c;到摸索着把大作业的小论文排版完成&#xff0c;其中也有一些心得体会。写在这里记录一下&#xff0c;以便以后回来再看&#xff0c;有更多的思考沉淀。 1、…

视觉巡线小车——STM32+OpenMV(三)

目录 前言 一、OpenMV代码 二、STM32端接收数据 1.配置串口 2.接收数据并解析 总结 前言 通过视觉巡线小车——STM32OpenMV&#xff08;二&#xff09;&#xff0c;已基本实现了减速电机的速度闭环控制。要使小车能够自主巡线&#xff0c;除了能够精准的控制速度之外&#xff0…

Java周总结7.20day

一&#xff0c;异常 异常 &#xff1a;指的是程序在运行过程中报错&#xff0c;然后停止运行&#xff0c;控制台显示错误。 注意事项&#xff1a;异常本身是一个类&#xff0c;出现异常会创建一个异常类的对象并抛出&#xff0c; public class DemoTest { public static void …

python—爬虫爬取电影页面实例

下面是一个简单的爬虫实例&#xff0c;使用Python的requests库来发送HTTP请求&#xff0c;并使用lxml库来解析HTML页面内容。这个爬虫的目标是抓取一个电影网站&#xff0c;并提取每部电影的主义部分。 首先&#xff0c;确保你已经安装了requests和lxml库。如果没有安装&#x…

海思arm-hisiv400-linux-gcc 交叉编译rsyslog 记录心得

需要编译rsyslog,参考海思3536平台上rsyslog交叉编译、使用-CSDN博客和rsyslog移植&#xff08;亲测成功&#xff09;_rsyslog交叉编译-CSDN博客 首先下载了要用到的一些库的源码&#xff0c;先交叉编译这些库 原来是在centos6上交叉编译的&#xff0c;结果编译时报缺少软件要…

使用vue3模拟element-ui中el-tabs的实现

一. 最终实现 组件没有背景颜色, 为了凸显组件文字,才设置了背景颜色 二. 使用 <wq-tabs v-model"activeName" style"background:grey; padding: 20px"><wq-tab-pane label"User" name"first">User</wq-tab-pane&g…

多任务高斯过程数学原理和Pytorch实现示例

高斯过程其在回归任务中的应用我们都很熟悉了&#xff0c;但是我们一般介绍的都是针对单个任务的&#xff0c;也就是单个输出。本文我们将讨论扩展到多任务gp&#xff0c;强调它们的好处和实际实现。 本文将介绍如何通过共区域化的内在模型(ICM)和共区域化的线性模型(LMC)&…

驱动LSM6DS3TR-C实现高效运动检测与数据采集(10)----融合磁力计进行姿态解算

驱动LSM6DS3TR-C实现高效运动检测与数据采集.10--融合磁力计进行姿态解算 概述视频教学样品申请源码下载硬件准备DataLogFusion磁力计校准过程初始化磁力计MFX_Arithmetic_Init卡尔曼滤波算法演示 概述 MotionFX库包含用于校准陀螺仪、加速度计和磁力计传感器的例程。 将磁力计…