首页 > 解决方案 > 在组件之间共享一个类的实例

问题描述

所以我有一个弹簧启动应用程序。
我创建了一个从请求中获取 JWT 令牌的过滤器。然后(在同一个过滤器类中)我向另一个服务发出请求(使用带有 JWT 的 http get),我想将数据保存到自动装配类。

然后在控制器类中我想访问该数据。
我找到了一个使用 threadlocal 并使用请求范围的解决方案。
但我认为最优雅,最有春天的做事方式如下:

型号类:

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS)
public class AuthManagementUser implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String username;
    private String name;
    private String lastname;
    private String email;
    private AuthManagementOrgs[] organizations;

过滤器类:

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

    @Autowired
    RestTemplateInterceptor token;

    @Autowired
    UserService userService;

    @Autowired
    AuthManagementUser amUser;



    // filter for catching authorization token before processing request and saving
    // it in a scope request in case of request from this microservice
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (((HttpServletRequest) request).getHeader("authorization") != null){
            token.setToken(((HttpServletRequest) request).getHeader("authorization"));
            this.amUser = userService.retrieveUserDataAuthManagementMock();
        }
        chain.doFilter(request, response);
    }

}

控制器类:

@RestController
@RequestMapping(value = "user", name = "User")
public class UserController {

    @Autowired
    LdapUserRepository ldapUserRepository;

    @Autowired
    UserService userService;

    @Autowired
    AuthManagementUser amUser;

    @RequestMapping(value = "", method = RequestMethod.GET)
    public ArrayList<LdapUserModel> User()
    { 
        return this.userService.checkCreate(this.amUser);
    }

如您所见,我想让 AuthManagementUser 类单例(?)并使其可用于控制器(如果过滤器失败,用户无法访问控制器,因此我可以假设 AuthManagementUser 将始终拥有数据)。但是目前当我在控制器内部时,AuthManagementUser 对象为空......

感谢帮助!

标签: javaspringfilterautowired

解决方案


我认为你的问题是由混合引起@Scope@Autowire。所有带注解的字段@Autowire都是在构建对应的bean之后填充的,所以是一次性的。在您的情况下,您希望每个请求都替换 bean,这不是@Autowired(TBOMK)的意思。

使用时@Scope@Resource请尝试一下(请参阅https://www.baeldung.com/spring-bean-scopes)。

或者,您可以将类存储在ThreadLocal.


推荐阅读