강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

버럼님의 프로필 이미지
버럼

작성한 질문수

모의해킹 실무자가 알려주는, 파일 다운로드 취약점 공격 기법과 실무 사례 분석

[실습1-2] 직접 제작하면서 배우는 JSP 기반의 파일 다운로드 기능에 대한 이해

JasperException

해결된 질문

작성

·

77

0

안녕하세요, 코드를 실행시켰을 때 JasperException 오류가 발생하여 문의드립니다.

 

구글링 했을 때는 jsp 파일이 java로 변환되고 class 생성하는 과정에서 오류가 난다고 합니다. 그래서 WAS에서 오류를 해결할 수 있다고 하는데, 윈도우즈 환경에서 WAS를 어떻게 접근할 수 있는지 모르겠습니다.

또한, WAS 말고도 다른 방법이 있는지 궁금합니다.
제 코드와 오류를 첨부하겠습니다.
감사합니다.

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.*;,
                java.io.*;"
%>

<%
    FileInputStream fis = null; <!-- fileInputStream은 1byte씩 부르게 됨 -->
    BufferedInputStream bis = null; <!-- 그래서 버퍼드 클래스를 사용하면 버퍼를 이용해서 바이트스트림을 쌓아두고 효율적으로 관리 가능능-->
    BufferedOutputStream bos = null;

    String path = "C:\\Program Files\\Apache Software Foundation\\Tomcat 9.0\\webapps\\ROOT\\upload\\image\\";
    String org_filename = request.getParameter("org_filename"); <!-- get 메소드를 받아오는 게 아님. 그냥 입력값을 받는 것.-->
    String real_filename = request.getParameter("real_filename");

    if(org_filename = null || real_filename = null) {
        out.println("<script>alert('파일명이 입력되지 않았습니다.');history.back(-1)</script>");
        return;
    }

    try {
        File fd = new File(path + real_filename);
    
        if(!fd.exists()) {   <!-- 파일이 없으면 -->
            out.println("<script>alert('파일이 존재하지 않았습니다.');history.back(-1)</script>");
            return;
        }
        response.setHeader("Content-Type", "application/octect-stream");    <!-- 임의의 파일 -->
        response.setHeader("Content-Disposition", "attachment; filename=" + org_filename);   <!-- 다운받을 때 셋팅되는 파일 이름-->
        
        <!-- 파일 -> Byte -> Buffer -> user -->
        fis = new FileInputStream(fd);  <!-- 파일 객체가 들어와도 ㄱㅊ-->
        bis = new BufferedInputStream(fis);
        bos = new BufferedOutputStream(response.getOutputStream);

        byte[] buffer = new byte[1024];
        int i = 0;

        <!-- bis에 있는 값을 buffer로 불러왔는데, 이제 옮길게 없다면 -1이 반환됨 -->
        while((i=(bis.read(buffer))) != -1) {
            bos.write(buffer, 0, i);
        }
        bos.flush();
    } finally { <!-- 객체를 중지시키는 곳-->
        if(fis != null) <!-- 객체 생성이 제대로 되었다면--> fis.close();
        if(bis != null) bis.close();
        if(bos != null) bos.close();
    }

%>

오류

타입 예외 보고

메시지 org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp

설명 서버가, 해당 요청을 충족시키지 못하게 하는 예기치 않은 조건을 맞닥뜨렸습니다.

예외

org.apache.jasper.JasperException: org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:589)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:425)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
근본 원인 (root cause)

org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:197)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
근본 원인 (root cause)

java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp
	java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:129)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:58)
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:192)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
비고 근본 원인(root cause)의 풀 스택 트레이스를, 서버 로그들에서 확인할 수 있습니다.

답변 2

0

버럼님의 프로필 이미지
버럼
질문자

문제 해결했습니다!

우선 몇 가지 구문 오류를 수정했고, 결과적으로는 <!-- -->를 사용한 주석이 문제였습니다.

주석을 사용하려면 <%-- --%>를 사용해야 합니다.

그 이유는, JSP -> java -> class로 변환되는 과정에서, <% ~~ %> 안에 있는 코드는 java로 해석됩니다. 근데 java에서는 html 주석과 다르게 //로 사용하기 때문에 오류를 발생합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

버럼님께서 겪고 계신 JasperException 오류는 JSP 파일이 Java로 변환되고, 그 결과 생성된 클래스 파일을 찾지 못할 때 발생하는 문제를 의미합니다. 이 문제의 근본 원인은 여러 가지가 있을 수 있지만, 다음과 같은 측면에서 해결책을 제안 드리겠습니다.

1. JSP 파일 경로 확인

  • 먼저 JSP 파일의 경로가 올바르게 설정되었는지 확인해보세요. 특히, JSP 파일이 실제 웹 애플리케이션의 경로에 위치하고 있는지 확인해야 합니다.

2. JSP 파일의 문법 오류 수정

  • 코드 상에서 몇 가지 문법 오류를 발견했습니다. 예를 들어, import 문에서 세미콜론 ;이 여러 줄에 걸쳐 잘못 사용되었으며, if 문에서 =는 값을 비교하는 것이 아닌, 할당 연산자입니다. 이를 ==로 수정해야 합니다.

수정된 부분:

  <%@ page import="java.util.*, java.io.*" %>
  
  if (org_filename == null || real_filename == null) {
      out.println("<script>alert('파일명이 입력되지 않았습니다.');history.back(-1);</script>");
      return;
  }

3. Tomcat 설정 확인

  • Tomcat 설정 파일인 web.xml에서 JSP 서블릿이 올바르게 설정되었는지 확인해보세요. 기본적으로 자동 설정되어야 하지만, 사용자 설정이 변경된 경우 확인이 필요합니다.

4. JSP 파일 권한 및 캐시 삭제

  • JSP 파일의 읽기 권한이 제대로 설정되어 있는지 확인하세요. 경우에 따라서는 Tomcat의 작업 디렉터리에 캐시된 컴파일된 JSP 클래스를 삭제하고 Tomcat을 재시작하는 것도 도움이 될 수 있습니다. 이러한 캐시는 일반적으로 work 디렉터리에 위치하고 있습니다.

5. Tomcat 로그 확인

  • 더 구체적인 문제 분석을 위해 Tomcat의 logs 디렉터리에서 catalina.out 또는 localhost.log 파일을 확인하세요. 여기에는 오류의 더 많은 정보를 제공할 수 있는 추가 세부 사항이 기록됩니다.

관련해서 더 구체적인 조언이 필요하시다면, JSP 파일을 찾을 수 없는 경우에 대한 기존 Q&A 게시물을 참고해 주세요. 가능한 유사한 환경에서 발생한 문제 해결 방안이 큰 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

버럼님의 프로필 이미지
버럼

작성한 질문수

질문하기