안녕하세요 자바/애플릿 전문가, HTTP를 사용하여 검색JSE 1.8, 샌드 박스 자바 애플릿은 HTTPS를 통해로드 만에 crossdomain.xml은
나는 최신 JDK 빌드 (1.8.0_b26)와 함께 흥미로운 문제 우연히 발견했습니다.
최신 JDK로 Sandbox Java Applet을 실행하는 경우 Java 코드에서 다른 프로토콜로 서버에 다시 연결하려고합니다. WSS (보안 웹 소켓 연결을 사용하는 원래 HTTPS 대신 타사 웹 소켓 클라이언트 Java 도서관). 결과적으로 JVM은 서버에서 crossdomain.xml
파일을 검색하려고 시도합니다. 문제는 파일이 HTTP (및 HTTPS가 아닌) 프로토콜을 사용하여 검색된다는 것입니다.
예를 들어, 우리의 경우 서버 IP는 192.168.1.1이고 애플릿은 HTTPS 기본 포트 (443)를 통해로드됩니다. Java 콘솔에서 추적 레벨 5를 사용하면 crossdomain.xml
이 http://192.168.1.1:443
에서 검색됩니다. 물론 서버가 포트 443 (HTTP가 아닌)의 HTTPS 연결 만 수신하기 때문에 작동하지 않습니다.
반면에 HTTP 프로토콜을 사용하고 서버에 새로운 WS (보안되지 않은 웹 소켓 연결)를 열면 crossdomain.xml이 http://192.168.1.1:80
에서 검색되고 완전히 바뀌므로 문제가 나타나지 않습니다.
문제가 추가로 조사되었다, 우리는했습니다 몇 가지 더 관찰 :
그것은
jnlp.altCrossDomainXMLFiles
자바 VM 매개 변수를 사용하여crossdomain.xml
파일의 대체 위치를 제공 할 수있다. 우리는이 매개 변수가 우리를 위해 작동하도록 성공한 적이 결코 없다. (java_arguments 목록과 단독 애플릿 매개 변수 모두에서 시도했다.) 가능한 이유는 매개 변수가 Webstart 응용 프로그램에서만 사용되어야한다는 것입니다 (스펙에 구체적으로 쓰여지지는 않았지만). WebSocket을 연결하는 동안는 연결 스택 추적은 다음과 같습니다 : 일에서 sun.net.www.http.HttpClient.parseHTTPHeader (HttpClient.java:790)에서
. net.www.http.HttpClient.parseHTTP (HttpClient.java:647) at sun.net.www.http.HttpClient.parseHTTPHeader (HttpClient.java:787) sun.net.www.http.HttpClient.parseHTTP (HttpClient.java:647) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0 (HttpURLConnection.java:1534) 에서 0 sun.net.www.protocol.http.HttpURLConnection.access $ 200 (HttpURLConnection.java:90) sun.net.www.protocol.http.HttpURLConnection $으로의 9.run에서 (HttpURLConnection.java:1431)에서 sun.net.www.protocol.http.HttpURLConnection $ 9.run (HttpURLConnection.java:1429) at java.security.AccessController.doPrivileged (네이티브 메소드) java.security.AccessController.doPrivileged (AccessController.java:713)) at sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1428) com.sun.deploy.net.CrossDomainXML.check (알 수없는 소스) com.sun.deploy.net .CrossDomainXML.check (알 수없는 출처) : sun.plugin2.apple t.SecurityManagerHelper.checkConnectHelper (알 수 없음 소스)에서 sun.plugin2.applet.AWTAppletSecurityManager.checkConnect (알 수없는 소스)에서 sun.nio.ch.SocketChannelImpl.connect (SocketChannelImpl.java : 624)
따라서 CrossDomainXML.java 클래스의 최근 공개 된 소스 코드를 살펴 보았습니다 (2010 년 이후). 그리고 원래의 브라우저 연결이 무엇이든 관계없이 서버에서 crossdomain.xml
파일을 검색하는 동안 http 연결이 항상 사용된다는 코드에서 분명합니다.
그것이 JDK 버그 또는
crossdomain.xml
에 대한 HTTP의 엄격한 사용이 될 수있다 디자인한다?jnlp.altCrossDomainXMLFiles
샌드 박스 애플릿 내부에서 JVM 매개 변수가 지원됩니까?com.sun.deploy.net.CrossDomainXML.java
최신 버전의 소스 코드에 액세스 할 수있는 방법이 있습니까?
대단히 감사합니다.
permission java.net.SocketPermission "myhost:1024-", "connect, resolve";
당신은 할 수 있습니다
안부, 마크
'1.8.0_b26'은 "최신 JDK 빌드"가 아닙니다. 해당 베타 버전과 최신 버전 사이에 두 가지 이상의 릴리스 버전이 있습니다. 최신 JDK 빌드는 ['jdk1.8.0_20'] (http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) 또는 ['jdk1.8.0_40_b06']입니다. (https://jdk8.java.net/download.html). – Holger
@Holger, 빠른 응답에 감사드립니다. 'jdk1.8.0_40_b06'을 사용해 보았습니다 - 동일한 결과. 또한'jnlp.axlCrossDomainXMLFiles' 변수를 추가로 조사했습니다. 그것은 샌드 박스 애플릿 (아니 보안 예외)에 의해 액세스 할 수있는 것 같지만 그것을 작동하게하는 방법을 찾지 못했습니다. –