Spring:如何将对象从过滤器传递给控制器

Rob*_*rto 6 spring spring-boot

我正在尝试添加一个Filter,它创建一个对象,然后在Spring Boot应用程序的控制器中使用.

我们的想法是将Filter用作此对象的"集中式"生成器 - 这是特定于请求的,仅在控制器中有用.我试过使用这个HttpServletRequest request.getSession().setAttribute方法:我可以在控制器中访问我的对象,但随后它会(明确地)添加到会话中.

滤波器是否是正确的方法?如果是,我在哪里可以保持过滤器生成的临时对象供控制器使用?

ima*_*era 10

为什么不使用Bean @Scope('request')

@Component
@Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS)
class UserInfo {
   public String getPassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   private String password;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以Autowireed 在过滤器和控制器中使用这个bean来设置和获取数据.

这个UserInfobean的生命周期只在请求中存在,所以一旦http请求完成,它也会终止实例

  • 很好的答案!请注意,引入了新的组合注释 @RequestScope ,其作用与 @Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS) 相同 (3认同)
  • 你能把完整的例子贴出来吗? (2认同)

wco*_*ong 9

你可以使用ServletRequest.setAttribute(String name,Object o);

例如

@RestController
@EnableAutoConfiguration
public class App {

    @RequestMapping("/")
    public String index(HttpServletRequest httpServletRequest) {
        return (String) httpServletRequest.getAttribute(MyFilter.passKey);
    }

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Component
    public static class MyFilter implements Filter {

        public static String passKey = "passKey";

        private static String passValue = "hello world";

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {

        }

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            request.setAttribute(passKey, passValue);
            chain.doFilter(request, response);
        }

        @Override
        public void destroy() {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

对 wcong 答案的补充。从 Spring 4.3 开始,使用 设置属性后request.setAttribute(passKey, passValue);,您可以通过简单地使用 注释来访问控制器中的属性@RequestAttribute

前任。

@RequestMapping("/")
public String index(@RequestAttribute passKey) {
    return (String) passKey;
}
Run Code Online (Sandbox Code Playgroud)