Spring - MyPage(2) 비밀번호 변경

맑은 눈의 코드 👀·2023년 8월 16일
0

06_framework 이론

목록 보기
7/23
post-custom-banner

🍓LoginFilter

: 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);
		}
		
	}
}


🔐비밀번호 변경

🍳MyPageController.java 클래스

// 비밀번호 변경
	@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;
		
	}

🍳MyPageService.java 인터페이스

/** 비밀번호 변경 서비스
	 * @param currentPw
	 * @param newPw
	 * @param memberNo
	 * @return result
	 */
	int changePw(String currentPw, String newPw, int memberNo);

🍳MyPageServiceImpl.java

	// 회원 비밀번호 변경 서비스
	//@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;
	}

🍳MyPageDAO.java 클래스

	/** 비밀번호 변경
	 * @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);
	}

🍳myPage-mapper.xml

	<!-- 비밀번호 변경 UPDATE 구문 -->
	<!-- Member ; 사용자 지정 별칭(Mybatis-config.xml) -->
	<update id="changePw" parameterType="Member">
		UPDATE MEMBER SET MEMBER_PW = #{memberPw} WHERE MEMBER_NO = ${memberNo}
	</update>
profile
나를 죽이지 못하는 오류는 내 코드를 더 강하게 만들지ㅋ
post-custom-banner

0개의 댓글