구독하면 필요한 정보를 받을 수 있어요!
안녕하세요 신기한 연구소입니다.
1. 증상
최근 개발하다가 이상한 현상을 발견했습니다. 제목처럼 jsp파일을 브라우저에서 다음과 같이 호출했는데 jsp파일이 저장되는 상황이 발생했습니다.
http://localhost:8080/test.jsp
<%
out.print("Hello!");
%>
이렇게 test.jsp를 생성하고 서버 Start 후 실행을 하면 브라우저에 "Hello!"가 보여야 하는데 test.jsp 파일이 다운로드가 됩니다. 그래서 구글링, 네이버 등 검색을 해서 다양한 해결 방법을 찾아봤습니다.
2. 시도한 방법들
파일명에 "-"를 제거해서 해결한 경우도 있고
빌드에서 설정을 바꿔서 해결한 경우도 있고
tomcat-embed-jasper와 tomcat의 두 버전이 일치하면 해결된다고 하고
Implementation의 오타를 찾아서 해결한 경우도 있고
서버를 재시작해서 성공한 경우도 있고
<@page contentType...%> 설정을 최상단으로 이동해서 해결된 경우도 있었답니다.
하지만 이 모든 것을 해봐도 계속 jsp 파일이 실행이 안되고 다운로드가 되더군요.
3. 특이한 점
우연히 다운로드 한 jsp 파일을 열어봤습니다. 그런데 jsp 파일이 실행이 되어있더군요.
무슨 말이냐면 jsp 파일이 다운로드가 되긴 했지만 실행한 결과가 기록되어 있었습니다.
실행이 안되고 다운로드가 된 test.jsp 파일을 열어보니 코딩된 소스가 있는 것이 아니고 실행 결과인 Hello! 가 타이핑되어 있었습니다. 헐헐헐~
결국 실행은 되는데 우리가 원하는 페이지로 열리는 것이 아니라 결과를 jsp 파일로 받게 된 것이었습니다.
4. 해결
그렇다면 설정에서 문제를 찾을 수 있다는 결론을 내렸습니다. 소스를 다시 확인해 봤습니다.
<%@page language="java" contentType="application/x-www-form-urlencoded; charset=UTF-8"%>
"contentType"이 "application/x-www-form-urlencoded"로 되어있더군요. 물론 기존 개발자가 코딩한 소스입니다. 그래서 검색해 보니 예전에 form 데이터 전송을 위해 사용한 타입이라고 합니다. "key=value&key=value"형식으로 key와 value를 전달하는 구조입니다. json과 약간 다릅니다. (json은 {key:value, key:value})
데이터 전송을 위한 타입이라는 의미로 그래서 jsp가 실행되고 결과를 jsp로 넘겨준 뒤 브라우저에서 다운로드가 된 것으로 보입니다.
"contentType"을 "application/json"으로 변경 후 테스트하니 더 이상 다운로드 되지 않고 브라우저에서 실행이 됩니다.
5. 결론
잘 되니 그대로 사용할까 했지만 기존에 개발되었고 잘 사용하고 있던 소스여서 우선 그대로 두고 다운 받은 jsp를 열어 결과를 확인해도 되지만 불편하더군요.
같은 파일을 복사한 후 contentType을 변경해서 작업 중입니다.
혹시 다양한 방법을 시도했음에도 jsp 파일이 실행 안되고 다운로드가 된다면 contentType을 변경해 보세요.
내일도 출근해서 즐거운 코딩을 하고 싶지만, 출근하는 그 자체는 즐겁지가 않네요..ㅎㅎㅎ
공감하면 하트~!