JAVA의 jnlp를 사용한 웹 상에서 application 실행
JNLP ?
Java Network Launching Protocol
- 웹상에서 java application을 실행시킬수 있는 프로토콜
- java에서 지원하는 JWS(java web start) 기능을 가지고 실행한다.
JNLP 예제
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://127.0.0.1:8080" href="/file_upload.jnlp?message=111">
<information>
<title>File Upload Test</title>
<vendor>YMtech</vendor>
<homepage href="https://wwww.ymtech.co.kr/" />
<description>KISTI Large File Upload Test</description>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.8+" />
<jar href="file_upload.jar" />
</resources>
<application-desc main-class="kr.co.ymtech.Main">
<argument>111</argument>
</application-desc>
</jnlp>
Tag 설명
- jnlp
- codebase: 서버 상에 있는 JWS와 관련된 내용이 있는 기본 디렉토리를 설정, context path가 포함된 server url로 설정하면 된다.
- href: codebase를 기준으로 .jnlp 파일의 상대적인 경로
- information
- 작성자, 파일 정보를 정의한다.
- title, vendor, homepage, description 등등을 포함한다.
- j2se
- 어플리케이션을 실행할 java version을 입력한다.
- jar
- 실제로 실행될 어플리케이션의 위치를 설정한다. codebase + jar로 접근 할 수 있는 위치여야한다.
- application-desc
- main-class: application이 초기 실행되는 main class의 위치. application project 내의 package
- argument: application이 실행될때 필요한 argument
JNLP 실행 설정
1. jar 파일에 security 적용
- jar 파일을 client에서 사용하기 위해서는 인증이 되어있어야한다.
- 위 인증 작업을 하기 위해선 java와 인증서 파일이 있어야 한다.
jarsigner -keystore [인증서 파일] [적용한 jar 파일] [인증된 alias 이름]
2. tomcat 설정
- tomcat에서 JNLP를 사용할 수 있는 설정이 필요하다.
- tomcat의 web.xml을 수정한다.
- tomcat의 기본적으로 jnlp에 관련된 설정이 되어있기 때문에 확인만 해도 된다.
<mime-mapping>
<extension>jnlp</extension>
<mime-type>application/x-java-jnlp-file</mime-type>
</mime-mapping>
JNLP 파일 동적 생성
- 위에서 설명한
argument
를 동적으로 받기 위해서는 동적으로 jnlp 파일을 생성하고 이를 client에게 전달해야한다.
@RequestMapping(path = "/d/{token}", method = RequestMethod.GET)
public void downloadLargeFile(@PathVariable("token") String token, HttpServletRequest request, HttpServletResponse response) throws IOException {
String codebase = downloadService.getCodebase();
String jarPath = request.getContextPath() + "/jar/LargeFileDownloader.jar";
String href = request.getContextPath() + "/api/d/" + token;
String sftpRequestUrl = "/api/sftp/" + token;
String tokenDeleteUrl = "/api/token/" + token;
response.setHeader("pragma", "no-cache");
response.setHeader("Expires", "0");
// 응답받을 형태를 jnlp file로 설정
response.setContentType("application/x-java-jnlp-file");
StringBuffer jnlp = new StringBuffer();
jnlp.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
.append("<jnlp spec=\"1.0+\" codebase=\"" + codebase + "\" href=\"" + href + "\">")
.append(" <information>")
.append(" <title>Large File Downloader</title>")
.append(" <vendor>YMtech</vendor>")
.append(" <homepage href=\"https://wwww.ymtech.co.kr/\" />")
.append(" <description>KISTI Large File Downloader</description>")
.append(" </information>")
.append(" <security>")
.append(" <all-permissions/>")
.append(" </security>")
.append(" <resources>")
.append(" <j2se version=\"1.8+\" />")
.append(" <jar href=\"" + jarPath + "\" />")
.append(" </resources>")
.append(" <application-desc>")
.append(" <argument>" + codebase + sftpRequestUrl + "</argument>")
.append(" <argument>" + codebase + tokenDeleteUrl + "</argument>")
.append(" </application-desc>")
.append("</jnlp>");
// 생성한 jnlp파일 정보를 response에 담아서 보냄.
// 이런식으로 생성하면 받는 client에서는 jnlp파일을 다운로드 받는다. 이를 실행하면 jnlp정보를 기반으로 jar파일을 실행한다.
response.getWriter().print(jnlp.toString());
}