1017 JSP

yunha·2023년 10월 17일
0

JSP/Spring

목록 보기
14/36

로그

public class LogFilter implements Filter {
	// 로그를 파일로 만들어야 하므로 파일 객체를 멤버변수로 선언
	PrintWriter writer; // 객체 선언
	
	// {filename=c:\\logs\\webmarket.log} => filterConfig
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// c:\\logs\\webmarket.log
		String filename = filterConfig.getInitParameter("filename");
		
		// FileWriter(String fileName, boolean true/false)
        // 1) true : 기존 내용에 새로운 내용이 추가(append) - 누적됨
        // 2) false : 기존 내용을 지우고 덮어쓰기(overwrite)
        // PrintWriter(출력대상, boolean true/false)
        // 1) true : Auto flush -> writer.flush()를 생략함(임시저장 공간 비움)
        // 2) false : Auto flush 안함(임시저장 공간 비우지 않음)
		// flush()는 현재 버퍼에 저장되어 있는 내용을 클라이언트로 전송하고 버퍼 비움(JSP)
		// 파일 관련 => try catch 필수!!
		try {
			writer = new PrintWriter(new FileWriter(filename, true), true);
			
			// webmarket.log 파일 없으면 자동 생성
			// 이렇게 하겠다고 설계
			File file = new File(filename);
			if(!file.exists()) { // 설계상의 파일이 실제로 없다면
				// 설계대로 파일 생성
				file.createNewFile();
				
				writer.println(file.getAbsolutePath() + " 파일이 생성되었습니다."); // 이 자체도 로그임
			} else { // 이미 파일이 있으면
				System.out.println(file.getAbsolutePath() + " 파일이 생성되어 있습니다.");
			}
		} catch (IOException e) {
			throw new ServletException("로그 파일을 열 수 없습니다.");
		}
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		writer.println("접속한 클라이언트 IP : " + request.getRemoteAddr());
		
		// 시스템 현재 시간(시작 시간)
		long start = System.currentTimeMillis();
		writer.println("접근한 URL 경로 : " + getURLPath(request));
		writer.println("요청 처리 시작 시각 : " + getCurrentTime());
		
		// filter가 연속적으로 있다면 다음 필터로 제어 및 요청(request)/응답(response) 객체들 전달
		// 정보를 넘겨줌
		filterChain.doFilter(request, response);

		// 시스템 현재 시간(종료 시간)
		long end = System.currentTimeMillis();
		writer.println("요청 처리 종료 시작 : " + getCurrentTime());
		writer.println("요청 처리 소요시작 : " + (end - start) + "ms"); // 1000분의 1초 단위
		writer.println("==============================================");
	}

	@Override
	public void destroy() {
		// 파일 객체를 닫아줌. 메모리에서 제거
		writer.close();
	}
	
	// 접근한 URL 경로 리턴 메소드
   // http://localhost/ch11/readParameterNoErrorPage.jsp?name=개똥이
   private String getURLPath(ServletRequest request) {
      //HttpServletRequest 인터페이스 는 ServletRequest 인터페이스를 상속받음
      HttpServletRequest req; // 세션 추출-> 많이 쓰임!!
      //currentPath : URL경로 => http://localhost/ch11/readParameterNoErrorPage.jsp
      String currentPath = "";
      //queryString : 요청파라미터 => name=개똥이
      String queryString = "";
      //instanceOf 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는 데 사용됨
      if(request instanceof HttpServletRequest) {
         //자식 = (cast)부모
         req = (HttpServletRequest)request;
         currentPath = req.getRequestURI();//http://localhost/ch11/readParameterNoErrorPage.jsp
         System.out.println("currentPath : " + currentPath);
         queryString = req.getQueryString();//name=개똥이         
         System.out.println("queryString : " + queryString);
         //삼항연산자
         queryString = queryString == null?"":"?"+queryString;
      }
      //http://localhost/ch11/readParameterNoErrorPage.jsp?name=개똥이
      return currentPath + queryString;
   }//end getURLPath()
   
   //현재 시간을 얻어오는 메소드
   private String getCurrentTime() {
      //2023/03/31 17:29:12
      DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // 월 => 대문자!!
      //캘린더 객체 생성(싱글톤 : 메모리에 1번 생성하고 전역변수처럼 사용)
      Calendar calendar = Calendar.getInstance();
      //톰켓서버에서 제공해주는 시스템 현재 시간을 구해서 캘린더 객체에 세팅
      calendar.setTimeInMillis(System.currentTimeMillis());
      //2023/03/31 17:29:12 이러한 포맷을 준수하면서 리턴
      return formatter.format(calendar.getTime());
   }
}

다운캐스팅 => 더 많은 메소드

세션

  • 오직 웹 서버(ex. tomcat)에 존재하는 객체
  • 웹 브라우저마다 하나씩 존재, 서비스 제공받는 사용자 구분하는 단위 됨

    동일한 웹 브라우저 => 세션 공유
    다른 웹 브라우저 => 세션 공유 X(서로 다른 세션)

  • 요청할 때마다 쿠키 던짐(같은 정보 요청해도 다른 쿠키 같이 던져서 어느 브라우저인지 서로 구분되게 함)

메소드 종류

getAttribute(String name)
setAttribute(String name, Object value)
invalidate() : 모든 세션 속성 제거
getId() : 세션 고유 아이디 반환

<body>
	<!-- 
		요청URI : session01_process.jsp
		요청파라미터 : {id:admin, passwd=java}
		요청방식 : post
	 -->
<%
	String id = request.getParameter("id"); // admin
	String passwd = request.getParameter("passwd"); // java
	
	if(id.equals("admin") && passwd.equals("java")){
		// JSP 내장 객체 중 session 객체를 사용
		//session.setAttribute("userId", id);
		//session.setAttribute("userPW", passwd);
		// request 기본 객체의 getSession() 메소드를 사용하여 session 객체 생성 가능
		HttpSession httpSession = request.getSession();
		httpSession.setAttribute("userId", id);
		httpSession.setAttribute("userPW", passwd);
		
		out.print("세션 설정 성공!<br />");
		out.print(id + "님 환영합니다.");
	} else {
		out.print("세션 설정 실패!<br />");
	}
%>
session02.jsp =>
<%
	// Object 하위의 String 타입으로 다운캐스팅
	String id = (String)session.getAttribute("userId"); // admin
	String pw = (String)session.getAttribute("userPW"); // java
	
	out.print("설정된 세션의 속성 값[1] : " + id + "<br />");
	out.print("설정된 세션의 속성 값[2] : " + pw + "<br />");
%>

session03.jsp =>
<%
	String name;
	String value;
	int i = 0;
	// session.setAttribute(속성명, 값)
	// 열거형으로 리턴함
	Enumeration en = session.getAttributeNames(); // 속성명들을 모두 가져옴(userId, userPW)
	// 세션 속성명이 있을 때까지 반복
	while(en.hasMoreElements()){
		// name : 속성명
		name = en.nextElement().toString(); // 2회 반복(userId, userPW) / Object 타입 리턴 => 사람 눈에 보이게 형변환(.toString())
		// session.getAttribute(속성명) => 값으로 치환됨
		value = session.getAttribute(name).toString(); // (admin, java)
		
		out.print("설정된 세션 속성명[" + i + "] : " + name + "<br />");
		out.print("설정된 세션 속성값[" + i + "] : " + value + "<br />");
		out.print("<hr />");
		
		i++;
	} 
%>

-removeAttribute : 속성 자체를 삭제

<%
	String id = (String)session.getAttribute("userId"); // admin
	String pw = (String)session.getAttribute("userPW"); // java
	out.print("설정된 세션 이름 userId의 값 : " + id + "<br />");
	out.print("설정된 세션 이름 userPW의 값 : " + pw + "<br />");
	
	out.print("<hr />");
	session.removeAttribute("userId"); // userId 속성명에 해당하는 세션 속성 정보 삭제
	
	// request 객체에 포함된 클라이언트 세션이 유효한지 체킹
	if(request.isRequestedSessionIdValid() == true){
		out.print("<p>세션이 유효합니다.</p>"); // (O)
	} else {
		out.print("<p>세션이 유효하지 않습니다.</p>");
	}
	
	id = (String)session.getAttribute("userId"); // null
	pw = (String)session.getAttribute("userPW"); // java
	out.print("설정된 세션 이름 userId의 값 : " + id + "<br />");
	out.print("설정된 세션 이름 userPW의 값 : " + pw + "<br />");
	
	// 세션에 저장된 모든 세션 속성 삭제----------------
	session.invalidate(); // 로그아웃 시 사용
	
	// request 객체에 포함된 클라이언트 세션이 유효한지 체킹
	if(request.isRequestedSessionIdValid() == true){
		out.print("<p>세션이 유효합니다.</p>"); // (O)
	} else {
		out.print("<p>세션이 유효하지 않습니다.</p>");
	}
%>

getMaxInactiveInterval
setMaxInactiveInterval

<body>
	<h4>--------세션 유효 시간 변경 전--------</h4>
	<%
		// 세션에 설정된 유효 시간(로그인 후 기본 1800초(30분) 유지)
		int time = session.getMaxInactiveInterval(); // 초단위
		out.print("세션 유효 시간 : " + time + "초<br />");
	%>
	<h4>--------세션 유효 시간 변경 후--------</h4>
	<%
		// 세션 유효 시간을 1초 X 60 X 60 => 1시간으로 재설정
		session.setMaxInactiveInterval(1 * 60 * 60); // 초단위니까 1*(1이니까 생략 가능) => 3600초(1시간)
		time = session.getMaxInactiveInterval();
		
		out.print("세션 유효 시간 : " + time + "초<br />");
	%>
</body>
profile
기록

0개의 댓글