240123 게시판 만들기(ip 띄우기 /log)

2024. 1. 23. 12:152023.11.21-2024.05.31

본문글, 댓글창에 다 띄우기

 

footer.jsp 추가

<%@page import="com.sukgi.util.Util"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 여기는 푸터입니다. 회사 정보 / 정보보안 책임자 / 연락처 / 주소
 당신의 아이피 : <%=Util.getIP(request)%>

 

 

Util.java 추가, 특수기호,엔터키 처리, 아이피 중간 하트로 가리기

 // 01.23 ip 얻어오기
	   public static String getIP(HttpServletRequest request) {
	      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;
	   }
	   
       
       
	   //2024.01.23 HTML 태그를 특수기호로 변경하기 <&lt >&gt
	   public static String removeTag(String str) {
		   str = str.replaceAll("<", "&lt");
		   str = str.replaceAll(">", "&gt");
		   
		   return str;
	   }
	   //2024.01.23 엔터키 처리
	   public static String addBR(String str) {
			return str.replaceAll("(\r\n|\r|\n|\n\r)", "<br>");
	   }
        
        

	   //2024.01.23 아이피 중간을 하트로 가리기 172.30.1.22 -> 172.♡.1.22
	   public static String ipMasking(String ip) {
			if (ip.indexOf('.') != -1) {
				StringBuffer sb = new StringBuffer();// 멀티스레드 환경에서도 동기화 지원
				sb.append(ip.substring(0, ip.indexOf('.')+1));
				sb.append("♡");
				sb.append(ip.substring(ip.indexOf('.',ip.indexOf('.')+1)));
				return sb.toString();
			} else {
				return ip;
			}
		}

 

 

 

BoardList.java 추가

		//2024.01.23 log
		Map<String, Object>   log = new HashMap<String, Object>();
	      log.put("ip", Util.getIP(request));
	      log.put("url", "./board");
	      log.put("data", "page="+page);
	      LogDAO logDAO = new LogDAO();
	      logDAO.write(log);

 

 

 

LogDAO.java 만들기

package com.sukgi.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;

public class LogDAO extends AbstractDAO {
	//abstract로 이동시켰습니다.
    
    
	 // 오버로딩 기법 적용 (AbstractDAO에 적어서 상속받아도 됨.)
	   
//  public void write(String ip, String url, String data) {
//     Connection con = db.getConnection();
//     PreparedStatement pstmt = null;
//     String sql = "INSERT INTO iplog(iip, iurl, idata) VALUES (?,?,?)";
//     
//     try {
//        pstmt = con.prepareStatement(sql);
//        pstmt.setString(1, ip);
//        pstmt.setString(2, url);
//        pstmt.setString(3, data);
//        
//        pstmt.execute();
//          
//     } catch (SQLException e) {
//        e.printStackTrace();
//     } finally {
//        close(null, pstmt, con);
//     }
//  }
  

  public void write(Map<String, Object> log) {
     Connection con = db.getConnection();
     PreparedStatement pstmt = null;
     String sql = "INSERT INTO iplog(iip, iurl, idata) VALUES (?,?,?)";
     
     try {
    	 	pstmt = con.prepareStatement(sql);
			pstmt.setString(1, (String) log.get("ip"));
			pstmt.setString(2, (String) log.get("url"));
			pstmt.setString(3, (String) log.get("data"));
        
        pstmt.execute();
          
     } catch (SQLException e) {
        e.printStackTrace();
     } finally {
        close(null, pstmt, con);
     }
  }
  
}

 

 

 

AbstractDAO.java 추가

//   2024.01.23 ip
   public void logwrite(String ip, String url, String data) {
      Connection con = db.getConnection();
      PreparedStatement pstmt = null;
      String sql = "INSERT INTO iplog(iip, iurl, idata) VALUES (?,?,?)";
      
      try {
         pstmt = con.prepareStatement(sql);
         pstmt.setString(1, ip);
         pstmt.setString(2, url);
         pstmt.setString(3, data);
         
         pstmt.execute();
           
      } catch (SQLException e) {
         e.printStackTrace();
      } finally {
         close(null, pstmt, con);
      }
   }

 

 

 

MemberDAO.java

 

	// 2024.01.23
	public List<Map<String, Object>> readData(MemberDTO dto) {
		List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
		Connection conn = db.getConnection();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM visitcount WHERE mno=(SELECT mno FROM member WHERE mid=?)";




		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, dto.getMid());
			rs = pstmt.executeQuery();

//			한개면 IF, 여러개면 WHILE

			while (rs.next()) {
				Map<String, Object> e = new HashMap<String, Object>();
				e.put("vno", rs.getInt("vno"));
				e.put("board_no", rs.getInt("board_no"));
				e.put("mno", rs.getInt("mno"));
				e.put("vdate", rs.getString("vdate"));
				data.add(e);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rs, pstmt, conn);
		}
		return data;
	}

 

 

BoardDTO.java 변경

public String getIp() {

return Util.ipMasking(ip);

}

 

 

 

CommentDTO.java > ip 추가하기

 

package com.sukgi.dto;

public class CommentDTO {
	private int cno, board_no, clike, mno;
	private String comment, mid, mname, cdate, ip;
	public int getCno() {
		return cno;
	}
	public void setCno(int cno) {
		this.cno = cno;
	}
	public int getBoard_no() {
		return board_no;
	}
	public void setBoard_no(int board_no) {
		this.board_no = board_no;
	}
	public int getClike() {
		return clike;
	}
	public void setClike(int clike) {
		this.clike = clike;
	}
	public int getMno() {
		return mno;
	}
	public void setMno(int mno) {
		this.mno = mno;
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}
	public String getMid() {
		return mid;
	}
	public void setMid(String mid) {
		this.mid = mid;
	}
	public String getMname() {
		return mname;
	}
	public void setMname(String mname) {
		this.mname = mname;
	}
	public String getCdate() {
		return cdate;
	}
	public void setCdate(String cdate) {
		this.cdate = cdate;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
}

 

 

Comment.java > 댓글에 특수기호, 줄바꿈 가능하게 만들기

	// 2024.01.23 오는 값에서 특수기호 <,>, 변경하기
			//줄바꿈처리해주기
			
			
			
			//2024.01.23 HTML에서 태그를 특수기호로 변경하기
			commentcontent = Util.removeTag(commentcontent);
			
			//2024.01.23 엔터처리 /r /n /nr
			commentcontent =Util.addBR(commentcontent);

 

 

 

Detail.java

// 데이터베이스에 질의하기
		BoardDAO dao = new BoardDAO();// 숫자야? 물어본거
		
		//2024.01.23
		LogDAO log = new LogDAO();
		dao.logwrite(Util.getIP(request), "./detail", "no="+no);
		//로그인한 회원이라면 읽음수 올리기 2024-01-19 프레임워크 프로그래밍 01/31까지
		HttpSession session = request.getSession();
		if(session.getAttribute("mid") != null) {
			//bno, mno
			dao.countUp(no,(String)session.getAttribute("mid"));
		}

 

 

Imdex.java > 인덱스에 로그 가져오기.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//2024.01.23
		LogDAO log = new LogDAO();
		log.logwrite(Util.getIP(request), "./index", "no="+null);
		
		
		//response.sendRedirect("index.jsp");
		RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
		rd.forward(request, response);
		
	}

 

 

 

Login.java > 아이피 저장하기

//2024.01.23 아이피 저장하기
					Map<String, Object> log = new HashMap<String, Object>();
					 log.put("ip", Util.getIP(request));
			         log.put("url", "./login");
			         log.put("data", "id:"+dto.getMid()+", pw:"+dto.getMpw() + " 결과 : " + dto.getCount());
			         
			         LogDAO logDAO = new LogDAO();
			         logDAO.write(log);

 

 

 

Write.java > 태그 넣을때 오류안타나게 하기

 

	//2024.01.23
			title = Util.removeTag(title);

 

 

detail.jsp > 아이피 나타내기

<div class="detailCOUNT">${detail.ip } / ${detail.count }</div>

 

 

<!-- 댓글 출력창 -->
<div class="cdate">${co.ip } / ${co.cdate }</div>