Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringBoot中从筛选器到业务服务的Passin参数_Spring_Spring Boot - Fatal编程技术网

SpringBoot中从筛选器到业务服务的Passin参数

SpringBoot中从筛选器到业务服务的Passin参数,spring,spring-boot,Spring,Spring Boot,我有3个REST服务正在读取请求中的一些常见头参数。我需要在我的业务服务上使用该参数。与其读取每个web服务控制器上的公共头参数(@RestController),是否可以读取请求过滤器上的头并使其在业务服务上可用?如果有,是否有这样做的例子 您可以获取请求对象 HttpServletRequest请求=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 并使用请求对象访问业

我有3个REST服务正在读取请求中的一些常见头参数。我需要在我的业务服务上使用该参数。与其读取每个web服务控制器上的公共头参数(
@RestController
),是否可以读取请求过滤器上的头并使其在业务服务上可用?如果有,是否有这样做的例子

您可以获取请求对象

HttpServletRequest请求=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
并使用请求对象访问业务服务中的标题。

像@Nitin一样,建议您可以将请求对象从控制器传递到服务,并在那里读取标题。这没有问题

如果您仍然希望在筛选器中读取它,并在任何@服务中使用它,您可以执行以下操作:

@Component
@Order(1)
public class HeaderReaderFilter implements Filter {

    @Autowired
    private HeaderDataHolder headerDataHolder;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        headerDataHolder.setHeaderContent(httpRequest.getHeader("header_field"));
        chain.doFilter(request, response);
    }
}

@RequestScope
@Component
public class HeaderDataHolder {

    private String headerContent;

    public String getHeaderContent() {
        return headerContent;
    }

    public void setHeaderContent(String headerContent) {
        this.headerContent = headerContent;
    }
}

然后在您的服务类中使用
头数据支架
@Autowired
。请注意必要的
@RequestScope
,这样每个请求都有一个不同的bean。

请举例说明您需要什么,只需在RestController和filter中读取/写入头?@user7294900-我的意思是读取filter上的请求头并访问业务服务上的该参数。那么不需要先读取filter上的该参数吗?可以直接访问业务服务类(带有
@service
的类)的标题吗?谢谢您的回复。我已经测试了你的答案,它在没有过滤器的情况下运行良好。但我想要的是,避免读取我的服务类中的HttpServletRequest对象。这就是为什么我想在Filter类上阅读它。头是特定于请求的,RequestContextHolder的设计目的是让您在该线程中掌握特定于请求的属性,而不是在堆栈中传递特定于请求或请求的对象。我不认为将头分配给任何其他变量并通过堆栈传递给业务服务有任何意义。谢谢您的回复。我已经测试了Nitin Zadage的答案,它在没有过滤器的情况下运行良好。但我想要的是,避免读取我的服务类中的HttpServletRequest对象。这就是为什么我想在Filter类上阅读它。现在我来试试你的答案。我需要在我的服务类中添加
@RequestScope
吗?不,您只需要在
HeaderDataHolder
类中添加
@RequestScope
,我已经在我的REST服务中实现了此解决方案。谢谢你的支持。