首页 > 其他分享 >使用 HandlerInterceptor 拦截请求

使用 HandlerInterceptor 拦截请求

时间:2024-11-23 12:55:32浏览次数:6  
标签:请求 登录 springframework org import 拦截 HandlerInterceptor

简介

HandlerInterceptor 是 Spring MVC 中的一个接口,用于在处理请求之前和之后进行一些操作。它可以用于日志记录、身份验证、权限检查等功能。

以下是 HandlerInterceptor 接口定义:

public interface HandlerInterceptor {

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}

}

其中包含三个方法:

  1. preHandle:在请求到达处理程序之前被调用。可以用于执行一些前置处理逻辑,例如身份验证、日志记录等。如果此方法返回true,则请求继续传递到处理程序;如果返回false,则请求处理终止。

  2. postHandle:在请求处理程序执行之后,视图渲染之前被调用。可以用于执行一些后置处理逻辑,例如修改模型数据、记录执行时间等。

  3. afterCompletion:在整个请求完成之后被调用。通常用于清理资源、记录最终日志等。可以在这里获取到处理程序的执行结果和可能的异常信息。

应用场景:用户身份验证和权限检查

背景

在一个需要用户登录才能访问的 web 应用中,通常需要在每个请求处理之前验证用户的身份。如果用户未登录,则重定向到登录页面;如果已登录,则检查用户的权限。

实现步骤

  1. 创建拦截器类

    实现HandlerInterceptor接口,重写preHandle方法进行身份验证和权限检查。

    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Component
    public class AuthInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 检查用户是否已登录
            Object user = request.getSession().getAttribute("user");
            if (user == null) {
                // 用户未登录,重定向到登录页面
                response.sendRedirect("/login");
                return false; // 终止请求
            }
            // 用户已登录,继续处理请求
            return true;
        }
    }
    
  2. 注册拦截器

    在 Spring 的配置类中注册拦截器,并指定需要拦截的 URL 模式。

    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 AuthInterceptor authInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(authInterceptor)
                    .addPathPatterns("/protected/**") // 只拦截以 /protected/ 开头的请求
                    .excludePathPatterns("/login", "/register"); // 排除登录和注册请求
        }
    }
    
  3. 控制器示例

    编写一个控制器,处理受保护的资源。

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class ProtectedController {
    
        @GetMapping("/protected/resource")
        public String protectedResource() {
            return "This is a protected resource.";
        }
    }
    

测试流程

  • 未登录用户:当用户未登录并尝试访问/protected/resource时,拦截器会重定向到/login页面。
  • 已登录用户:当用户登录后,访问/protected/resource将返回"This is a protected resource."

总结

通过使用HandlerInterceptor,可以轻松实现用户身份验证和权限检查,确保只有授权用户才能访问特定资源。这种方式不仅提高了代码的可维护性,还使得身份验证逻辑与业务逻辑解耦。

参考:ChatGPT、Spring Boot 拦截器 HandlerInterceptor 的使用以及 WebMvcConfigurer 简单介绍

标签:请求,登录,springframework,org,import,拦截,HandlerInterceptor
From: https://www.cnblogs.com/Higurashi-kagome/p/18564315

相关文章

  • 为什么 Spring Boot 的微服务架构被称为“现代应用开发的曙光”?这种设计真的解决了传
    目录1.微服务架构为何被称为“现代应用开发的曙光”1.1单体架构的问题1.2微服务架构的诞生与发展1.3微服务架构的挑战2.SpringBoot在微服务中的角色2.1自动化配置与微服务开发2.2SpringCloud生态中的微服务3.微服务架构是否真的解决了传统单体架构中的所......
  • JavaWeb合集17-拦截器(Interceptor)和过滤器(Filter)
    十七、拦截器和过滤器在JavaWeb开发中,拦截器(Interceptor)和过滤器(Filter)都是用于在请求处理前后执行某些操作的机制。虽然它们的功能相似,但在实现方式、使用场景和灵活性方面有一些重要的区别。1、拦截器和过滤器的区别及选择1.1拦截器定义:拦截器是Spring框架提供......
  • Java调用第三方接口、http请求详解,一文学会
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据......
  • springmv的过滤器和拦截器的区别是什么
    一个请求进来的时候,先交给web服务器提供的过滤器,例如springboot项目,提供的服务器也就是内置的tomcat,过滤器处理完成以后,然后会来到servlet,有一个dispatcherServlet会调用拦截器,再由dispatcherServlet分发给对应的Controller,处理完请求后,会原路返回,再回到拦截器,再回到过滤器,最终响......
  • Spingboot 定时任务与过滤器,拦截器
     在boot环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用Spring自带的定时任务处理器@Scheduled注解,另一种就是使用第三方框架Quartz,SpringBoot源自Spring+SpringMVC,因此天然具备这两个Spring中的定时任务实现策略,当然也支持Quartz1.定时任务@Sched......
  • 如何用axios发送ajax请求(函数)
    在上篇文章的基础上将格式改为:btns[2].onclick=function(){axios({//请求方法method:'POST',url:'/axios-server',params:{vip:10,......
  • 1-3.Retrofit 异常请求清单(404 请求、超时请求、连接失败请求)
    Retrofit1、Retrofit概述Retrofit是一个网络请求库,专门用于发送HTTP请求和处理HTTP响应2、Retrofit引入在AndroidManifest.xml文件中添加相关权限,如果是Android6.0(API级别23)或之后,需要在运行时请求<uses-permissionandroid:name="android.permission.INT......
  • AJAX——HTTP 协议请求报文和响应报文结构
    1、HTTP(hypertexttransportprotocol)协议【超文本传输协议】,协议详细规定了浏览器和万维网服务器之间互相通信的规则。2、请求报文(浏览器向服务器发送的内容)重点是格式和参数        ①请求行             请求类型+/+url文件(页面路径/查询......
  • 如何用ajax发送post请求
    和get类似,稍作改动:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>AJAXPOST请......
  • 第03章 SpringBoot获取请求参数
    我们首先创建“SpringBootRequestDemo”工程。然后我们修改编码格式以及Maven仓库地址,我们省略这个过程了。接着我们再添加spring-boot-starter-parent,spring-boot-starter-web,spring-boot-starter-thymeleaf依赖库<?xmlversion="1.0"encoding="UTF-8"?><projectxm......