: myPage에서 주소로 들어가지 못하게 막아보자
filter알아보기
init() / destiry() / dofilter() 메소드
- init() : 서버거 켜질 때, 필터 코드가 변경 되었을 때 필터가 생성됨
- destiry() : 필터 코드가 변경되었을 때 변경이전 필터를 파괴하는 메소드
- dofilter() : 필터 코드를 작성하는 메소드
package edu.kh.project.common.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;
import javax.servlet.http.HttpSession;
import edu.kh.project.member.model.dto.Member;
// Filter : 클라이언트의 요청/ 응답을 걸러내거나 , 첨가하는 클래스
// 클라이언트 -> Filter -> dispatcher Servlet
// @Webfilter : 해당 클래스를 Filter로 등록하고
// 지정된 주소로 요청이 올 때 마다 동작
@WebFilter(filterName="loginfilter"
, urlPatterns = {"/myPage/*"} )
public class LoginFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
// 서버가 켜질 때, 필터 코드가 변경되었을 때 필터가 생성됨
// -> 생성시 초기화 용도로 사용하는 메소드
System.out.println("-----로그인 필터 생성------");
}
public void destroy() {
// 필터 코드가 변경되었을 때
// 변경이전 필터를 파괴하는 메소드
System.out.println("------이전 로그인 필터 파괴-----");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 필터링 코드를 작성하는 메소드
//1) ServletRequset, ServletResponse 다운캐스팅
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
//2) HttpServletReqest를 이용해서 HttpSession 얻어오기
HttpSession session = req.getSession();
// 3) session에서 "loginMember" key를 가진 속성을 얻어와
// null인경우 메인페이지로 Redirect
/* 관리자 권한
Member loginMember = (Member)session.getAttribute("loginMember");
if(loginMember.getAuthority() != 2) {// 관리자가 아니면 메인페이지로
resp.sendRedirect("/");
}
*/
if((session.getAttribute("loginMember")) == null) {
resp.sendRedirect("/");
//4) 로그인 상태인 경우 다음 필터
// dispatcherServlet으로 전달
}else {
chain.doFilter(request, response);
}
}
}
// 비밀번호 변경
@PostMapping("/changePw")
public String changePw( /*@RequestParam("currentPw")*/ String currentPw
, /*@RequestParam("newPw")*/ String newPw
, @SessionAttribute("loginMember") Member logMember
, RedirectAttributes ra) {
// 로그인한 회원번호(DB에서 어떤 회원을 조회, 수정하는지 알아야하니까)
int memberNo = logMember.getMemberNo();
// 비밀번호 변경 Service호출
int result = service.changePw(currentPw, newPw, memberNo);
String path = "redirect:";
String message = null;
if(result > 0 ) {// 성공
message ="비밀번호가 변경되었습니다.";
path += "info";
//내정보 페이지로
}else {
message= "현재 비밀번호가 일치하지 않습니다.";
path +="changePw"; // 비밀번호 변경페이지
}
ra.addFlashAttribute("message", message);
return path;
}
/** 비밀번호 변경 서비스
* @param currentPw
* @param newPw
* @param memberNo
* @return result
*/
int changePw(String currentPw, String newPw, int memberNo);
// 회원 비밀번호 변경 서비스
//@Transactional // UnChecked Exception 발생 시 rollback
@Transactional(rollbackFor = {Exception.class})
// 모든 Exception 발생시 rollback
@Override
public int changePw(String currentPw, String newPw, int memberNo) {
// 1. 현재 비밀번호, DB에 저장된 비밀번호 비교
// 1) 회원번호가 일치하는 MEMBER 테이블의 행의 MEMBER_PW 조회
String encPw = dao.selectEncPw(memberNo);
// 2) bcrypt.matches(평문, 암호문) -> 같으면 true -> 이 때 비번 수정
if(bcrypt.matches(currentPw, encPw)) {
// 2. 비밀번호 변경 (UPDATE DAO호출) -> 결과 반환
return dao.changePw( bcrypt.encode(newPw), memberNo);
}
// 3) 비밀번호가 일치하지 않으면 0 반환
return 0;
}
/** 비밀번호 변경
* @param encode
* @param memberNo
* @return result
*/
public int changePw(String newPw, int memberNo) {
// Mybatis에서는 SQL 수행시
// 전달할 수 있는 파라미터는 딱 하나!
// 여러 파라미터를 전달해야 하는경우
// Map 또는 DTO로 묶어서 전달
Member member = new Member();
member.setMemberNo(memberNo);
member.setMemberPw(newPw);
return sqlSession.update("myPageMapper.changePw", member);
}
<!-- 비밀번호 변경 UPDATE 구문 -->
<!-- Member ; 사용자 지정 별칭(Mybatis-config.xml) -->
<update id="changePw" parameterType="Member">
UPDATE MEMBER SET MEMBER_PW = #{memberPw} WHERE MEMBER_NO = ${memberNo}
</update>