【Java拦截器深度解析】:HandlerInterceptor与Filter的9大核心差异及使用场景揭秘

Spring核心原理全方位梳理:IOC、AOP、事务与自动配置 在Java后端开发中,依赖管理和对象创建是绕不开的基础问题。IOC容器通过控制反转将对象生命周期和依赖关系交给容器统一管理,从而大幅降低模块耦合;AOP则借助动态代理机制把日志、事务等横切逻辑从业务代码中剥离,使系统更易维护。理解Bean的完整创建过程、循环依赖的三级缓存方案,以及事务在代理环境下失效的原因,是排查线上问题和应对技术面试的关键。Spring Boot在核心框架之上引入了条件化自动配置,将繁杂的装配工作简化为“约定优于配置”,极大提升了工程落地效率。从容器到代理,从事务到自动化装配,这篇文章系 阅读详情

第一章:Java拦截器核心概念全景透视

Java拦截器是面向切面编程(AOP)的重要实现机制之一,广泛应用于权限控制、日志记录、性能监控等横切关注点的处理。它能够在目标方法执行前后插入自定义逻辑,而无需修改原有业务代码,从而提升系统的模块化程度与可维护性。

拦截器的基本工作原理

Java拦截器通常基于动态代理或字节码增强技术实现。在Spring框架中,拦截器通过实现 HandlerInterceptor 接口来定义预处理、后处理和最终执行逻辑。
  • preHandle:在请求处理前调用,常用于身份验证
  • postHandle:处理器执行后、视图渲染前调用
  • afterCompletion:请求完成时执行,用于资源清理

典型实现示例

// 自定义拦截器实现
public class LoggingInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        System.out.println("请求开始: " + request.getRequestURI());
        return true; // 返回true继续执行后续操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, 
                              HttpServletResponse response, 
                              Object handler, Exception ex) {
        System.out.println("请求结束: " + request.getRequestURI());
    }
}

拦截器与过滤器对比

特性拦截器过滤器
作用范围仅限Spring MVC控制器整个Web请求生命周期
依赖容器Spring容器Servlet容器
灵活性支持依赖注入配置简单但功能受限
graph TD A[客户端请求] --> B{拦截器preHandle} B -->|true| C[Controller处理] C --> D[postHandle执行] D --> E[视图渲染] E --> F[afterCompletion清理]

第二章:HandlerInterceptor深度剖析

2.1 HandlerInterceptor的执行机制与生命周期

HandlerInterceptor 是 Spring MVC 中用于拦截请求处理的核心接口,其执行贯穿请求处理的整个生命周期。通过实现该接口,开发者可在请求前、请求处理中及请求完成后插入自定义逻辑。

拦截器的三个核心方法
  • preHandle():在控制器方法执行前调用,返回值决定是否继续执行后续流程;
  • postHandle():控制器方法执行后、视图渲染前调用,可用于修改模型或视图;
  • afterCompletion():请求完全结束后调用,常用于资源清理。
典型代码示例
public boolean preHandle(HttpServletRequest request, 
                         HttpServletResponse response, 
                         Object handler) throws Exception {
    // 在此处添加权限校验逻辑
    return true; // 返回true表示放行
}

上述代码展示了 preHandle 方法的基本结构,handler 参数代表将要执行的处理器对象,可基于其类型或注解进行动态判断。

流程图:请求 → preHandle → Controller → postHandle → View渲染 → afterCompletion

2.2 拦截器链的构建与调用流程解析

拦截器链是实现请求处理前后增强逻辑的核心机制。框架在初始化阶段根据配置顺序将多个拦截器组装成链式结构。
拦截器链的构建过程
通过注册接口依次添加拦截器,容器按注册顺序维护其执行序列,确保责任链模式的有序性。
调用流程与执行顺序
请求进入时,拦截器按正序执行 preHandle 方法,响应阶段则逆序触发 afterCompletion。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 前置处理:权限校验、日志记录
    return true; // 继续执行后续拦截器
}
该方法返回 boolean 值决定是否继续流程,true 表示放行,false 则中断。
  • 构建阶段:按注册顺序形成链表结构
  • 执行阶段:前置拦截正序,后置处理逆序
  • 异常处理:任一环节异常均触发已执行拦截器的清理逻辑

2.3 基于Spring MVC的典型应用场景实战

构建RESTful API接口
在现代Web开发中,Spring MVC广泛用于构建RESTful风格的服务。通过@RestController和@RequestMapping注解,可快速暴露HTTP接口。
@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();
    }
}
上述代码定义了一个用户查询接口。@PathVariable用于绑定URL路径中的变量,ResponseEntity则封装了响应状态与数据,提升接口的语义表达能力。
表单数据处理与验证
使用@ModelAttribute接收表单提交,并结合@Valid实现数据校验,确保输入合法性。
  • @PostMapping处理POST请求
  • @Valid触发Bean Validation
  • BindingResult捕获校验错误

2.4 preHandle、postHandle与afterCompletion协同工作模式

在Spring MVC的拦截器机制中,`preHandle`、`postHandle`与`afterCompletion`三个方法共同构成请求处理的完整生命周期控制。
执行顺序与职责划分
  • preHandle:在控制器方法执行前调用,返回布尔值决定是否继续执行链;
  • postHandle:处理器执行后、视图渲染前回调,可用于修改模型或视图;
  • afterCompletion:整个请求完成后的清理操作,无论成功或异常均会执行。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 预处理逻辑,如权限校验
    return true; // 继续执行
}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    // 日志记录或模型增强
}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    // 资源释放,异常监控
}
上述代码展示了各方法的典型实现方式。`preHandle`常用于身份验证,中断非法请求;`postHandle`适合注入通用视图数据;而`afterCompletion`则保障资源安全回收,形成闭环控制流程。

2.5 自定义权限校验拦截器的实现策略

在构建高安全性的后端服务时,自定义权限校验拦截器是控制接口访问的核心组件。通过拦截请求并验证用户权限,可有效防止未授权访问。
拦截器基本结构
public class PermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 校验逻辑:从Header获取token并解析权限
        String token = request.getHeader("Authorization");
        if (token == null || !TokenUtil.validate(token)) {
            response.setStatus(401);
            return false;
        }
        return true;
    }
}
上述代码展示了基于Spring MVC的拦截器实现。`preHandle` 方法在请求处理前执行,通过 `TokenUtil` 工具类校验令牌有效性,若失败则返回401状态码并终止请求。
权限规则配置
使用配置表统一管理接口与角色的映射关系:
接口路径HTTP方法所需角色
/api/user/deleteDELETEADMIN
/api/order/listGETUSER, ADMIN

第三章:Filter过滤器底层原理揭秘

3.1 Filter在Servlet容器中的加载与执行流程

Filter是Servlet规范中用于对请求和响应进行预处理和后处理的组件。当Web应用启动时,Servlet容器根据web.xml或注解@WebFilter配置加载Filter,并实例化后存入过滤器链(Filter Chain)。
Filter的生命周期
Filter的生命周期由容器管理,包含三个阶段:
  • init():容器调用一次,用于初始化参数;
  • doFilter():每次请求匹配时执行;
  • destroy():容器销毁前调用,释放资源。
执行流程示例

@WebFilter("/api/*")
public class LoggingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("请求前处理:日志记录开始");
        chain.doFilter(req, res); // 放行至下一个Filter或目标Servlet
        System.out.println("响应后处理:日志记录结束");
    }
}
该代码定义了一个日志Filter,通过chain.doFilter()控制流程走向。若不调用此方法,请求将被拦截,无法到达目标资源。
执行顺序
多个Filter按<filter-mapping>声明顺序依次执行,形成责任链模式,确保处理流程可控且可扩展。

3.2 过滤器链的职责链模式实践

在 Web 框架中,过滤器链是职责链模式的典型应用,每个过滤器负责特定的预处理任务,如身份验证、日志记录或权限校验,请求依次通过链上各节点。
过滤器链执行流程
  • 请求进入时首先匹配过滤器链配置
  • 每个过滤器可选择放行或中断请求
  • 最终由目标处理器接收已处理的请求
代码示例:Go 中的中间件链实现
func LoggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r) // 调用链中的下一个处理器
    })
}
上述代码定义了一个日志中间件,它在请求处理前打印访问信息,并通过调用 next.ServeHTTP 将控制权传递给后续处理器,体现了职责链的核心机制——解耦处理步骤并支持动态组合。

3.3 字符编码与日志追踪场景下的应用案例

在分布式系统中,日志数据常跨越多个服务和时区,字符编码不一致会导致日志解析失败或乱码。统一采用 UTF-8 编码可有效避免此类问题。
日志中的多语言支持
当系统处理国际化请求时,用户操作日志可能包含中文、阿拉伯文等非 ASCII 字符。若日志组件未明确设置编码格式,易引发信息丢失。
编码一致性保障方案
  • 所有服务输出日志强制使用 UTF-8 编码
  • 在日志采集端校验 BOM 头,过滤非法字节序列
  • 配置 ELK 或 Loki 解析器显式声明 charset=utf-8
logger.SetFormatter(&logrus.TextFormatter{
  ForceColors:     true,
  DisableColors:   false,
  TimestampFormat: time.RFC3339,
  FullTimestamp:   true,
  QuoteEmptyFields: true,
})
// 设置日志输出编码为 UTF-8,确保特殊字符正确写入
上述 Go 日志配置通过标准化时间格式与字段引号策略,增强日志可读性与结构一致性,配合外部编码控制实现全链路字符无损。

第四章:核心差异对比与选型指南

4.1 所属技术体系与运行环境差异

在分布式系统架构中,不同组件往往隶属于异构的技术体系,其运行环境也存在显著差异。这种差异不仅体现在编程语言和依赖库上,还涉及操作系统、网络配置及资源调度机制。
技术栈对比
  • 前端服务多采用 Node.js 构建,依赖 V8 引擎运行于 Linux 容器中
  • 后端计算模块常使用 Go 或 Java 编写,需 JVM 或特定运行时支持
  • 数据处理层可能基于 Spark 或 Flink,依赖 YARN 或 Kubernetes 调度
典型代码示例

package main

import "fmt"

func main() {
    fmt.Println("Running in Go runtime") // 输出运行时信息
}
上述 Go 程序需在安装了 Go 运行环境的节点上编译执行,无法直接在仅支持 JVM 的环境中运行,体现了运行时依赖的刚性约束。
环境兼容性挑战
组件语言运行环境
API 网关JavaScriptNode.js + Docker
订单服务JavaJVM + Spring Boot

4.2 执行时机与请求处理阶段的精细对比

在Web服务器架构中,中间件的执行时机紧密关联于请求处理的不同阶段。通过精确控制中间件的注入位置,可实现对请求流和响应流的细粒度干预。
典型请求处理阶段划分
  • 前置处理:身份验证、日志记录
  • 路由匹配:确定目标处理器
  • 业务逻辑执行:核心功能处理
  • 响应生成:格式化输出(JSON、HTML等)
中间件执行时序示例

func LoggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Request: %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r) // 控制权交往下一级
    })
}
该代码展示了一个典型的日志中间件,在请求进入后立即记录元信息,其执行位于前置处理阶段,早于业务逻辑。
执行阶段对比表
阶段可执行操作典型中间件
前置认证、限流JWT验证
后置压缩、缓存Gzip压缩

4.3 异常处理机制与资源释放行为差异

在不同编程语言中,异常处理与资源管理的协同机制存在显著差异。以 Go 和 Java 为例,Go 不支持传统 try-catch 结构,而是通过 defer 语句确保资源释放。
func readFile() {
    file, err := os.Open("data.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close() // 确保函数退出前关闭文件
    // 处理文件内容
}
上述代码中,defer file.Close() 在函数返回前自动执行,无论是否发生错误,保障了资源安全释放。
资源释放模式对比
  • Java 使用 try-with-resources,依赖 JVM 自动调用 close()
  • Go 依赖开发者显式使用 defer,更灵活但易遗漏
该机制差异直接影响程序的健壮性与可维护性。

4.4 性能开销与线程安全特性对比分析

数据同步机制
在多线程环境下,不同并发控制策略对性能和安全性影响显著。互斥锁(Mutex)虽保障线程安全,但可能引入高竞争开销;而原子操作则以轻量级指令实现高效同步。
机制线程安全性能开销
Mutex是高
Atomic是低
无同步否最低
代码执行效率对比

var counter int64
var mu sync.Mutex

func incrementAtomic() {
    atomic.AddInt64(&counter, 1) // 无锁原子操作,性能更高
}

func incrementMutex() {
    mu.Lock()
    counter++
    mu.Unlock() // 加锁解锁带来上下文切换开销
}
上述代码中,atomic.AddInt64 直接通过CPU级指令完成递增,避免了内核态切换;而 Mutex 需要操作系统介入,导致延迟增加。

第五章:最佳实践与架构设计建议

服务边界划分原则
微服务架构中,合理划分服务边界是系统稳定性的基础。应基于业务能力、数据耦合度和团队结构进行拆分。例如,在电商平台中,订单、库存与支付应作为独立服务,避免共享数据库表。
  • 单一职责:每个服务只负责一个核心业务功能
  • 数据自治:服务拥有自己的数据库实例,禁止跨库直连
  • 异步通信:高频操作使用消息队列解耦,如 RabbitMQ 或 Kafka
高可用性设计模式
为提升系统容错能力,推荐采用熔断、限流与重试组合策略。以下为 Go 中使用 Hystrix-like 熔断器的示例:

circuitBreaker := gobreaker.NewCircuitBreaker(gobreaker.Settings{
    Name: "PaymentService",
    Timeout: 10 * time.Second,
    ReadyToTrip: func(counts gobreaker.Counts) bool {
        return counts.ConsecutiveFailures > 5
    },
})
result, err := circuitBreaker.Execute(func() (interface{}, error) {
    return callPaymentAPI()
})
可观测性实施要点
分布式系统必须具备完整的监控链路。建议统一日志格式并集成 tracing ID,便于问题定位。
组件推荐工具用途
MetricsPrometheus + Grafana实时性能监控
TracingJaeger请求链路追踪
LoggingELK Stack结构化日志收集
安全通信规范
所有服务间调用必须启用 mTLS 加密,并通过服务网格(如 Istio)自动管理证书分发与轮换,减少运维负担。
java中的拦截器(Interceptor),详细分析Spring拦截器,如何理解过滤器(Filter)和拦截器(Interceptor)的关系/执行顺序【保姆级教程】 拦截器、过滤器 阅读详情

相关推荐

Java 拦截器详解:全面掌握请求处理流程优化技巧

拦截器是 AOP(面向切面编程)的一种实现方式,允许你在不修改原有代码的情况下,在方法调用前后插入自定义逻辑。在 Java 中,拦截器主要应用于 Web 应用程序中,特别是在 Spring 框架中。

墨夶的博客 783

JAVA中的拦截器、过滤器

相关解释:拦截器依赖于页面有访问controller的操作,且属于SpringMVC体系的动态拦截调用机制,是java中AOP思想的运用。来看看源码作者的注释:其中倒数第二段话,描述其类似于过滤器,但其特点只允许使用自定义预处理,不能处理程序本身。此处可体现AOP思想。过滤器是在web.xml中配置,web.xml是应用程序上下文中的HandlerInterceptor。最后一段话,则体现了拦截器常用情况,如常见处理程序代码和授权检查。

qq_38254635的博客 1万+

UNITY3D万人同屏,Dots万人同屏解决方案_类萌宠宠之战

UNITY3D弹幕游戏开发,万人同屏解决方案

6473

JAVA三大器之拦截器

拦截器(Interceptor):java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。1.过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,拦截器的实现,用到的是JDK实现的动态代理,我们都知道,JDK实现的动态代理,需要依赖接口。......

weixin_69292345的博客 7502

“傻瓜”stata入门——熟悉操作界面

小白开始学习stata和matlab,零基础上手

nnpersistent的博客 4457

个人信息保护合规审计人员(高级)能力考核试卷+面试模拟

《个人信息保护合规审计考试与面试指南》 摘要:本文提供个人信息保护合规审计考试及面试的全面指导。考试采用闭卷笔试形式,满分100分,合格线75分,时长120分钟,包含单选、多选、判断题及综合案例分析题。内容涵盖《个人信息保护法》核心条款、审计程序、风险评估等实务要点。面试环节采用情景模拟方式,重点考察应试者在压力下处理审计独立性、客户关系与监管要求的平衡能力,以及应对数据泄露等突发事件的处置流程。案例题聚焦大型互联网平台的数据收集、共享、跨境传输等高风险环节的合规审计,要求设计完整的审计方案框架。面试评分标

qq_41525079的博客 1143

Java 拦截器

一、引言   既然要用拦截器,首先先得简单了解一下什么是拦截器:   概念:java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。   作用域:动态拦截Action调用的对象(也就是我们的controller层)   我们日常开发中,经常会遇到这个场景:在访问系统功能前,需要用户登录,不登陆的话无法使用我们的系统,那么如果在每个方法

qq_23107097的博客 2万+

从SolidWorks到Simulink:手把手教你用URDF文件搭建六轴机械臂仿真模型(含STL文件配置避坑)

本文详细介绍了从SolidWorks到Simulink的六轴机械臂URDF仿真全流程,包括URDF文件导出、Simscape模型生成与调试、动力学参数获取与验证等关键步骤。重点解决了STL文件配置、关节接口设置等工程化难题,帮助开发者高效构建可控制的数字孪生体。通过实战案例和优化技巧,提升机械臂仿真效率与准确性。

weixin_26812607的博客 266

前端学 Java 课程笔记

面向前端开发人员:大量以前端概念类比

estrusKing的博客 230

用HFSS仿真平面线圈的电感量

平面线圈是指在平面上绕制而成的线圈,如PCB上的电感线圈、无线供电使用的金属丝绕制而成的线圈等。根据线圈的不同形状可将平面线圈分为方形线圈,六角形线圈、八角形线圈、螺旋原型线圈等。

johnboat的专栏 1万+

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 511

Java拦截器(Interceptor)和过滤器(Filter)实例详解

过滤器和拦截器的区别,以及使用代码使用案例。

帅帅气气的黑猫警长 8046

【AUTOSAR-DCM】-3.1-将CDD导入CFG并查看$22服务配置变化(UDS诊断DID带一个Data)

案例背景:(共8页精讲) 在《【UDS诊断描述文件CDD】-3.2-编辑CDD给$22服务创建一个带一个Data的DID(dataIdentifier)数据标识符》中,适应使用CANdela Studio在CDD中创建一个带一个Data的DID(dataIdentifier)数据标识符,见图0-1。现在我们将该CDD文件导入到CFG(DaVinci Configurator),看看配置会发生哪些变化。 图0-1 目录 1 将诊断描述文件CDD导入CFG(DaVinci Configurator.

「汽车电子助手」的博客 1633

JAVA三种拦截方式

最近面试有遇到拦截方式的场景,结合网上xdm的代码整理了下,分为以下三种:java原生过滤器Filter、springMVC拦截器、aop切面。

21届Java攻城狮&Python民兵 5264

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 552

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

springmvc---day2

拦截器开发 步骤1:创建拦截器类 让类实现HandlerInterceptor接口,重写接口中的三个方法。 @Component //定义拦截器类,实现HandlerInterceptor接口 //注意当前类必须受Spring容器控制 public class ProjectInterceptor implements HandlerInterceptor { @Override //原始方法调用前执行的内容 public boolean preHandle(HttpServ...

m0_63703905的博客 593

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

重学Java基础篇—拦截器(Interceptor)使用指南

场景拦截器实现权限验证在preHandle中检查 Session 或 Token日志记录记录请求路径、耗时,在中统计全局参数添加在postHandle中修改 ModelAndView异常统一处理在中捕获并跳转错误页拦截器是 Spring MVC 中强大的工具,适用于需要与业务逻辑紧密集成的横切关注点(Cross-Cutting Concerns)。合理使用拦截器,能让代码更简洁、可维护性更高。

有天你会让我妒忌的 2875

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot统一功能处理-拦截器

大家好,今天给大家介绍一下SpringBoot的统一功能:拦截器拦截器是Spring框架提供的核心功能之一,主要⽤来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码也就是说, 允许开发人员提前预定义一些逻辑, 在用户的请求响应前后执行. 也可以在用户请求前阻止其执行在拦截器当中,开发人员可以在应⽤程序中做⼀些通用性的操作, 比如通过拦截器来拦截前端发来的,判断Session中是否有 请求用户的信息. 如果有就可以放行, 如果没有就进行拦截。

weixin_73869209的博客 1294

Java三大器之拦截器(Interceptor)的实现原理及代码示例

过滤器与拦截器的区别 过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是方法调用,比如拦截 敏感词汇。 4.1,拦截器是基于java反射机制来实现的,而过滤器是基于函数回调来实现的。(有人说,拦截器是基于动态代理来实现的) 4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。 4.3,拦截器只对Action起作用,过滤器可以对所有请求起作用。 4.4,拦截器可以访问Action上下文和值栈中的对象,过滤器不能。 4

reggergdsg的博客 27万+

Java拦截器

(1)自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor(2)在配置文件中注册定义的拦截器。(3)在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

m0_73648753的博客 673

JAVA拦截器

java拦截器简单回顾

qq_42577109的博客 630

Java:拦截器简介和应用示例(多个拦截器+校验token是否为空)

Java拦截器的介绍和简单应用

longtimetoc的博客 2351

一文带你读懂Java拦截器(Interceptor)

本文全面介绍Java拦截器(Interceptor),主要内容包括:1.拦截器简介,对比拦截器、过滤器和AOP的区别;2.源码分析,详细解析HandlerInterceptor接口、HandlerInterceptorAdapter抽象类等核心组件;3.拦截器执行流程,通过时序图和源码展示处理过程。拦截器作为Spring框架的重要组件,可用于权限验证、日志记录等场景,具有前置处理、后置处理和异常处理能力,是开发者需要掌握的重要技术。

new_daimond的博客 1395

java 过滤器、拦截器

Filter和HandlerInterceptor的认识与原理的学习

qq_17842663的博客 1684

Javaweb——拦截器(Interceptor)

定义一个类实现标准的拦截器的接口HandlerInterceptor,然后要去实现这个接口的三个方法,分别是preHandle,postHandle,afterCompletion。

2303_79136949的博客 1459

Java 拦截器Interceptor详解

核心作用:在 Spring MVC 请求处理流程中插入横切逻辑。关键方法preHandle(拦截)、postHandle(后处理)、(收尾)。配置方式:推荐使用配置类,支持路径排除与顺序控制。适用场景:权限校验、日志记录、性能监控、全局异常处理等。

m0_65181864的博客 873
上一篇: 如何用Python 10分钟自动填写表单?PyAutoGUI真实项目应用揭秘
下一篇: 为什么92%的AI加速项目在C语言封装层卡壳?——揭秘3类未文档化硬件行为及对应5层防御性封装策略
LiteTrans
博客等级 码龄1年 128粉丝 2009原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值