首页 > 其他分享 >请求处理

请求处理

时间:2024-08-17 17:39:04浏览次数:6  
标签:username 请求 处理 Filter org import public

基础概念

  • 过滤器(Filter):当有一堆请求,只希望符合预期的请求进来。
  • 拦截器(Interceptor):想要干涉预期的请求。
  • 监听器(Listener):想要监听这些请求具体做了什么。

过滤器

  • 过滤敏感词汇(防止sql注入)
  • 设置字符编码
  • URL级别的权限访问控制
  • 压缩响应信息

最常见使用的接口是OncePerRequestFilter和Filter接口

作用范围

  • Filter 是一个更通用的接口,可以拦截任何请求,包括静态资源的请求。
  • OncePerRequestFilter 是 Filter 接口的一个具体实现,它只拦截动态请求(Servlet、JSP 等),不会拦截静态资源的请求。

执行次数

  • Filter 可以被多次执行,每次请求都会经过 Filter 链。
  • OncePerRequestFilter 保证了一次请求只会执行一次过滤操作,即使被多个 OncePerRequestFilter 实现类匹配。

常见用途

  • Filter 通常用于实现一些通用的功能,如身份验证、日志记录、字符编码设置等。
  • OncePerRequestFilter 通常用于实现一些需要在请求处理的整个生命周期中执行的功能,如安全检查、性能监控等。

拦截器

一个拦截器必须实现 HandlerInterceptor 接口,preHandle 方法是 Controller 方法调用前执行,postHandle 是 Controller 方法正常返回后执行,afterCompletion 方法无论 Controller 方法是否抛异常都会执行。

@Slf4j
public class LoggerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle{}...",request.getRequestURI());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

监听器

Spring Boot监听器主要分为以下几类:

  • ApplicationListener:用于监听Spring应用上下文事件。
  • ServletListener:用于监听Servlet生命周期事件。
  • ContextRefreshedListener:用于监听Spring上下文刷新事件。

除了Spring提供的事件外,开发者还可以自定义事件,以满足特定需求。这里我们主要说明一下自定义事件的监听。

自定义事件类

import org.springframework.context.ApplicationEvent;
public class UserRegisteredEvent extends ApplicationEvent {
    private String username;
    public UserRegisteredEvent(Object source, String username) {
        super(source);
        this.username = username;
    }
    public String getUsername() {
        return username;
    }
}

发布事件

import org.springframework.context.ApplicationEventPublisher;
import  org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;


@Component
public class UserService implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher eventPublisher;
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }
    public void registerUser(String username) {
        // Logic to register the user
        System.out.println("User registered: " + username);
        // Publish the UserRegisteredEvent
        UserRegisteredEvent event = new UserRegisteredEvent(this, username);
        eventPublisher.publishEvent(event);
    }
}

监听事件类

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> {
    @Override
    public void onApplicationEvent(UserRegisteredEvent event) {
        System.out.println("User registered event received for user: " + event.getUsername());
    }
}

参考链接

https://javabetter.cn/springboot/Filter-Interceptor-Listener.html#前言
https://www.yanfukun.com/read/springbootdetail/listener?wd=springboot

标签:username,请求,处理,Filter,org,import,public
From: https://www.cnblogs.com/Ho1dF0rward/p/18364690

相关文章

  • 安装cartopy失败的处理过程,尚在等待中,成功与否不知。
    Win7,Python3.8,sublimetext,运行(build)wind-draw.py提示:ModuleNotFoundError:Nomodulenamed'cartopy'。搜索,在csdn上看到:cartopy安装保姆教程--三天的试错,终于成功了及【Cartopy】安装失败解决方案,一定可行参照安装。查:piplist,发现有pillow,无shapely、pyproj、py......
  • SpringMVC处理请求头、响应头、编码行为
    基本知识http协议中,请求行、请求头部分都是采用的ascii编码,是不支持中文的,若携带不支持的字符,需要使用进行编码,比如常见的urlEncode。而请求体是支持任意编码的,通过Content-Type请求头的charset部分来告知服务端请求体使用何种方式编码。响应行、响应头、响应体亦如是。Content......
  • 《Windows核心编程》:错误处理
    https://www.zhihu.com/people/xiangchun.zeng网络流行的"科学的尽头还是烧开水"这个梗,从发明蒸汽轮机以来,到现在的核电站、核动力航母最终都是通过“烧开水”这种能量转换形式来实现发电和航行。一以贯之,那么可以这么讲:“Windows核心编程的尽头还是调函数”。.NET、MFC、QT、......
  • 生产环境故障处理演练-mysql数据库主从恢复
    常用命令:1、查看myqsl当前所有用户:SELECTuser,hostFROMmysql.user;2、查看表mom_tms.t_tms_db_car_base_info的创建语句:showcreatetablemom_tms.t_tms_db_car_base_info;3、从库执行查看是否都是只读状态:select@@read_only;4、查询MySQL中performance_schema表......
  • OpenCV图像处理——轮廓的面积与弧长计算(C++/Python)
    概述轮廓面积与轮廓周长是图像分析中的两项核心统计特征,它们为理解和量化图像中的形状提供了基础。轮廓面积:这代表了轮廓所界定区域的像素数量,是衡量区域大小的直接指标。面积的计算结果以像素平方为单位,为我们提供了一个量化的尺度来比较不同物体的相对大小。轮廓周长......
  • OpenCV图像处理——按最小外接矩形剪切图像
    引言在图像处理过程中,提取感兴趣区域(ROI)并在其上进行处理后,往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤:找到最小外接矩形:使用cv::boundingRect或cv::minAreaRect提取感兴趣区域的最小外接矩形。从原图中提取ROI:根据矩形坐标从原图中剪切出RO......
  • 面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方
    面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方式,并解释每种方式的基本思想。更多关于多线程编程的深入解析、面试技巧、以及实战项目源码,手机浏览器即可访问面霸宝典【全拼音】.com,这里不仅可以优化你的简历,还能进行模拟面试,获取最新最......
  • Golang使用Option设计模式优雅处理可选参数
    go语言不像其他语言函数的参数可以设置默认值以下是参考第三方库的写法packagemainimport"fmt"typeUserstruct{namestringageintidint}//Option代表可选参数typeOptionfunc(foo*User)//WithName为name字段提供一个设置器funcWithName(name......
  • 微信和支付宝直连商户合并处理投诉管理,支持多商户
    大家好,我是小悟玩过微信或支付宝生态的,或许就有这种感受,如果收到投诉单,不会通知到手机端。只会在微信支付商户平台或支付宝商家平台显示,这样处理往往不及时,一旦处理不及时,超时什么的,就会受到相应的处罚。为了更高效地处理用户投诉,为用户提供更好的售后服务体验。所以还......
  • C安全编程教学-预处理器-避免不安全宏参数的副作用
    注:本课程参考文献《C安全编码标准》 欢迎关注我......