Spring GenericFilterBean 中的异常处理

     2023-02-23     19

关键词:

【中文标题】Spring GenericFilterBean 中的异常处理【英文标题】:Exception handling in Spring GenericFilterBean 【发布时间】:2015-10-08 09:08:33 【问题描述】:

我已经实现了基于令牌的身份验证(没有弹簧安全性)。所以在 GenericFilterBean 中,它会检查并声明令牌。

public class MyTokenFilter extends GenericFilterBean 

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws MyAuthException 

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (!"OPTIONS".equals(request.getMethod())) 

            String authHeader = request.getHeader("Authorization");

            if (authHeader == null || !authHeader.startsWith("Token ")) 
                throw new MyAuthException("Authorization header needed"); // Should return custom http status response like 400
            

            String token = authHeader.substring(6);

            try 
                claimToken(token);
             catch (Exception e) 
                throw new MyAuthException("Invalid token."); // Should return custom http status response like 401
            

        

        chain.doFilter(req, res);

    


所以在这个过滤器中似乎一切正常。但我需要使用 json 发送具有不同 Http Statutes 的响应。我可以将 ResponseEntitiyExceptionHandler 与@ControllerAdvice 一起使用。所以我可以在我的控制器中处理异常。

@ControllerAdvice
public class MyPrettyExceptionHandler extends ResponseEntityExceptionHandler 

    @ExceptionHandler(MyAuthException.class)
    @ResponseBody
    public ResponseEntity<Object> handleCustomException(HttpServletRequest req, MyAuthException ex) 
        Map<String, String> responseBody = new HashMap<>();
        responseBody.put("error", "true");
        responseBody.put("message", ex.getMessage());
        return new ResponseEntity<Object>(responseBody, HttpStatus.INTERNAL_SERVER_ERROR);
    

我知道它是如何工作的以及过滤器和控制器的顺序以及它们的异常(过滤器在控制器之前完成它们的工作,因此它们与控制器的作用域不同)。所以很自然我不能用 ControllerAdvice 处理过滤器的异常。

那么在过滤器中处理异常的有效方法是什么(就像我的示例方式)?你能建议我另一种方法吗?

【问题讨论】:

【参考方案1】:

您应该使用 response.sendError 发送错误代码和状态:

public class MyTokenFilter extends GenericFilterBean 

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (!"OPTIONS".equals(request.getMethod())) 

            String authHeader = request.getHeader("Authorization");
            if (authHeader == null || !authHeader.startsWith("Token ")) 
                //throw new MyAuthException("Authorization header needed"); // Should return custom http status response like 400
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Authorization header needed");
                return ;
            

            String token = authHeader.substring(6);
            try 
                claimToken(token);
             catch (Exception e) 
                //throw new MyAuthException("Invalid token."); // Should return custom http status response like 401
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid token.");
                return ;
            
        
        chain.doFilter(req, res);
    

【讨论】:

spring-security

...SpringSecurity提供,而是Spring框架本身就存在的。它继承自GenericFilterBean,Servlet容器在启动的时候就会执行GenericFilterBean的init方法。我们看看子类DelegatingFilterProxy的initFilterBean()方法里面做了什么事在debug模式下我们可以看到真实的... 查看详情

如何基于 URL 模式应用 Spring Boot 过滤器?

...述】:我创建了一个SpringBoot过滤器-使用@Component注释实现GenericFilterBean。@ComponentpublicclassMyAuthenticationFilterextendsGeneric 查看详情

带有 permitAll() 和过期身份验证令牌的 URL 的 Spring Security

...8:42:43【问题描述】:我正在使用带有SpringSecurity、自定义GenericFilterBean和AuthenticationProvider实现的Spring4。除了用于创建新会话 查看详情

如何使用 Spring Cloud Sleuth 向每个 span 添加信息

...添加到每个Span。到目前为止我所尝试的:使用我自己的GenericFilterBean和HandlerInt 查看详情

将@Component 添加到自定义 Spring Security 过滤器的含义是啥

...发布时间】:2014-08-1409:28:02【问题描述】:我有一个扩展GenericFilterBean的自定义SpringSecur 查看详情

MockMvc 使用模拟会话绕过安全性

...护:@PreAuthorize注释和提供额外无状态身份验证的自定义GenericFilterBean。有些人使用MockMvc首先发布到登录url,然后从指定的端 查看详情

springboot1.5.9和嵌入式jetty服务器在运行时抛出空指针异常?

我正在将我们的springboot应用程序更新为1.5.9并且我遇到了以下运行时(nullpointerexception并嵌入了jetty服务器:Causedby:java.lang.NullPointerExceptionatorg.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:207)~[sp 查看详情

spring/boot/cloud系列知识:springmvc进行http信息接收和发送的过程(代码片段)

...点,而是Servlet容器的知识点。SpringMVC自身也有一套以GenericFilterBean为代表的Filter过滤器体系,后者实现了Servlet容器的Filter接口并将Spring中的上下文、SpringMVC上下文等关键信息封装起来便于开发人员使用。在一次HTTTP请求... 查看详情

spring/boot/cloud系列知识:springmvc进行http信息接收和发送的过程(代码片段)

...点,而是Servlet容器的知识点。SpringMVC自身也有一套以GenericFilterBean为代表的Filter过滤器体系,后者实现了Servlet容器的Filter接口并将Spring中的上下文、SpringMVC上下文等关键信息封装起来便于开发人员使用。在一次HTTTP请求... 查看详情

使用 ContentCachingRequestWrapper 后缺少所需的请求正文

...发布时间】:2020-12-2617:10:29【问题描述】:我需要在我的GenericFilterBean之一中读取请求有效负载。因为我不能打电话给getreadertwice我用ContentCaching 查看详情

在弹簧过滤器中设置视图名称

...0617:11:39【问题描述】:我有一个ErrorFilter,它扩展了弹簧GenericFilterBean。如果发生错误,我想显示一个用瓷砖装饰的错误页面。有没有办法从过滤器中设置视图名称?<filter><filter-name>errorFilter</filter-n 查看详情

springsecurity知识盲区

Springsecurity知识盲区SpringSecurity中文文档JWT进阶--JJWTGenericFilterBean---MVC过滤器-超类注解EnableWebSecurity启用Web安全SpringSecurity相关资料SpringSecurity中文文档SpringSecurity中文文档JWT进阶–JJWT侧重用法,不够细致侧重用法,较为详... 查看详情

springsecurity源码解析-abstractauthenticationprocessingfilter

...tion从类图上看AbstractAuthenticationProcessingFilter这个类继承了GenericFilterBean,以及实现了MessageSourceAware和ApplicationEventPublisherAware俩个接口。从命名上看,AbstractAuthenticationProcessingFilter这个类是一个抽象类。抽象类的话应该是抽象了某一... 查看详情

filter,interceptor,aop区别与使用方法

参考技术A用法:实现Filter接口,或继承其实现类(eg:GenericFilterBean->OncePerRequestFilter->AbstractRequestLoggingFilter)用法步骤1:继承HandlerInterceptorAdapter(是HandlerInterceptor接口的实现类,有默认的空实现,可以自由选择自己需要的method... 查看详情

spring框架系列-spring和spring框架组成

Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢?本文通过这几个问题帮助你构筑Spring和SpringFramework的整体认知。@pdai​Spring框架系列(1)-Spring和Spring框架组成​​什么是Spring?​​​Spring的起源​​​​Spring的特性... 查看详情

spring--spring入门

Spring的概述-什么是Spring·Spring是一个开源框架·Spring为简化企业级应用开发而生.使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能·Spring是JavaSE/EE的一站式框架Spring的概述-什么是Spring·方便解耦,简... 查看详情

鸟瞰spring

一、spring框架概述:Spring框架主要提供了Ioc容器、AOP、数据访问、Web开发、消息、测试等相关技术的支持。1、Spring的模块1)核心容器Spring-Core:核心工具类,Spring其他模块大量使用Spring-Core;Spring-Bean:Spring定义Bean的支持;Spring-C... 查看详情

你了解spring从spring3到spring5的变迁吗?

你了解Spring从Spring3到Spring5的变迁吗?前言:**随着互联网技术的发展,Spring也在不断的进化,从最早轻量级的支持J2EE到现在对高并发,多线程异步程序的支持,spring也不断的更新自己走在技术的最前沿,我们先来从Spring3开始看看s... 查看详情