我尝试过以下方式设置网络代理,但没有一种方法正常工作
1:设置jvm变量,如-Dhttp.proxyHost = -Dhttp.proxyPort = .......
2:创建了Bean。
@Bean
public RestTemplate restTemplate() {
final String proxyHost = "######"; // host
final int proxyPort = ####; // port
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)));
return new RestTemplate(factory);
}
但OAuth2AccessTokenSupport.restTemplate会覆盖此配置。
因此,下面的方法总是返回新创建的rest模板对象。
org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport
protected RestOperations getRestTemplate() {
if (restTemplate == null) {
synchronized (this) {
if (restTemplate == null) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(getResponseErrorHandler());
restTemplate.setRequestFactory(requestFactory);
restTemplate.setInterceptors(interceptors);
this.restTemplate = restTemplate;
}
}
}
if (messageConverters == null) {
setMessageConverters(new RestTemplate().getMessageConverters());
}
return restTemplate;
}
请帮助我在OAuth客户端应用程序中覆盖或设置其余模板的代理。
答案 0 :(得分:2)
另一种方法是将自定义AccessTokenProvider设置为OAuth2RestTemplate。在下面的代码示例中,绕过了SSL验证:
NSMutableArray *redValues = [NSMutableArray array];
NSMutableArray *arrayTwelve = [NSMutableArray array];
__block int counter = 0;
__block NSInteger u;
NSUInteger redValuesLength = [redValues count];
__block int arrayTwelveLength = 0;
__block float diffForAverage, fps, averageTime, bloodSpeed;
float average;
__block int amount = 1;
__block float totalTwelve, totalThirteen;
__block NSUInteger totalNumberOfFramesInSmallArrays = 0;
__block NSUInteger totalNumberOfFramesNotInSmallArrays;
for (u = (counter + 24); u < (redValuesLength - 24); u++)
{
diffForAverage = average - [redValues[u + 1] floatValue];
float test = [redValues[u] floatValue];
arrayTwelveLength = [arrayTwelve count];
if (diffForAverage > -1 && diffForAverage < 1)
{
totalTwelve += [redValues[u + 1] floatValue];
amount++;
[arrayTwelve addObject:@(test)];
counter++;
}
else
{
if (arrayTwelveLength >= 8)
{
counter++;
break;
}
else
{
[arrayTwelve removeAllObjects];
totalTwelve = [redValues[u + 1] floatValue];
counter++;
amount = 1;
}
}
}
amount = 1; // I added a breakpoint here
totalThirteen = [redValues[u + 1] floatValue];
average = totalThirteen / amount;
if (counter == redValuesLength)
{
totalNumberOfFramesNotInSmallArrays = redValuesLength - totalNumberOfFramesInSmallArrays - 25 - (redValuesLength - counter);
fps = redValuesLength / 30;
averageTime = totalNumberOfFramesNotInSmallArrays / fps;
bloodSpeed = 3 / averageTime;
[_BloodSpeedValue setText:[NSString stringWithFormat:@"%f", bloodSpeed]];
}
if (arrayTwelveLength == NULL)
{
arrayTwelveLength = 0;
}
totalNumberOfFramesInSmallArrays += arrayTwelveLength;
答案 1 :(得分:1)
这可能不是一个简单的解决方案。但最终设法通过以下代码在oauth请求上设置代理。
注册过滤器
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.antMatcher("/**")
.authorizeRequests().antMatchers("/webjars/**", "/scripts/**", "/styles/**", "/instances/**", "/#/invalid").permitAll()
.anyRequest().authenticated()
.and().csrf().csrfTokenRepository(csrfTokenRepository())
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.addFilterBefore(oauthFilter(), BasicAuthenticationFilter.class);
// @formatter:on
super.configure(http);
}
验证过滤器
@Autowired
OAuth2ClientContext oauth2ClientContext;
@Autowired
OAuth2ProtectedResourceDetails resource;
@Autowired
ResourceServerProperties resourceServer;
@Autowired
RequestHelper requestHelper;
private Filter oauthFilter() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
OAuth2ClientAuthenticationProcessingFilter oauthFilter = new OAuth2ClientAuthenticationProcessingFilter("/login");
OAuth2RestTemplate oauthTemplate = new OAuth2RestTemplate(resource, oauth2ClientContext);
OAuth2AccessTokenSupport authAccessProvider = new AuthorizationCodeAccessTokenProvider();
// Set request factory for '/oauth/token'
authAccessProvider.setRequestFactory(requestHelper.getRequestFactory());
AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays.<AccessTokenProvider> asList(
(AuthorizationCodeAccessTokenProvider)authAccessProvider));
oauthTemplate.setAccessTokenProvider(accessTokenProvider);
// Set request factory for '/userinfo'
oauthTemplate.setRequestFactory(requestHelper.getRequestFactory());
oauthFilter.setRestTemplate(oauthTemplate);
UserInfoTokenServices userInfoTokenService = new UserInfoTokenServices(resourceServer.getUserInfoUri(), resource.getClientId());
userInfoTokenService.setRestTemplate(oauthTemplate);
oauthFilter.setTokenServices(userInfoTokenService);
return oauthFilter;
}
请求帮助代码
@Configuration
public class RequestHelper {
@Value("${proxy.hostname}")
private String proxyHost;
@Value("${proxy.port}")
private int proxyPort;
@Value("${proxy.username}")
private String proxyUser;
@Value("${proxy.password}")
private String proxyPassword;
@Value("${useProxy}")
private boolean useProxyFlag;
@Value("${skipSslValidation}")
private Boolean skipSslValidationFlag;
public HttpComponentsClientHttpRequestFactory getRequestFactory() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
HttpClientBuilder httpClientBuilder = HttpClients.custom();
// Skip SSL validation based on condition
if (skipSslValidationFlag) {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
httpClientBuilder = httpClientBuilder.setSSLSocketFactory(csf);
}
// Set proxy based on condition
if (useProxyFlag) {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(proxyUser, proxyPassword));
httpClientBuilder = httpClientBuilder.setProxy(new HttpHost(proxyHost, proxyPort));
httpClientBuilder = httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
CloseableHttpClient httpClient = httpClientBuilder.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return requestFactory;
}
}
答案 2 :(得分:0)
这似乎是一种更清洁的解决方案:
在具有@Configuration的类中添加以下内容:
@Bean
public CustomUserInfoRestTemplateCustomizer customUserInfoRestTemplateCustomizer() {
return new CustomUserInfoRestTemplateCustomizer();
}
/**
* Customize the UserInfoRestTemplateCustomizer used by OAuthRestTemplate
*
*/
private static class CustomUserInfoRestTemplateCustomizer implements UserInfoRestTemplateCustomizer {
@Value("${http.custom.connect-timeout:500}")
private int connectTimeout;
@Value("${http.custom.read-timeout:30000}")
private int readTimeout;
@Value("${http.custom.proxy-host:}")
private String proxyHost;
@Value("${http.custom.proxy-port:-1}")
private int proxyPort;
@Override
public void customize(OAuth2RestTemplate template) {
template.setRequestFactory(new ClientHttpRequestFactory() {
@Override
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(connectTimeout);
clientHttpRequestFactory.setReadTimeout(readTimeout);
if (StringUtils.isNoneEmpty(proxyHost)) {
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
clientHttpRequestFactory.setProxy(proxy);
}
return clientHttpRequestFactory.createRequest(uri, httpMethod);
}
});
}
}
答案 3 :(得分:0)
万一有人从 Google 登陆这里...
我们遇到了与描述相同的问题。花了几天时间试图修复它,包括尝试上面的帖子。我们通过设置 JVM 代理参数来修复它没有协议!
不正确:-Dhttp.proxyHost=http://some.host
正确:-Dhttp.proxyHost=some.host