如何创建支持自定义代理设置的JavaFX WebView浏览器
JavaFX WebView 自定义代理配置实现方案
方案1:全局代理配置(全应用生效)
该方案原理是通过修改Java全局网络系统属性实现代理,配置后会对应用内所有网络请求生效,配置方式最简单,适合全应用统一使用同一代理的场景。
配置操作要在WebView实例初始化之前完成,不同代理类型的配置参数如下:
- HTTP代理配置
System.setProperty("http.proxyHost", "你的代理服务器地址"); System.setProperty("http.proxyPort", "代理端口号"); // 如需代理认证,添加以下配置 System.setProperty("http.proxyUser", "代理认证用户名"); System.setProperty("http.proxyPassword", "代理认证密码");
- HTTPS代理配置
System.setProperty("https.proxyHost", "你的代理服务器地址"); System.setProperty("https.proxyPort", "代理端口号");
- SOCKS代理配置(全局TCP流量走代理)
System.setProperty("socksProxyHost", "你的代理服务器地址"); System.setProperty("socksProxyPort", "代理端口号");
如果需要指定部分地址不走代理,可添加配置:System.setProperty("http.nonProxyHosts", "localhost|127.0.0.1|*.your-local-domain.com"),多个地址用|分隔
方案2:单WebView独立代理配置(仅当前WebView生效)
如果需要给不同WebView实例配置不同代理,不影响全局网络,需要通过拦截WebView资源请求,自行使用带独立代理配置的HTTP客户端请求资源后回传给WebEngine实现,JavaFX 11及以上版本可直接使用原生的请求拦截接口实现:
- 先构建带自定义代理的独立HTTP客户端
// 初始化代理实例 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("代理服务器地址", 代理端口号)); // 构建带代理配置的HttpClient HttpClient httpClient = HttpClient.newBuilder() .proxy(ProxySelector.of(new InetSocketAddress("代理服务器地址", 代理端口号))) // 如有代理认证需求,添加以下配置 .authenticator(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("代理用户名", "代理密码".toCharArray()); } }) .build();
- 拦截WebEngine的请求,用自定义客户端请求资源
WebEngine webEngine = webView.getEngine(); webEngine.setOnBeforeSendRequest(event -> { // 构造自定义请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(event.getLocation())) .build(); try { // 用带代理的客户端发起请求 HttpResponse<byte[]> response = httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray()); // 将响应结果回填给WebEngine event.setResponseHeader("Content-Type", response.headers().firstValue("Content-Type").orElse("text/html;charset=utf-8")); event.setResponseData(new ByteArrayInputStream(response.body())); } catch (IOException | InterruptedException e) { e.printStackTrace(); } });
如果你使用的是Java 8对应的JavaFX版本,没有原生请求拦截接口,可自行实现URLStreamHandlerFactory接管对应请求,或者使用第三方WebView组件实现独立代理配置
常见问题处理
如果配置代理后提示认证失败,可全局注册代理认证器:
Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { if (getRequestorType() == RequestorType.PROXY) { return new PasswordAuthentication("代理用户名", "代理密码".toCharArray()); } return super.getPasswordAuthentication(); } });
内容的提问来源于stack exchange,提问作者Noor Alam
相关产品推荐
相关产品推荐

