当前位置: 首页 > 知识库问答 >
问题:

Spring Integration-过滤器中的请求验证

仰成天
2023-03-14

我正在使用Spring Integration Filter对传入消息强制执行一些验证逻辑。验证的结果需要发回消息网关调用方,以便通知请求的具体错误。

    null
detailMessage = "message has been rejected in filter: bean 'validationFilter.requestValidation.filter.handler' for component 'validationFilter.requestValidation.filter'"

配置

网关

@MessagingGateway( name="processApiGateway", defaultRequestChannel = "inboundGatewayChannel")
public interface ProcessApiGateway {

    @Gateway
    Response getTransactions(Message<ServiceRequest> payload);

}

过滤器

 @Filter(inputChannel="inboundGatewayChannel", throwExceptionOnRejection = "true")
    public boolean requestValidation(Message<ServiceRequest> message) {
        try {
            LocalDate fromDate = LocalDate.parse(message.getPayload().getFromDate());
            LocalDate toDate = LocalDate.parse(message.getPayload().getToDate());
            return (Period.between(fromDate, toDate)).getMonths() <= 1;
        }
        catch (DateTimeParseException ex) {
            return false;
        }
    }
 @Bean
    public MessageChannel inboundGatewayChannel(@Qualifier("taskExecutor")TaskExecutor taskExecutor) {
        return new ExecutorChannel(taskExecutor);
    
 @Filter(inputChannel="inboundGatewayChannel", discardChannel = "filterDiscardChannel")
    public boolean requestValidation(Message<ServiceRequest> message) {
        try {
            LocalDate fromDate = LocalDate.parse(message.getPayload().getFromDate());
            LocalDate toDate = LocalDate.parse(message.getPayload().getToDate());
            return (Period.between(fromDate, toDate)).getMonths() <= 1;
        }
        catch (DateTimeParseException ex) {
            return false;
        }
    }
 @Service
public class ValidationServiceActivator {

    @ServiceActivator(inputChannel = "filterDiscardChannel")
    public Response handleDiscardMessage(Message<ServiceRequest> message) {
        //the same logic to validate discarded message
    }

}

共有1个答案

柳向明
2023-03-14

如果您想返回一些自定义响应,而不是异常,那么我建议您只使用普通的@ServiceActivator,在该方法中执行验证逻辑并返回这个或那个答复。在这种情况下不需要过滤器

看起来,即使使用DiscardChannel,仍然不足以确定问题...

 类似资料:
  • 重定向::客户(登录)似乎只适用于GET请求。也就是说,它将把经过身份验证的用户重定向到原始的预期URL(GET)。 在存在POST请求的情况下,在用户成功登录后,是否有一种方式让auth筛选器继续向URL发布? 一个简单的例子:我想展示一个可供任何人查看的表单。点击submit按钮后,auth过滤器将启动,并将来宾带到登录页面。成功验证后,我希望提交请求(即POST请求)继续。

  • 在Controller/JAX-RSendpoint处理请求后,如何执行Spring Security过滤器? 当请求被双向处理时,一个普通的java过滤器链应该得到控制。如何使用Spring Security过滤器实现这一点?我试着给chain打电话。doFilter()开始,并在调用后添加我的逻辑。但是,在处理请求后,控件不会返回。 关于如何实现这一点,有什么建议吗?是否有可能使用Spring

  • 在Jersey中,可以添加或 两者都是使用PackagesResourceConfig添加的: 谢谢

  • 在内部,如果出现任何异常,将被重定向&这不需要通过,可以跳过此请求。 我已经实现了OncePerRequestFilter&任何请求都不会调用它。这必须在OAuth过滤器之前调用。 让我知道这个安全配置出了什么问题。

  • 我试图在spring boot应用程序中配置的过滤器中获取请求中的Traceid以进行审计。 我们如何从过滤器中的请求中获取Traceid

  • 问题内容: 我正在与现有的servlet集成,该servlet从HTTP标头中提取一些属性。基本上,我实现的接口无法访问实际请求,它只能访问HTTP标头的k-> v映射。 我需要传递一个请求参数。计划是使用servlet过滤器从参数到标头值,但是HttpServletRequest对象当然没有addHeader()方法。 有任何想法吗? 问题答案: Extend ,覆盖标头吸气剂以返回参数: ..