【springboot】中使用--WebMvcConfigurer

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 {//页面跳转控制器,从请求直达视图@Overridepublic 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> {@Overridepublic 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;}@Overridepublic 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 {//页面跳转控制器,从请求直达视图@Overridepublic void addViewControllers(ViewControllerRegistry registry) {//配置页面控制:addViewController("请求的uri").指定他的视图setViewName(目标视图)registry.addViewController("/welcome").setViewName("index");}@Overridepublic 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;@RestControllerpublic 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-urlencodeddevice=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";@Overridepublic 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 {//页面跳转控制器,从请求直达视图@Overridepublic void addViewControllers(ViewControllerRegistry registry) {//配置页面控制:addViewController("请求的uri").指定他的视图setViewName(目标视图)registry.addViewController("/welcome").setViewName("index");}@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addFormatter(new DeviceFormatter());}@Overridepublic 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-urlencodedloginUser=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");}@Overridepublic 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

 @Overridepublic 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-urlencodedloginUser=lisi&title=Vue3

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

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

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

相关文章

Flutter中GetX的用法(超详细使用指南之路由依赖管理篇)

目录 1.前言 2.GetX 依赖管理概述 1.GetX 依赖管理的基本概念 2.与其他依赖管理工具的比较 3. 基础依赖注入 1.Get.put 2.Get.lazyPut 3.Get.putAsync 4.高级依赖注入 1.使用Get.create 2.依赖生命周期管理 5. 参考资料 1.前言 今天这篇博客主要介绍Getx的三大功能…

java基于ssm+vue 药品网购平台

1用户前台功能模块 1.1前台首页 前台首页详情页面&#xff1a;首页、药品信息、疫情常识、保健品推荐、个人中心、后台管理、购物车等操作。程序效果图如下图1所示&#xff1a; 前台页面等内容&#xff0c;如图1所示。 1.2个人中心 在前台页面查看个人中心用户注册、登录&am…

【proteus经典实战】LCD滚动显示汉字

一、简介 Proteus是一款功能丰富的电子设计和仿真软件&#xff0c;它允许用户设计电路图、进行PCB布局&#xff0c;并在虚拟环境中测试电路功能。这款软件广泛应用于教育和产品原型设计&#xff0c;特别适合于快速原型制作和电路设计教育。Proteus的3D可视化功能使得设计更加直…

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

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

【Linux知识点汇总】07 Linux系统防火墙相关命令,关闭和开启防火墙、开放端口号

​完整系列文章目录 【Linux知识点汇总】 心血来潮突然想起之前写过的系列文章【Linux知识点汇总】还未完结&#xff0c;那么今天就继续吧 说明&#xff1a;这个系列的内容&#xff0c;在系列【Linux服务器Java环境搭建】中会经常用到&#xff0c;大家可以自行查找相关命令 一、…

Docker搭建本地私有仓库

目录 1.下载运行registry 镜像 2.添加私有镜像仓库地址 3.为镜像添加标签 4.上传到私有仓库 5.查看私有仓库的所有镜像 6.测试私有仓库下载 1.下载运行registry 镜像 docker pull registry docker run -d -v /data/registry:/var/lib/registry -p 5000:5000 --restartal…

PostgreSQL使用(二)——插入、更新、删除数据

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

vue3【详解】跨组件通信 -- 依赖注入 provide inject

用于解决跨组件&#xff08;父组件与所有后代&#xff09;数据通信 提供数据 provide 传出数据的组件 &#xff08;通常为父辈组件&#xff09;提供数据 <script setup> import { provide } from vueprovide(/* 注入名 */ message, /* 值 */ hello!) </script>pro…

pycharm中运行.sh文件

最近在跑一个项目代码&#xff0c;里面要运行.sh文件。于是配置了下如何在pycharm中正常运行.sh文件。 首先安装好git&#xff0c;然后 File—>Settings—>Tools—>Terminal—>Shell path&#xff0c;将cmd.exe改成刚刚下载的git的路径&#xff0c;注意选择的是s…

web服务器——虚拟主机配置实战

搭建静态网站 —— 基于 http 协议的静态网站 实验 1 &#xff1a;搭建一个 web 服务器&#xff0c;访问该服务器时显示 “hello world” 欢迎界面 。 实验 2 &#xff1a;建立两个基于 ip 地址访问的网站&#xff0c;要求如下 该网站 ip 地址的主机位为 100 &#xff0c;设置…

web——搭建静态网站——基于http协议的静态网站

实验 4 &#xff1a;建立两个基于域名访问的网站&#xff0c;要求如下&#xff1a; 新建一个网站&#xff0c;域名为 www.ceshi.com &#xff0c;设置网站首页目录为 /www/name &#xff0c;网页内容为 this is test 。 新建一个网站&#xff0c;域名为 rhce.first.day &…

阵列信号处理学习笔记(一)--阵列信号处理定义

阵列信号 阵列信号处理学习笔记&#xff08;一&#xff09;–阵列信号处理定义 阵列信号处理学习笔记&#xff08;二&#xff09;–空域滤波基本原理 文章目录 阵列信号前言一、阵列信号处理定义1.1 信号1.2 阵列 二、雷达数据中哪些属于空间采样总结 前言 MOOC 阵列信号处理…

在线 PDF 制作者泄露用户上传的文档

两家在线 PDF 制作者泄露了数万份用户文档&#xff0c;包括护照、驾驶执照、证书以及用户上传的其他个人信息。 我们都经历过这样的情况&#xff1a;非常匆忙&#xff0c;努力快速制作 PDF 并提交表单。许多人向在线 PDF 制作者寻求帮助&#xff0c;许多人的祈祷得到了回应。 …

FOG Project 文件名命令注入漏洞复现(CVE-2024-39914)

0x01 产品简介 FOG是一个开源的计算机镜像解决方案,旨在帮助管理员轻松地部署、维护和克隆大量计算机。FOG Project 提供了一套功能强大的工具,使用户能够快速部署操作系统、软件和配置设置到多台计算机上,从而节省时间和精力。该项目支持基于网络的 PXE 启动、镜像创建和还…

【人工智能】AI音乐创作兴起与AI伦理的新视角

文章目录 &#x1f34a;AI音乐创作&#xff1a;一键生成&#xff0c;打造你的专属乐章&#x1f34a;1 市面上的AI音乐应用1.1 Suno AI1.2 网易天音 &#x1f34a;2 AI音乐创作的流程原理(直接制作可跳到第3点)2.1 AI音乐流派2.2 AI音乐风格2.3 AI音乐的结构顺序2.5 选择AI音乐乐…

手机如何播放电脑的声音?

准备工具&#xff1a; 有线耳机&#xff0c;手机&#xff0c;电脑&#xff0c;远控软件 1.有线耳机插电脑上 2.电脑安装pc版远控软件&#xff0c;手机安装手机端控制版远控软件 3.手机控制电脑开启声音控制 用手机控制电脑后&#xff0c;打开声音控制&#xff0c;电脑播放视频…

uniapp vue3 上传视频组件封装

首先创建一个 components 文件在里面进行组件的创建 下面是 vvideo组件的封装 也就是图片上传组件 只是我的命名是随便起的 <template><!-- 上传视频 --><view class"up-page"><!--视频--><view class"show-box" v-for"…

Netty HTTPS服务端高并发宕机案例

读李林峰《netty进阶指南》于第18章有感。特此记录一下问题的现象&#xff0c;以及他是如何排障的&#xff0c;以此加深理解 目录标题 事件梳理排查事后分析如何解决总结 事件梳理 某系统内部两个模块之间采用 HTTPS 通信。 某天&#xff1a; 客户端某时间吞吐量为0&#xf…

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

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

MySQL练习02

题目 步骤 创建数据库 create database mydb8_worker; #创建数据库 use mydb8_worker; #使用数据库 创建表 create table t_worker( department_id int(11) not null comment 部门号, worker_id int(11) primary key not null comment 职工号, worker_date date not …