2015-03-26 20 views
8

Tôi đã nhận thấy một điều kỳ lạ khi cố gắng tạo động các tệp JNLP dựa trên các tham số URL được truyền tới máy chủ HTTP. Nếu tôi có một cái gì đó như thế này trong mã HTML của tôi, nó hoạt động:Tại sao ứng dụng Java WebStart từ chối bắt đầu nếu url JNLP chứa%?

<embed type="application/x-java-applet;" launchjnlp="dummy.jnlp"/> 

Nếu mặt khác tôi có một nhân vật % trong thuộc tính launchjnlp, plugin đơn giản là sẽ không làm bất cứ điều gì:

<embed type="application/x-java-applet;" launchjnlp="dummy%3f.jnlp"/> 

Không có thông báo lỗi, không có màn hình Java giật gân mặc định, không có gì, âm thầm không thành công. (Thậm chí không tìm cách truy xuất tệp JNLP.)

Đây có phải là một loại tính năng bảo mật nào đó không? Nếu có, nó phải bảo vệ chống lại điều gì?
Hoặc nó có thể là một lỗi đơn giản?

Cập nhật: Sử dụng thực thể &#37; thay vì một dấu hiệu % không hoạt động hoặc.
Cập nhật 2: Tôi đã thử và không tìm thấy bất kỳ tài liệu nào về ngữ nghĩa chính xác của thuộc tính launchjnlp, nhưng toàn bộ thẻ được tạo bởi deployJava.launchWebStartApplication(jnlp), được cho là cách "chính thức" khởi chạy ứng dụng Khởi động web từ trình duyệt .
Cập nhật 3: Chỉ cần hoàn toàn rõ ràng về điều này: ví dụ trên chỉ là: ví dụ. Bạn có thể quan sát hành vi được mô tả với hoàn toàn bất kỳ URL nào (tương đối, tuyệt đối, tệp: //, http: //, bạn đặt tên), bất kỳ ký tự nào được mã hóa url hoặc thậm chí là chuỗi thoát không hợp lệ (mặc dù trong đó trường hợp nó ít nhiều được biện minh), sự tồn tại hoặc vắng mặt của một tệp JNLP thực tế là không thích hợp, bởi vì chúng tôi thậm chí không đến được nơi plugin sẽ cố tải tệp JNLP.

+1

Bạn đã thử sử dụng thực thể HTML '%'? – Obicere

+0

@Obicere Tôi vừa thử nó và nó cũng không hoạt động. Không ngạc nhiên khi tôi cho rằng thực thể sẽ được giải quyết trước khi nó đạt đến trình cắm Java. – biziclop

+0

Trong URL, dấu% được sử dụng để đánh dấu sự bắt đầu của một ký tự được mã hóa URL.Để có% chữ trong URL, bạn phải mã hóa URL đó (nghĩa là - thay thế% bằng% 25). Xem http://en.wikipedia.org/wiki/Percent-encoding –

Trả lời

6

Đây có phải là tính năng bảo mật nào đó không? Nếu có, nó là gì để bảo vệ chống lại? Hoặc nó có thể là một lỗi đơn giản?

Từ những gì tôi có thể khám phá, 'lỗi đơn giản' là câu trả lời. Đây là trang phát hành:

https://bugs.openjdk.java.net/browse/JDK-8043409

Dường như nó không được dự kiến ​​sẽ được cố định cho đến khi việc phát hành của JDK 9.

tôi muốn đề nghị cố gắng một thực hiện JDK khác nhau, nhưng điều đó dường như khó có thể thay đổi bất cứ điều gì được đưa ra amount of code shared between the Oracle and OpenJDK implementations và thực tế là WebStart code appears to be proprietary/closed-source.

Vì vậy, giải pháp thay thế mà bạn nghĩ ra bằng mã hóa base64 có lẽ là tùy chọn tốt nhất hiện nay. Nếu bạn phải thực hiện việc này thường xuyên, có thể bước mã hóa có thể được cuộn vào API JavaSript deployJava.launchWebStartApplication(jnlp) để nó tự động xảy ra nếu/khi cần.

+0

Cảm ơn bạn, tôi không biết việc triển khai plugin là nguồn đóng. Oh well. – biziclop

Các vấn đề liên quan