1016 JSP

yunha·2023년 10월 16일
0

JSP/Spring

목록 보기
13/36
없는 제품일 때

상세 페이지 =>

<%@ page errorPage="exceptionNoProductId.jsp" %>
<!-- 우선 순위 높아서 오류 났을 때 web.xml 안 보게 함 -->

오류 페이지 =>

<p><%=request.getRequestURL()%>?<%=request.getQueryString() %></p>
<!-- ?productId=Z1234 => 잘못된 제품명은 요청파라미터/쿼리스트링임! -->
없는 페이지일 때

오류 페이지 생성 =>

<p><%=request.getRequestURL()%></p>
<!-- 받을 값 없으니까 ?~~~ 필요없! -->

우선순위 낮은 web.xml에 바로 경로 작성

	<error-code>404</error-code>
 	<location>/exceptionNoPage.jsp</location>
  • Authentication : 인증, 로그인
  • Authorization : 인가, 권한

Filter

요청
=> request / response
=> 응답

chrome(res, resp) == filter ==> server

public class AuthenFilter implements Filter {
	// 초기화, 필터 시작
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter01 초기화 완료");
	}

	// 필터 기능 수행
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		System.out.println("Filter01 수행...");
		// /ch12/filter01_process.jsp?name=개똥이
		String name = request.getParameter("name"); // 개똥이
		// 요청 파라미터가 없으면(/ch12/filter01_process.jsp?name=)
		if(name == null || name.equals("")) {
			response.setCharacterEncoding("utf-8");
			response.setContentType("text/html;charset=UTD-8"); // MIME 타입
			PrintWriter writer = response.getWriter();
			String message = "입력된 name 값은 null입니다."; // response에 이 값이 담김
			writer.println(message);
			return;
		}
		filterChain.doFilter(request, response);
	}

	// 필터 종료되기 전 마지막 호출
	@Override
	public void destroy() {
		System.out.println("Filter01 해제...");
	}

}

web.xml =>

<!-- Filter 인터페이스의 구현 클래스를 서블릿 필터로 등록 -->
	<filter>
		<filter-name>Filter01</filter-name> // 이거로 filter-mapping이랑 세트 됨
		<filter-class>filter.AuthenFilter</filter-class> // 서블릿 등록
	</filter>
	<filter-mapping>
		<filter-name>Filter01</filter-name>
        <url-pattern>/chap12/filter01_process.jsp</url-pattern> // /* 쓰면 모든 페이지
	</filter-mapping>

client <-- [web => request 객체 : 사용자 입력 값] -- filter[!비교!] --[{param1:..., param2:...}서블릿 값]--> server

메세지 출력

public class InitParamFilter implements Filter {
	private FilterConfig filterConfig = null;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter02 초기화...");
		this.filterConfig = filterConfig; // filterConfig로 넘어온 파라미터 전달 받아서 담음
	}

	/*
	요청URI : filter02_process.jsp
	요청파라미터 : {id=admin, passwd=java}
	요청방식 : post
	*/
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		System.out.println("Filter02 수행...");
		// 사용자가 입력한 값
		String id = request.getParameter("id"); // admin
		String passwd = request.getParameter("passwd"); // java
		// web.xml 필터 파라미터 값 -> filterConfig로 받음 => 그 값을 여기서 씀 => 블럭 밖이니까 vo같은 멤버변수 필요 => private FilterConfig...
		String param1 = this.filterConfig.getInitParameter("param1"); // admin
		String param2 = this.filterConfig.getInitParameter("param2");
		
		String message;
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charser=UTF-8"); // MIME 타입
		PrintWriter writer = response.getWriter();
		
		if(id.equals(param1)&&passwd.equals(param2)){// 객체 아니고 문자열 비교니까 == 말고 equals 씀
			message = "로그인 성공했습니다.";
		} else {
			message = "로그인 실패했습니다.";
		}
		// message값이 response객체에 들어감
		writer.println(message);
		
		// c <---> s 할 때 필터 여러개 있으면 다음 필터로 넘기기 되게 함
		filterChain.doFilter(request, response);
	}
	
	@Override
	public void destroy() {
		System.out.println("Filter02 해제...");
	}

}

로그 남기기

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("나는 윤하다.");
		// filter가 연속적으로 있다면 다음 필터로 제어 및 요청(request)/응답(response) 객체들 전달
		// 정보를 넘겨줌
		filterChain.doFilter(request, response);
	}

	@Override
	public void destroy() {
	}
}
profile
기록

0개의 댓글