数字化档案馆及网站的建设/关键词下载

数字化档案馆及网站的建设,关键词下载,一般企业做什么网站,网站开发4k分辨率HandlerInterceptor 是Spring MVC中用于在请求处理之前、之后以及完成之后执行逻辑的接口。它与Servlet的Filter类似,但更加灵活,因为它可以访问Spring的上下文和模型数据。HandlerInterceptor 常用于日志记录、权限验证、性能监控等场景。 ### **1. 创…

`HandlerInterceptor` 是Spring MVC中用于在请求处理之前、之后以及完成之后执行逻辑的接口。它与Servlet的`Filter`类似,但更加灵活,因为它可以访问Spring的上下文和模型数据。`HandlerInterceptor` 常用于日志记录、权限验证、性能监控等场景。

### **1. 创建自定义 `HandlerInterceptor`**

要使用 `HandlerInterceptor`,你需要实现 `HandlerInterceptor` 接口,并重写以下方法:

- `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`:在请求处理之前被调用,返回`true`表示继续执行后续的拦截器或Controller,返回`false`表示中断执行。
- `postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)`:在请求处理之后被调用,但视图渲染之前。
- `afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)`:在请求处理完成之后被调用,无论是否发生异常。

以下是一个简单的自定义 `HandlerInterceptor` 示例:

```java
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 请求处理之前执行
        System.out.println("Pre Handle method is Calling");
        System.out.println("Request URL: " + request.getRequestURL());
        return true; // 返回true继续执行后续逻辑,返回false中断执行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理之后执行
        System.out.println("Post Handle method is Calling");
        if (modelAndView != null) {
            modelAndView.addObject("timestamp", System.currentTimeMillis());
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求处理完成之后执行
        System.out.println("Request and Response is completed");
        if (ex != null) {
            System.out.println("Exception occurred: " + ex.getMessage());
        }
    }
}
```

### **2. 注册 `HandlerInterceptor`**

在Spring MVC中,可以通过 `WebMvcConfigurer` 接口注册 `HandlerInterceptor`。以下是一个示例:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private CustomInterceptor customInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册自定义拦截器,指定拦截路径
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/api/**") // 拦截/api路径下的所有请求
                .excludePathPatterns("/api/public/**"); // 排除/api/public路径下的请求
    }
}
```

### **3. 测试 `HandlerInterceptor`**

启动Spring Boot应用后,访问 `/api/**` 路径下的任何接口,`CustomInterceptor` 都会拦截请求并执行相应的逻辑。

### **4. 使用场景**
- **日志记录**:记录请求的URL、参数、响应时间等。
- **权限验证**:在 `preHandle` 方法中检查用户是否登录,是否有权限访问某个资源。
- **性能监控**:在 `preHandle` 和 `afterCompletion` 方法中记录请求处理的时间。
- **数据预处理**:在 `postHandle` 方法中修改模型数据或视图。

### **5. 完整示例**

以下是一个完整的Spring Boot项目示例,包含自定义 `HandlerInterceptor` 和注册逻辑:

#### **`CustomInterceptor.java`**
```java
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Pre Handle method is Calling");
        System.out.println("Request URL: " + request.getRequestURL());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Post Handle method is Calling");
        if (modelAndView != null) {
            modelAndView.addObject("timestamp", System.currentTimeMillis());
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Request and Response is completed");
        if (ex != null) {
            System.out.println("Exception occurred: " + ex.getMessage());
        }
    }
}
```

#### **`WebConfig.java`**
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private CustomInterceptor customInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/public/**");
    }
}
```

#### **`Controller` 示例**
```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/api/test")
    public String test() {
        return "Hello, World!";
    }

    @GetMapping("/api/public/test")
    public String publicTest() {
        return "This is a public endpoint";
    }
}
```

### **6. 输出示例**
访问 `/api/test` 时,控制台输出:
```
Pre Handle method is Calling
Request URL: http://localhost:8080/api/test
Post Handle method is Calling
Request and Response is completed
```

访问 `/api/public/test` 时,控制台不会输出拦截器的日志,因为该路径被排除了。

通过以上方法,你可以轻松地在Spring项目中使用 `HandlerInterceptor` 来实现各种功能。

下面这个例子是使用了自定义注解方式

在Spring中结合`HandlerInterceptor`和自定义注解可以实现灵活的请求处理逻辑,例如权限校验、日志记录等。以下是一个完整的示例,展示如何定义自定义注解,并在`HandlerInterceptor`中使用它。

### **1. 定义自定义注解**

首先,定义一个自定义注解,用于标记需要特殊处理的Controller方法。例如,定义一个`@Loggable`注解,用于记录方法的调用信息:

```java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD) // 仅适用于方法
@Retention(RetentionPolicy.RUNTIME) // 运行时保留
public @interface Loggable {
    String value() default ""; // 可选的描述信息
}
```

### **2. 创建拦截器**

接下来,创建一个`HandlerInterceptor`实现类,用于在请求处理前后执行逻辑:

```java
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Loggable loggable = handlerMethod.getMethodAnnotation(Loggable.class);
            if (loggable != null) {
                // 获取注解的值
                String description = loggable.value();
                System.out.println("Logging: " + description);
            }
        }
        return true; // 继续后续处理
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Request completed");
    }
}
```

### **3. 注册拦截器**

在Spring配置中注册拦截器,使其生效:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoggingInterceptor loggingInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loggingInterceptor)
                .addPathPatterns("/**") // 拦截所有路径
                .excludePathPatterns("/static/**", "/css/**", "/js/**"); // 排除静态资源
    }
}
```

### **4. 使用自定义注解**

在Controller方法上使用自定义注解:

```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExampleController {

    @GetMapping("/example")
    @Loggable(value = "This is an example method")
    public String exampleMethod() {
        return "Hello, World!";
    }
}
```

### **5. 测试**

启动Spring Boot应用后,访问`/example`路径,控制台将输出类似以下内容:

```
Logging: This is an example method
Request completed
```

### **总结**

通过定义自定义注解并结合`HandlerInterceptor`,可以在Spring MVC中灵活地为特定方法添加额外的处理逻辑,例如日志记录、权限校验等。这种方法使得代码更加清晰且易于维护。

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

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

相关文章

【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation

论文地址:Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来,多行为推荐模型取得了显著成功。然而,许多模型未充分考虑不同行为之间的共性与差异性,以…

蓝桥杯2023年第十四届省赛真题-子矩阵

题目来自DOTCPP: 暴力思路(两个测试点超时): 题目要求我们求出子矩阵的最大值和最小值的乘积,我们可以枚举矩阵中的所有点,以这个点为其子矩阵的左上顶点,然后判断一下能不能构成子矩阵。如果可…

centos 磁盘重新分割,将原来/home 下部分空间转移到 / 根目录下

上次重装系统时,不小心将一半磁盘放在了 /home 下面,运行一段时间后,发现/home 空间没有怎么用,反而是/ 目录报警说磁盘用完了,准备将 /home下的空间分一部分给主目录 / 先查看下 空间分布情况 df -lh 可以看到&…

【C#语言】C#同步与异步编程深度解析:让程序学会“一心多用“

文章目录 ⭐前言⭐一、同步编程:单线程的线性世界🌟1、寻找合适的对象✨1) 🌟7、设计应支持变化 ⭐二、异步编程:多任务的协奏曲⭐三、async/await工作原理揭秘⭐四、最佳实践与性能陷阱⭐五、异步编程适用场景⭐六、性能对比实测…

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

从零搭建微服务项目Pro(第6-1章——Spring Security+JWT实现用户鉴权访问与token刷新)

前言: 在现代的微服务架构中,用户鉴权和访问控制是非常重要的一部分。Spring Security 是 Spring 生态中用于处理安全性的强大框架,而 JWT(JSON Web Token)则是一种轻量级的、自包含的令牌机制,广泛用于分…

使用HAI来打通DeepSeek的任督二脉

一、什么是HAI HAI是一款专注于AI与科学计算领域的云服务产品,旨在为开发者、企业及科研人员提供高效、易用的算力支持与全栈解决方案。主要使用场景为: AI作画,AI对话/写作、AI开发/测试。 二、开通HAI 选择CPU算力 16核32GB,这…

LINUX网络编程API原型详细解析

1. 网络体系 1.1. 简介 网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供…

蓝桥杯 之 暴力回溯

文章目录 数字接龙小u的最大连续移动次数问题迷宫 在蓝桥杯中,十分喜欢考察对于网格的回溯的问题,对于这类的问题,常常会使用到这个DFS和BFS进行考察,不过无论怎么考察,都只是会在最基础的模本的基础上,根据…

微信小程序的业务域名配置(通过ingress网关的注解)

一、背景 微信小程序的业务域名配置(通过kong网关的pre-function配置)是依靠kong实现,本文将通过ingress网关实现。 而我们的服务是部署于阿里云K8S容器,当然内核与ingress无异。 找到k8s–>网络–>路由 二、ingress注解 …

Python数据可视化工具:六西格玛及其基础工具概览

在当今数据驱动的时代,数据分析和可视化工具成为了各行业优化流程、提升质量的关键手段。六西格玛(Six Sigma)作为一种以数据为基础、追求完美质量的管理理念,其实施依赖于一系列基础工具的灵活运用。而Python,凭借其强…

Spring MVC响应数据

handler方法分析 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为handler* TODO: handler需要使用RequestMapping/GetMapping系列,声明路径,在HandlerMapping中注册,供DS查找!* TODO: handler作用总结:* 1.接收请求参数(param,json,pathVariable,共享域等…

Python散点图(Scatter Plot):数据探索的“第一张图表”

在数据可视化领域,散点图是一种强大而灵活的工具,它能够帮助我们直观地理解和探索数据集中变量之间的关系。本文将深入探讨散点图的核心原理、应用场景以及如何使用Python进行高效绘制。 后续几篇将介绍高级技巧、复杂应用场景。 Python散点图(Scatter Plot):高阶分析、散点…

【redis】在 Spring中操作 Redis

文章目录 基础设置依赖StringRedisTemplate库的封装 运行StringList删库 SetHashZset 基础设置 依赖 需要选择这个依赖 StringRedisTemplate // 后续 redis 测试的各种方法,都通过这个 Controller 提供的 http 接口来触发 RestController public class MyC…

微服务》》Kubernetes (K8S) 集群 安装

关闭交换空间 # 切换 超级管理员身份 # 查看交换空间 free -h # 关闭交换空间 swapoff -a避免开启启动交换空间 # 注释swap开头的行 vim /etc/fstab关闭防火墙 # 关闭防火墙 # 因为K8S 是集群形式存在的 至少三台 一主二从 (一个master 两个node&#xff09…

MySQL 简记

MySQL 简记 mysql中的数据存储的结构是B树 其与B树的相同点是,B树一个节点也可以存放多条数据,并且从左到右依次增大;不同点是,B树的叶子结点之间也能相互连接。那么实际上是采取利用空间换区时间的策略。 那么B树的树结构like…

springboot使用163发送自定义html格式的邮件

springboot使用163发送html格式的邮件 效果: 下面直接开始教学 注册邮箱,生成授权码 获取163邮箱的授权码,可以按照以下步骤操作: 登录163邮箱 打开浏览器,访问 163邮箱登录页面。 使用你的邮箱账号和密码登录。进入邮箱设置 登…

【Kafka】深入了解Kafka

集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识,这个标识可以在配置文件中指定,也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…

Hugging Face预训练GPT微调ChatGPT(微调入门!新手友好!)

Hugging Face预训练GPT微调ChatGPT(微调入门!新手友好!) 在实战中,⼤多数情况下都不需要从0开始训练模型,⽽是使⽤“⼤⼚”或者其他研究者开源的已经训练好的⼤模型。 在各种⼤模型开源库中,最…

Redis BitMap 用户签到

Redis Bitmap Bitmap(位图)是 Redis 提供的一种用于处理二进制位(bit)的特殊数据结构,它基于 String 类型,每个 bit 代表一个布尔值(0 或 1),可以用于存储大规模的二值状…