所以我有一个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 ...
感谢您的帮助!
答案 0 :(得分:0)
我认为您的问题是由@Scope
与@Autowire
混合引起的。在构造相应的bean之后,所有用@Autowire
注释的字段都将被填充,因此这是一次性的。在您的情况下,您想按请求替换Bean,而这不是@Autowired
对(TBOMK)的含义。
使用@Scope
时,请尝试@Resource
(请参阅https://www.baeldung.com/spring-bean-scopes)。
或者,您可以将类存储在ThreadLocal
中。