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());
}
}
다운캐스팅 => 더 많은 메소드
동일한 웹 브라우저 => 세션 공유
다른 웹 브라우저 => 세션 공유 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>