Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Java spring-如何将值从应用程序传递到过滤器_Java_Spring_Servlet Filters - Fatal编程技术网

Java spring-如何将值从应用程序传递到过滤器

Java spring-如何将值从应用程序传递到过滤器,java,spring,servlet-filters,Java,Spring,Servlet Filters,因此,我需要在spring应用程序中添加一个过滤器,以便在将响应刷新回客户端后,写入日志文件。我要写入日志文件的值是在应用程序中确定的。换句话说,我希望将值(理想情况下是值的hashmap)传递给主处理完成后的过滤器 有没有一种最佳实践方法可以做到这一点?我可以想象,当请求第一次进入时,我可以在过滤器中实例化hashMap,将该hashMap隐藏在某个地方(在哪里?),在应用程序中检索并写入,然后在退出过滤器中再次检索并写出值。这是最好的做法吗?如果是这样: 1) 我是否只有一个在进入和退出时启

因此,我需要在spring应用程序中添加一个过滤器,以便在将响应刷新回客户端后,写入日志文件。我要写入日志文件的值是在应用程序中确定的。换句话说,我希望将值(理想情况下是值的hashmap)传递给主处理完成后的过滤器

有没有一种最佳实践方法可以做到这一点?我可以想象,当请求第一次进入时,我可以在过滤器中实例化hashMap,将该hashMap隐藏在某个地方(在哪里?),在应用程序中检索并写入,然后在退出过滤器中再次检索并写出值。这是最好的做法吗?如果是这样:

1) 我是否只有一个在进入和退出时启动的过滤器,或者我需要设置两个,一个用于应用前,一个用于应用后

2) 存放数据存储的最佳实践地点在哪里

  • 一个过滤器就足够了。过滤器中

    //在调用servlet之前。做点什么

    chain.doFilter(request, wrapper);
    
    //在servlet完成处理之后。在这里检索数据

  • 考虑局部变量。我不确定这是否是最佳做法。您将在servlet中存储数据,并在筛选器中检索(在'chain.doFilter()'之后)。但请确保在请求完成之前清理存储在ThreadLocal中的数据,因为服务器池线程可能无法清理线程本地数据

  • @Adi的回答解释了如何使用单个过滤器和过滤器链接来完成这项工作


    但是,我建议您使用
    ServletRequest.getAttribute(…)
    ServletRequest.setAttribute(…),而不是使用
    ThreadLocal
    ;查看API文档。

    Hmm。阅读文档时,我有一种不愉快的感觉,即过滤器只有在处理到达servlet之前才会启动。是吗?在servlet完成后,我如何才能让事情发生?谢谢!太好了-谢谢-这真的很有帮助。我没有意识到doFilter方法是这样链接的。这太完美了…对于变量,您如何看待request.setAttribute(“mydatahash”,new HashMap())或者类似的东西-我在某处看到了-使用请求作为数据存储?是的,使用请求作为数据存储是更好的方法。您不必担心清理ThreadLocal变量。有时我们需要填充在servlet层之外访问的数据(示例dao)在这种情况下,使用ThreadLocal是有意义的。Spring security的SecurityContextHolder就是ThreadLocal用法的一个例子。