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);
}
thymeleaf -> 컨트롤러?
maven -> gradle
지금 sts3 쓰는데 이건 전자정부로 넘어간다
mybatis
select는 result 있지만 update는 result 없다.
서블릿때도 했다
//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);
}
db member 테이블에 mcount 칼럼 추가
LoginController에서 로그인이 있을 때,, mcountUp() 메소드
있는 아이디에 비밀번호 틀리면... mcount가 1씩 증가.
mcount가 5가 되면 정지된 아이디로.
@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();
}
}
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);
}
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);
}
<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>
<!-- 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를 통해 풀어준다고 한다.
- HttpServlet request랑 session얻는거 따로 util에 만들어서 getSession필요한 애들 코드 수정
- 삭제 버튼 로그인체크하게 수정 => jstl
- 로그인아이디랑 글, 댓글 작성자가 일치할 때 수정/삭제버튼 보이게 조건걸기 => jstl
4.IP 얻는거 Util에 생성- 쓰기/댓글쓰기에 IP 추가
- 글쓰기/댓글쓰기 시 엔터키 처리 코드 추가
- 글쓰기 할때 로그인 검사 기능
- 로그인 시도 횟수 카운트 코드 작성
- 로그인 시도 횟수 따른 Swal 스크립트 추가
- login 성공시 시도 횟수 초기화
what you see is what you get
SunEditor
summernote가 부트스트랩, 제이쿼리랑 충돌있어서...
http://suneditor.com/sample/index.html
Quill
https://quilljs.com/
결국 다시 summernote
https://late90.tistory.com/347
김영한님의 강의에서 스프링부트로한답니당
근데 스프링부트가 스프링의 다음 버전은 아니고 스프링을 도와주는 스프링부트라는 도구래요