ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서블릿의 응답과 요청: 헤더값 알아내기
    Let's Code/Server 2019. 8. 30. 23:26

    WAS는 서블릿과 웹 브라우저를 이어주는 중간 관리자 같은 개념인데 서버의 과부하를 막기 위해 고안되었다고 한다. (아마도)

     

    JAVA는 *객체 지향* 즉, 객체를 생성하여 정보를 보관하는 프로그래밍 언어다. (객체 지향의 뜻이 뭘까 고민했는데 생각보다 간단했다)

    만약 웹 브라우저가 처음에 요청을 넣으면, HttpServletRequest라는 객체가 생성된 후, 이를 서블릿에 전달한다.

    이 때 보관되는 정보는, 1) 헤더정보 2) 파라미터 3) 쿠키 4) URI 5) URL 등이 있다.

     

    반대로 서블릿이 응답하면, HttpServletResponse 객체를 생성한 후, 이를 웹 브라우저에 전달한다.

    이 때 보관되는 정보는 1) content type 2) 응답코드 3) 응답 메시지 등이 있다.

     

     

     

    헤더 정보를 알아내는 서블릿

     

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("<html>");
    		out.println("<head><title>form</title></head>");
    		out.println("<body>");
    
    		Enumeration<String> headerNames = request.getHeaderNames();
    		while(headerNames.hasMoreElements()) {
    			String headerName = headerNames.nextElement();
    			String headerValue = request.getHeader(headerName);
    			out.println(headerName + " : " + headerValue + " <br> ");
    		}		
    		
    		out.println("</body>");
    		out.println("</html>");
    	}
    

    처음 요청을 보낼 때 Content Type을 우선 정해줘야 한다. 이번 경우는 html 텍스트.

    두번째 줄은 브라우저로부터 응답을 받을 통로를 get으로 설정한 것이라고 한다. 그 후, html 태그 배열.

    Enumeration 메소드는 특정 결과값을 다른 타입으로 바꿔주는 메소드라고 하는데, 이번 경우에서는 헤더의 정보값을 문자열인 String으로 변환하는 데 쓰였다. 

    getHeader 메소드로 헤더 값 추출, 헤더 이름 : 헤더값 형식으로 출력하도록 지정하였다.

    * 이 때, 줄바꿈을 위해 끝에 <br> 태그를 넣어줄 것.

     

     

     

    파라미터 값을 알아내는 서블릿

     

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("<html>");
    		out.println("<head><title>form</title></head>");
    		out.println("<body>");
    
    		String name = request.getParameter("name");
    		String age = request.getParameter("age");
    		
    		out.println("name : " + name + "<br>");
    		out.println("age : " +age + "<br>");
    		
    		out.println("</body>");
    		out.println("</html>");
    	}
    

     

    웹 페이지의 주소창에서 만약 끝맺음이 "?name=kim&age=5" 라면 물음표 다음부터 파라미터다. (지금 쓰고있는 티스토리의 경우 ?type=post&returnURL=~~ 라고 되어있는데 type이라는 이름 값이 post라는 것을 알 수 있다)

    여기서는 name이 이름, kim이 값이다. &는 다른 파라미터들을 연결할 때 쓰는 기호인데, 무한정 사용할 수 있다.

     

    처음에 age 값이 분명 5라는 숫자인데 왜 String (문자라는 뜻)이지? 하고 헷갈렸는데 서블릿은 이를 분별하는 능력이 없으며 다 문자로 받는다고! ("name")이라고 명시해주면 찾아내어서 그 값인 kim이 String 다음에 온다고 한다.

     

    만약 접속하는 주소를 ?name=lim&age=7 라고 바뀐다면 응답 결과도 바뀐다. 동적인 페이지니까!

     

     

    URL, URI 등을 알아내는 서블릿

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("<html>");
    		out.println("<head><title>info</title></head>");
    		out.println("<body>");
    
    		String uri = request.getRequestURI();
    		StringBuffer url = request.getRequestURL();
    		String contentPath = request.getContextPath();
    		String remoteAddr = request.getRemoteAddr();
    		
    		
    		out.println("uri : " + uri + "<br>");
    		out.println("url : " + url + "<br>");
    		out.println("contentPath : " + contentPath + "<br>");
    		out.println("remoteAddr : " + remoteAddr + "<br>");
    		
    		out.println("</body>");
    		out.println("</html>");
    	}
    
    
    }

     

    url에서 포트번호와 프로젝트 명을 제외한 값이 uri.

    WAS에 저장된 여러 웹 어플리케이션 중 적절한 경로를 찾아가기 위한 주소가 contentPath인데, 별도의 설정을 하지 않는다면 서블릿의 이름과 같다.

    remoteAddr는 클라이언트의 주소.

    댓글