홈페이지 구현하기(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);//모든 요청 통과
}
}
'Java 웹 개발' 카테고리의 다른 글
21.10.22 - 웹 개발 입문 50일차 (0) | 2021.10.23 |
---|---|
21.10.21 - 웹 개발 입문 49일차 (0) | 2021.10.21 |
21.10.19 - 웹 개발 입문 47일차 (0) | 2021.10.19 |
21.10.18 - 웹 개발 입문 46일차 (0) | 2021.10.18 |
21.10.15 - 웹 개발 입문 45일차 (0) | 2021.10.15 |