所以我有一个Spring Boot应用程序。
我创建了一个过滤器,该过滤器从请求中获取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类为singleton(?)并使其可用于控制器(如果过滤器失败,则用户将无法访问控制器,因此我可以假设AuthManagementUser将始终具有数据)。但是目前,当我在控制器内部时,AuthManagementUser对象为null。

感谢帮助!

最佳答案

我认为您的问题是由@Scope@Autowire混合引起的。在构造相应的bean之后,所有用@Autowire注释的字段都将被填充,因此这是一次性的事情。在您的情况下,您想根据请求替换Bean,这不是@Autowired的含义(TBOMK)。

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

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

10-06 16:02