2012-09-29 3 views
2

누구든지 전에이 문제가 발생 했습니까? 애플릿을 작동시키는 데 많은 어려움을 겪고 있습니다. 내가 작동하지 않는 이유는 서버와 통신하기 위해 내 프로그램에있는 소켓 때문입니다. 그러나, 나는 그것을 멈추는 방법을 알아낼 수 없다. 그리고 구글은 도움이되지 못한다. 구글 크롬에 대한 자바 콘솔이 오류를 출력하지 않기 때문에 오류가 발생했다는 것을 알 수있다. 오류가 발생했다는 것을 알리는 오류가있는 애플릿을 클릭 한 후 팝업 만 표시한다. 코드가 필요한 경우 추가 할 것입니다. 미리 감사드립니다.Java : 보안 예외 - 잘못된 URL 리디렉션

security: --- parseCommandLine converted : -Djava.net.preferIPv4Stack=true 
into: 
[-Djava.net.preferIPv4Stack=true] 
basic: Added progress listener: [email protected] 
basic: Plugin2ClassLoader.addURL parent called for http://voidchar.com/Other/DatRLTest.jar 
basic: Plugin2ClassLoader.addURL parent called for http://voidchar.com/Other/SharedClasses.jar 
security: Blacklist revocation check is enabled 
security: Trusted libraries list check is enabled 
network: Cache entry found [url: http://voidchar.com/Other/DatRLTest.jar, version: null] prevalidated=false/0 
cache: Resource http://voidchar.com/Other/DatRLTest.jar has expired. 
network: Connecting http://voidchar.com/Other/DatRLTest.jar.pack.gz with proxy=DIRECT 
network: Connecting http://voidchar.com:80/ with proxy=DIRECT 
basic: exception: illegal URL redirect. 
java.lang.SecurityException: illegal URL redirect 
at com.sun.deploy.net.HttpUtils.followRedirects(Unknown Source) 
at com.sun.deploy.net.BasicHttpRequest.doRequest(Unknown Source) 
at com.sun.deploy.net.BasicHttpRequest.doGetRequestEX(Unknown Source) 
at com.sun.deploy.cache.ResourceProviderImpl.checkUpdateAvailable(Unknown Source) 
at com.sun.deploy.cache.ResourceProviderImpl.isUpdateAvailable(Unknown Source) 
at com.sun.deploy.cache.DeployCacheHandler.get(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
at sun.plugin.PluginURLJarFileCallBack.downloadJAR(Unknown Source) 
at sun.plugin.PluginURLJarFileCallBack.access$000(Unknown Source) 
at sun.plugin.PluginURLJarFileCallBack$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.plugin.PluginURLJarFileCallBack.retrieve(Unknown Source) 
at sun.net.www.protocol.jar.URLJarFile.retrieve(Unknown Source) 
at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source) 
at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source) 
at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source) 
at sun.plugin.net.protocol.jar.CachedJarURLConnection.connect(Unknown Source) 
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFileInternal(Unknown Source) 
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFile(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$1000(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$JarLoader.<init>(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source) 
at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source) 
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
Ignored exception: java.lang.SecurityException: illegal URL redirect 
basic: Dialog type is not candidate for embedding 
basic: Removed progress listener: [email protected] 
basic: Loading Java Applet Failed... 
security: Accessing keys and certificate in Mozilla user profile: null 
security: Reset deny session certificate store 

편집 : 여기 애플릿을로드하는 데 사용하는 html 코드가 있습니다.


    {applet width=800 height=800 archive='DatRLTest.jar,SharedClasses.jar' code='vc.voidwhisperer.datrl.main'} 
    {PARAM name="java_arguments" value="-Djava.net.preferIPv4Stack=true"} 
    {/applet} 

보다 작음 & 징후 그것 때문에 내가 그들과 함께 뭔가를 넣어 시도 좋아하지 않았다는 사실에 교체 된 것보다 더 큰.

편집 # 2 : 병에 자체 서명했습니다. 여전히 발생하고 있습니다. 이 문제를 해결하는 방법을 아직 알지 못했습니다.

마지막 편집 : irc 채널에있는 친구 덕분에 마침내 해결책을 찾았습니다. 여기가 고정 된 방법의 일반적인 요지는 다음과 같습니다

  • 당신은 출력의 특정 라인을 보면 : 네트워크 : 프록시와 http://voidchar.com/Other/DatRLTest.jar.pack.gz 연결 = DIRECT.
  • 해당 파일을 찾을 때 존재하지 않았습니다.
  • 파일 형식에 대해 조사한 결과, jar 파일을 사용하고 jar 파일을 만들고 cmd를 열고 'pack200 example.jar.pack.gz [JarLocation]'을 입력하여 다음을 수행 할 수있는 pack200 jar입니다.
  • 이제 example.jar을 jar 파일의 이름으로 바꾸되 .pack.gz는 그대로 두십시오.
  • 이제 해당 파일을 애플릿과 동일한 디렉토리에 업로드하고 애플릿을 다시로드하십시오.

참고 : 애플릿이 서명되어 있는지 확인하십시오 !! 다른 사람들이 내가 가진 문제를 해결하는 데 도움이되기를 바랍니다.

+0

클라이언트가 java 7로 업데이트되었을 때 http://www.ol-in-berlin.de/gadget/reitti.jar에서 동일한 문제가 발생했습니다.클라이언트 측에서 Java 차세대 플러그인을 비활성화하는 것은 첫 번째 (나쁨) 해결책이었습니다. 운 좋게도 나는이 게시물을 발견하고 .pack.gz 파일을 제공합니다. 공유해 주셔서 감사합니다. (어쩌면 당신은 스스로 대답으로 게시 했어야합니다.) 이제 누군가가 자세한 설명을 할 수 있다면, 왜 이런 일이 일어나고 있는지, 그것은 훌륭 할 것입니다. – bodo

답변

4

귀하의 애플릿은 불쾌한 애플릿에 대해 사용자를 보호하기 위해 설계된 기본 애플릿의 보안 제한이다 "동성 기원"제한을 위반된다.

제한 설명 및 적용 이유는 this blog post을 참조하십시오.


어떻게 할 수 있습니까? 가장 좋은 방법은 애플릿 및/또는 서비스를 리엔지니어링하여 리디렉션이 완전히 제거되거나 제한을 위반하지 않은 URL로 리디렉션되도록하는 것입니다. 이것이 옵션이 아닌 경우 애플릿을 "신뢰할 수있는 애플릿"으로 만들어야합니다. 예 : 문제를 이해하려면 this tutorial을 참조하십시오.


UPDATE

내가 애플릿에게 신뢰할 수있는 애플릿을 잘못입니다. 도움이되지 않습니다. OpenJDK 소스 코드 (herehere)를 살펴보면 보안 정책과 상관없이 "동일 출처"보안 검사가 수행 된 것처럼 보입니다. (해당 메시지로 예외를 던지는 코드를 찾으십시오 ...)

유일한 옵션은 링크 된 웹 페이지와 동일한 호스트 및 포트에서 애플릿을 제공하는 것입니다. 즉, "동일 출신"규칙을 위반하지 마십시오.

+0

나는 애플릿에 자체 서명했다. 여전히로드되지 않습니다. 모든 클래스는로드하려는 페이지와 동일한 서버에 있습니다. 내가 orignal 게시물에 사용하고있는 html 코드를 추가했습니다. – VoidWhisperer

+0

원격으로 발생할 수있는 유일한 원인은 애플릿이 소켓을 통해 원격 IP에 연결하는 것입니다. 해결할 수있는 방법이 많지 않습니까? 나는 그것이 디렉토리에있는 것 이외의 다른 곳에서 액세스하려고 시도하지 않는 한, 그것이 접근하려고하는 .jar 파일 모두가 동일한 웹 서버에 있다는 것을 확신한다. – VoidWhisperer

+0

오류가 올 라인을 진단하는 쉬운 방법이 있는가? from, 스택 추적을 보았 기 때문에 예외가 어디서 왔는지를 나타내지 않으므로 오류가 어디서 왔는지 정확하게 파악하기가 번거롭다. – VoidWhisperer

0

Java 1.7.0_09를 사용할 때 고객 서버에서 동일한 문제가 발생했습니다. 이전 버전의 Java를 사용했다면 문제가 없었습니다. 다른 서버에서 동일한 애플릿을 실행 한 경우 문제가 발생하지 않습니다.

마지막으로 해결책을 찾았습니다. 자바 캐시를 지웠다. (이 브라우저 캐시는 다릅니다.) 윈도우 7에

을 수행 할 수 있습니다

  1. 시작 "임시 인터넷 파일"에서 Java 컨트롤 패널,
  2. 클릭 "일반"탭,
  3. 클릭 "설정",
  4. "파일 삭제"를 클릭하십시오.
  5. "캐시 된 응용 프로그램 및 애플릿"을 선택하고 확인을 누릅니다.

자바 캐시를 삭제하는 데 거의 1 분이 걸렸습니다.

모든 것이 정상적으로 작동했습니다.

2

자바가 애플릿을 요청하고 HTTP 300 응답을받을 때마다이 문제가 발생했습니다. 우선, java는 애플릿의 압축 버젼을로드하려고합니다. "yourjarfile.jar.pack.gz". 서버가 HTTP 404를 전달하면 모든 것이 예상대로 작동합니다. 그러나 서버가 HTTP 300 응답을 전달하면 Java는 경로 재 지정 대상이 있다고 가정하고 설정이 없으면 실패합니다. 내 경험에서

서버 측의 문제를 해결하기 위해 다음과 같은 작업을 수행 할 수 있습니다

  1. 애플릿이 하나의 jar 파일로 구성되어 있으며 데이터가 나중에 당신이와 애플릿을 압축 할 수 있습니다 넣지 않은 경우 pack200 도구를 사용하고 원래 jar를 새 파일로 바꿉니다. .pack.gz 파일 확장자가 원본 파일에 첨부되어 있는지 확인하십시오.
  2. 아파치가 있고 서버를 완벽하게 제어 할 수 있다면 mod_speling을 제거 할 수 있습니다. 실행중인 환경의 나머지 부분에서 이것이 정상인지 확인하십시오.
  3. .htaccess 파일을 사용할 수 있으면 애플릿이로드 된 폴더의 맞춤법 검사를 비활성화 할 수 있습니다. 이를 위해 "CheckSpelling off"라는 내용의 .htaccess 파일을 만듭니다. 이미 .htaccess 파일이있는 경우이 행을 추가하십시오.

나는 이것이 어떤 사람들을 돕기를 바랍니다.