본문 바로가기

Java 웹 개발

21.10.20 - 웹 개발 입문 48일차

홈페이지 구현하기(3)

 

 

- 회원탈퇴 페이지 만들기

 

- 비밀번호 입력 (check.jsp) 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<jsp:include page="/template/header.jsp"></jsp:include>

<h2>비밀번호 확인</h2>

<form action="quit.txt" method="post">

	<table>
		<tbody>
			<tr>
				<th>비밀번호</th>
				<td>
					<input type="password" name="memberPw" required>
				</td>
			</tr>
		</tbody>
		<tfoot>
			<tr>
				<td colspan="2" align="center">
					<input type="submit" value="회원탈퇴">
				</td>
			</tr>
		</tfoot>
	</table>

</form>

<%if(request.getParameter("error") != null){ %>
	<h4><font color="red">입력하신 정보가 일치하지 않습니다</font></h4>
<%} %>

<jsp:include page="/template/footer.jsp"></jsp:include>

 

- 회원 탈퇴 처리 서블릿(MemberQuitServlet.java) 만들기

package home.servlet.member;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import home.beans.MemberDao;
import home.beans.MemberDto;

@WebServlet(urlPatterns = "/member/quit.txt")
public class MemberQuitServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			//입력 : 회원아이디(세션) + 회원비밀번호(파라미터)
			String memberId = (String)req.getSession().getAttribute("ses");
			String memberPw = req.getParameter("memberPw");
			
			//처리 : 회원삭제 + 로그아웃
			MemberDao memberDao = new MemberDao();
			boolean success = memberDao.quit(memberId, memberPw);
			
			//success에 따라 성공 / 실패로 구분하여 처리
			//= 성공이라면 로그아웃 후 완료페이지로 전송
			//= 실패라면 로그아웃 처리를 하지 않고 이전 페이지로 오류 파라미터와 함께 전송
			
			if(success) {
				req.getSession().removeAttribute("ses");
				//req.getSession().invalidate();
				
				resp.sendRedirect("quit_success.jsp");
				//resp.sendRedirect(req.getContextPath()+"/member/quit_success.jsp");		
			}
			else {
				resp.sendRedirect("check.jsp?error");
			}

		} catch (Exception e) {
			e.printStackTrace();
			resp.sendError(500);
		}
	}
}

 

 

- 회원 탈퇴 완료 페이지 (euit_success.jsp) 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<jsp:include page="/template/header.jsp"></jsp:include>

<h2>회원 탈퇴 완료</h2>

<h5><a href="<%=request.getContextPath()%>">메인 페이지로</a></h5>

<jsp:include page="/template/footer.jsp"></jsp:include>

 

 

 

홈페이지 - 운영설정(web.xml), 에러 페이지 설정

XML(eXtend Markup Language)
- 임의로 태그를 만들 수 있는 데이터 저장 방식
- 해석하는 주체에 따라 필요한 태그가 정해져 있다.
- HTML과 동일한 문법체계를 가짐
- xmlns 속성을 통하여 필요한 태그를 알려줄 수 있다(오류검사, 자동완성)
     - xmlns는 XML NameSpace의 줄임말로 xml에서 사용할 문법체계가 저장된 위치
     - xmlns:xsi 는 Xml Schema Instance의 줄임말로 xml에 대한 품질보증서 위치

 

 

web.xml 설정

(경로는 WEB-INF -> lib 에 web.xml 로 생성)

 <web-app 
 		version="4.0" 
 		xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
 		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  		xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
       		                http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
 	
 	<!-- 대문 페이지 설정 재정의 -->
 	<welcome-file-list>
 		<welcome-file>index.jsp</welcome-file>
 	</welcome-file-list>
 	
 	<!-- 세션 만료시간 재정의 -->
 	<session-config>
 		<session-timeout>360</session-timeout>
 	</session-config>
 	
 	<!-- 에러 페이지 설정 -->
 	<error-page>
 		<error-code>401</error-code>
 		<location>/member/login.jsp</location>	
 	</error-page> 	
 	
 	<error-page>
 		<error-code>404</error-code>
 		<location>/error/404.jsp</location>	
 	</error-page>
 	
 	 	<error-page>
 		<error-code>405</error-code>
 		<location>/error/404.jsp</location>	
 	</error-page>
 
 	<error-page>
 		<error-code>500</error-code>
 		<location>/error/500.jsp</location>	
 	</error-page> 	
 
 </web-app>

 

404 - 에러 페이지 설정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:include page="/template/header.jsp"></jsp:include>
	<h2>페이지를 찾을 수 없습니다</h2>
<jsp:include page="/template/footer.jsp"></jsp:include>

 

에러 페이지 설정 전

 

 

에러 페이지 설정 후

 

 

홈페이지 - 필터(Filter)


필터(Filter)
 = 요청을 미리 검사하여 원치 않는 요청을 걸러내기 위해 개발된 도구
 = ex : 비회원이 회원 기능을 이용하려고 요청할 경우 이를 차단하는 필터(회원 필터)
 = 걸러내는 용도가 아니라 특정 요청에 무언가를 추가하는 용도로도 사용
 = ex : 매번 처리하기 귀찮은 req.setCharacterEncoding()을 자동 수행하는 필터(인코딩 필터)

생성 절차
1. 상속을 통한 자격 획득(javax.servlet.Filter)
2. @WebFilter 를 통한 등록 및 검사 주소 설정
3. 메소드 재정의를 통하여 수행할 내용을 작성(doFilter 메소드)

 

doFilter 메소드는 필터에서 수행할 작업을 정의하는 메소드
- ServletRequest 
  = HttpServletRequest의 상위 형태
  = 실제 사용할 때는 HttpServletRequest 유형의 객체가 들어간다
- ServletResponse
  = HttpServletResponse의 상위 형태
  = 실제 사용할 때는 HttpServletResponse 유형의 객체가 들어간다
- FilterChain 은 필터끼리 서로 연결되어 있는 연결정보를 의미하며, 이를 이용하여 통과 명령을 사용할 수 있다.
  = 다음으로 이동하여 계속 진행하려면 사용자가 전달한 요청(request), 응답(response)이 유지되어야 한다.
  = 매개변수에 인자로 넣어서 전달해준다(유지시켜준다)


(결론) Servlet에서 하던 작업을 Filter에서 하고 싶다면 request객체와 response객체를 "다운캐스팅" 해서 사용해야 한다.

ex) 필터 예제

package home.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter(urlPatterns = "/index.jsp")
public class TestFilter implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//설치하고 아무런 코드도 작성하지 않으면 필터를 통과할 수 없다(대상에게 전달되지 않고 차단)

		//요청을 통과시키고 싶다면 다음 명령을 사용
		chain.doFilter(request, response);

		//차단 명령
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse)response;

		//resp.sendError(500);//오류(500)임을 알리고 차단
		//resp.sendRedirect("https://google.com");//다른 페이지로 재접속 지시(redirect)
	}

}

 

 

Q. 회원 필터 구현 해보기

 

로그인이 필요하다고 판단되는 페이지에 "비회원"이 접근할 경우
검사하여 차단하도록 구현하고 회원의 경우는 통과
차단 시 로그인 페이지로 강제 이동 처리

(힌트)
= 세션을 검사해서 ses가 있으면 회원, 없으면 비회원
= 세션에 접근하려면 HttpServletRequest 객체가 필요

 

 

기존 로그인전에 못들어가는 페이지로 들어가면 에러 페이지로 갔다

 

- 필터 구현

package home.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter(urlPatterns = {
		"/member/mypage.jsp",
		"/member/logout.txt", 
		"/member/edit.jsp", "/member/edit.txt", "/member/edit_success.jsp", 
		"/member/password.jsp", "/member/password.txt", "/member/password_success.jsp", 
		"/member/quit.txt"
		})
public class MemberFilter implements Filter {
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;

		// 회원인지 아닌지 판정하는 코드
		String memberId = (String) req.getSession().getAttribute("ses");
		boolean login = memberId != null;

		if (login) {
			chain.doFilter(request, response); 
		} else {
			resp.sendRedirect(req.getContextPath() + "/member/login.jsp");
		}
	}
}

 

- 로그인 전에 못들어가게 회원 로그인 페이지로 자동으로 이동 된다

 

 

인코딩필터와 필터주소 부여규칙


모든 요청에 대해서 UTF-8 변환 처리를 지시하는 보조 필터
<주소 규칙>

- 주소를 범위로 지정하고 싶다면 반드시 알아야 하는 규칙
1. 엔드포인트(end-point)를 기준으로 와일드카드를 작성할 수 있다.(/로 시작해서 *로 끝나는 것이 가능)
   = /*, /member/*, /admin/*, /board/* 
2. 특정 유형의 확장자를 지정할 수 있다(*로 시작하는 것이 가능)
   = *.jsp , *.txt, 등
3. 1번과 2번을 동시에 할 수 없다.
   = /member/*.txt는 불가능 패턴
4. 특정 범위에서 주소를 제외하는 것이 불가능하다.(오로지 추가만 가능)

package home.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

//@WebFilter(urlPatterns= "/*")//서버 전체에 대한 요청
@WebFilter(urlPatterns={"*.jsp", "*.txt"})//JSP, Servlet 전체
public class EncodingFilter implements Filter{
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		//추가할 작업을 코드로 구현(간섭)
		HttpServletRequest req= (HttpServletRequest) request;
		req.setCharacterEncoding("UTF-8");
//		request.setCharacterEncoding("UTF-8");
		
		chain.doFilter(request, response);//모든 요청 통과
	}
}