如何使用Keycloak Spring Boot rest模板避免生成新会话?

时间:2018-04-05 13:52:05

标签: spring rest spring-boot resttemplate keycloak

我正在使用Spring Boot开发2个网络应用程序,而且我还使用Keycloak来管理身份验证和授权。

然后我从app1中暴露了一些apis。这些api是使用KeycloakRestTemplate从app2调用的。

这是一个例子:

@Autowired
private KeycloakRestTemplate restTemplate;

......

JSONObject jObj = new JSONObject(restTemplate.getForEntity(URI.create(API_URL, String.class).getBody());

我以这种方式配置了其余模板:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {  


    @Autowired
    public KeycloakClientRequestFactory keycloakClientRequestFactory;

...

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public KeycloakRestTemplate keycloakRestTemplate() {
        return new KeycloakRestTemplate(keycloakClientRequestFactory);
    }
...

}

直到这里它完美无缺,但我发现当我使用这个休息模板时,它会为每个调用生成一个新会话。 我怎么能避免它?

1 个答案:

答案 0 :(得分:0)

这取决于您如何使用它。您正在使用PROTOTYPE范围声明RestTemplate,因此每次请求时都会创建一个bean。这就是PROTOTYPE范围is all about。此外,如果您只注射一次,但是您在一次又一次启动的示例程序中对其进行测试,那么您将拥有许多bean创建。通常,我在服务中注入RestTemplate

@Service
public class RemoteAccessService{

    private RestTemplate restTemplate;

    public RemoteAccessService(RestTemplate restTemplate){
        this.restTemplate = restTemplate;
    }

    public void doSomething(){
        //Use restTemplate here
    }

}

Spring Service创建为SINGLETON,因此RestTemplate仅被请求一次。