20240221 Spring 7

Leafy·2024년 2월 21일
1

중앙_자바

목록 보기
43/76

HttpServletRequest 리턴 메소드

Util.java에 만들어줬다.

//HttpServletRequest와 HttpSession을 매번 controller 메서드 파라미터로 넣기 힘드니까 그거 만들어주는 메소드 만들기
	public HttpServletRequest req() {
		ServletRequestAttributes sra = 
				(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
		HttpServletRequest request = sra.getRequest();
		return request;
	}

Service에 있는 이거를

public int write(WriteDTO dto, HttpServletRequest request) {
		HttpSession session = request.getSession();
		dto.setMid(String.valueOf(session.getAttribute("mid")));
		return boardDAO.write(dto);
	}

request 매개변수로 전달 안하는 메소드로 하려고~

@AutoWired
private Util util;

public int write(WriteDTO dto) {
		HttpServletRequest request = util.req();
		HttpSession session = request.getSession();
		dto.setMid(String.valueOf(session.getAttribute("mid")));
		return boardDAO.write(dto);
	}

이렇게 변경했다.

세션도 저거 req() 갖다써서 Util에 리턴 메소드 만들어줌.

public HttpSession getSession() {
		HttpSession session = req().getSession();
		return session;
	}

Controller부터 request, session 전달, 전달.. 하는 거 끊고 독립시키는 거. (Util에는 계속 쓸 거 만들기)

public int write(WriteDTO dto) {
		dto.setMid(String.valueOf(util.getSession().getAttribute("mid")));
		return boardDAO.write(dto);
	}

Spring Boot

thymeleaf -> 컨트롤러?
maven -> gradle
지금 sts3 쓰는데 이건 전자정부로 넘어간다


mybatis
select는 result 있지만 update는 result 없다.


ip 가져오기 (Util.java)

서블릿때도 했다

	//ip
	public String getIp() {
		HttpServletRequest request = req();
		String ip = request.getHeader("X-FORWARDED-FOR");
		if(ip == null) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if(ip == null) {
			ip = request.getHeader("WL-Proxy-Client-IP");   
		}
		if(ip == null) {
			ip = request.getHeader("HTTP_CLIENT_IP");
		}
		if(ip == null) {
			ip = request.getHeader("HTTP_X_FORWARDED_FOR");
		}
		if(ip == null) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}

IP는 글쓰기 댓글쓰기 Service에서 추가해준다

	public int write(WriteDTO dto) {
		//엔터키 처리
		dto.setContent(dto.getContent().replaceAll("(\r\n|\r|\n|\n\r)", "<br>"));
		dto.setMid(String.valueOf(util.getSession().getAttribute("mid")));
		dto.setIp(util.getIp());
		return boardDAO.write(dto);
	}
    
    public int commentWrite(CommentDTO comment) {
		// 댓글 내용 + 글번호 + mid
		// 엔터키 처리
		comment.setComment(comment.getComment().replaceAll("(\r\n|\r|\n|\n\r)", "<br>"));
		comment.setMid(String.valueOf(util.getSession().getAttribute("mid")));
		comment.setCip(util.getIp());
		return boardDAO.commentWrite(comment);
	}

로그인 시도 5회 제한

db member 테이블에 mcount 칼럼 추가

LoginController에서 로그인이 있을 때,, mcountUp() 메소드

있는 아이디에 비밀번호 틀리면... mcount가 1씩 증가.
mcount가 5가 되면 정지된 아이디로.

  • LoginController
	@PostMapping("/login")
	public String login(HttpServletRequest request) {
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		//System.out.println("id: " + id + " / pw : " + pw);
		LoginDTO loginDTO = new LoginDTO();
		loginDTO.setId(id);
		loginDTO.setPw(pw);
		
		LoginDTO login = loginService.login(loginDTO);
		if(login.getCount() == 1 && login.getMcount() < 5) {
			//진정한 로그인
			if(login.getPw().equals(loginDTO.getPw())) { //비밀번호 비교..
				//세션만들기
				HttpSession session = request.getSession();
				session.setAttribute("mid", id);
				session.setAttribute("mname", login.getMname());
				//해당 id의 mcount를 1로 만들기
				loginService.mcountReset(loginDTO);
				return "redirect:/index"; //정상 로그인
			} else { //비번틀린거
				//mcountUp
				loginService.mcountUp(loginDTO);
				return "redirect:/login?count="+login.getMcount();
			}
		} else {
			//잘못된 로그인일 경우 로그인 창으로 이동하기 = 5번 시도했으면 잠그기.
			//해당 id의 mcount를 +1 시키기
			loginService.mcountUp(loginDTO); //원랜 id만 들어가면 되니까 귀찮으니까~ // int result로 잡아도 되지만 크게 의미 없을거같다고,,
			return "redirect:/login?count="+login.getMcount();
		}
		
	}
  • LoginService
	public LoginDTO login(LoginDTO dto) {
		return loginDAO.login(dto);
	}

	public void mcountUp(LoginDTO loginDTO) {
		loginDAO.mcountUp(loginDTO);
	}

	public void mcountReset(LoginDTO dto) {
		loginDAO.mcountReset(dto);
	}
  • LoginDAO(repository)
	public LoginDTO login(LoginDTO dto) {
		return sqlSession.selectOne("login.login", dto);
	}

	public void mcountUp(LoginDTO dto) {
		sqlSession.update("login.mcountUp", dto);
	}

	public void mcountReset(LoginDTO dto) {
		sqlSession.update("login.mcountReset", dto);
	}
  • login-mapper.xml
	<select id="login" parameterType="loginDTO" resultType="loginDTO">
		<![CDATA[
		SELECT COUNT(*) AS count, mname, mcount, mpw AS pw 
		FROM member 
		WHERE mid=#{id} AND mgrade > 4
		]]>
	</select>
	
	<update id="mcountUp" parameterType="loginDTO">
		UPDATE member SET mcount=mcount+1 
		WHERE mid=#{id}
	</update>
	
	<update id="mcountReset" parameterType="loginDTO">
		UPDATE member SET mcount=1 
		WHERE mid=#{id}
	</update>
  • login.jsp
<!-- sweetalert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
	<!-- 파라미터로 오는 error가 있다면 에러 화면에 출력하기 -->
        <c:if test="${param.error ne null }">
        	<script type="text/javascript">
        		Swal.fire("Oops!", "잘못된 접근. 로그인 하세요.", "error");
        	</script>
        </c:if>
        <c:if test="${param.login ne null }">
        	<script type="text/javascript">
        		Swal.fire("로그인 불가", "올바른 아이디와 비밀번호를 입력하세요.", "error");
        	</script>
        </c:if>
        <c:if test="${param.count ne null }">
        	<script type="text/javascript">
        		let count = ${param.count};
        		if(count < 5) {
        			Swal.fire("로그인 정보를 확인하세요", count + "번 시도했습니다.", "warning");
        		} else {
	        		Swal.fire(
	        				"로그인 불가", 
	        				"로그인을 여러 번 시도했습니다. 관리자에게 문의하세요.", 
	        				"warning");
        		}
        	</script>
        </c:if>

시간이 흐르면 제한을 풀어주는거 = 사람들이 많이 안 쓰는 시간에 trigger를 통해 풀어준다고 한다.

  1. HttpServlet request랑 session얻는거 따로 util에 만들어서 getSession필요한 애들 코드 수정
  2. 삭제 버튼 로그인체크하게 수정 => jstl
  3. 로그인아이디랑 글, 댓글 작성자가 일치할 때 수정/삭제버튼 보이게 조건걸기 => jstl
    4.IP 얻는거 Util에 생성
  4. 쓰기/댓글쓰기에 IP 추가
  5. 글쓰기/댓글쓰기 시 엔터키 처리 코드 추가
  6. 글쓰기 할때 로그인 검사 기능
  7. 로그인 시도 횟수 카운트 코드 작성
  8. 로그인 시도 횟수 따른 Swal 스크립트 추가
  9. login 성공시 시도 횟수 초기화

WYSIWYG 에디터

what you see is what you get

결국 다시 summernote
https://late90.tistory.com/347

6개의 댓글

comment-user-thumbnail
2024년 2월 21일

김영한님의 강의에서 스프링부트로한답니당
근데 스프링부트가 스프링의 다음 버전은 아니고 스프링을 도와주는 스프링부트라는 도구래요

2개의 답글
comment-user-thumbnail
2024년 2월 21일

다 아니까 내용이짧네요.... 이게 재능인가

2개의 답글