개발환경 : Spring Framework, Mybatis, MySql, Java, Jsp
사용 툴 : STS, MySQL Workbench 6.1 CE
- ※저 스스로 로직과 테이블, jsp를 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
- 단순하게 페이시 호출시 마다 조회수 증가 -> 같은 pc,같은 id 로부터 무한한 조회수 증가의 문제점이 발생
- ▽▽▽▽▽열심히 구글링을 통하여 생각해낸 해결책▽▽▽▽▽
- 쿠키와 로그 테이블을 통하여 관리
- 1.로그인(세션의 아이디)확인 로그인이 되어있다면 2번으로, 안 되어 있다면 3번으로..
- 2 - 1. 로그 테이블 기록 확인, 기록이 없으면 로그 테이블에 기록 후, 조회수 증가 이후 확인 및 쿠키 생성
- 2 - 2. 기록이 있다면 바로 페이지 호출
- 3 - 1.로그인이 안되어 있다면, 쿠키를 확인.
- 3 - 2. 쿠키를 확인하여 기록이 있다면 페이지 호출, 없다면 쿠키 생성,기록
- 저 스스로는 만든 이 방법이 아주 맘에 드네요. ^^;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| //HttpServletRequest req,HttpServletResponse res가 필요합니다
String id = /*아이디*/;
String num = /*게시글 번호*/;
String table /*테이블명(이후 쿠키명)*/;
String cookieName = table;
String cookieValue = num+":"; //':'는 게시물 사이간의 구문자
if(id != null){
if(/* 게시물 기록조회 Dao*/ == 0){ //게시물 로그 테이블 기록조회
/* 게시물 기록 Dao*/ //게시물 로그 테이블 읽음 기록
/* 게시물 조회수 증가 Dao*/ //게시물 조회수 증가
}
}
else {
Boolean flag = false;
Cookie[] cookies = req.getCookies(); //브라우저의 쿠키 얻어오기
Cookie cookie_tmp = null;
if (cookies != null && cookies.length > 0) { //쿠키가 존재 한다면 탐색
for (Cookie cookie : cookies) {
//확인하려는 쿠키이름과 같은 이름의 쿠키 확인
if (cookieName.equals(cookie.getName())) {
cookie_tmp=cookie;
//StringTokenizer로 :를 끊어서 현재 조회하는 테이블의 번호와 비교, 존재한다면 있다는 의미로 flag를 true로 변경
StringTokenizer stringTokenizer = new StringTokenizer(cookie.getValue(),":");
while(stringTokenizer.hasMoreTokens()){
String val = stringTokenizer.nextToken();
if(val.equals(num)){
flag = !flag;
}
}
}
//번호 기록이 없고, 해당 테이블의 쿠키가 존재한다면 테이블의 쿠키에 번호를 기록
if(cookieName.equals(cookie.getName()) && !flag){
cookie.setValue(cookie.getValue()+cookieValue);
res.addCookie(cookie);
boardDao.increase_hit(map);
}
}
}
//테이블의 쿠키가 존재하지 않았다면 해당 테이블의 이름으로 쿠키를 생성
//쿠키 생성 방법은 아래 addcookie() 매소드 참고
if(cookie_tmp == null){
System.out.println("쿠키 처음 생성");
addcookie(cookieName, cookieValue, res);
boardDao.increase_hit(map);
}
}
|
- 결과 모습으로 보아 Board_humor,Board_mobile,Board_movie 페이지를 확인 했고
- mobile페이지에서는 3,2,1 페이지를 조회했다고 하네요.
1
2
3
4
5
6
7
| //쿠키 생성 메소드, 쿠키 이름이 같아도 path가 다르면 다른 쿠키로 인식된다.
public void addcookie(String name,String val,HttpServletResponse res){
CookieGenerator cookieGer = new CookieGenerator();
cookieGer.setCookieName(name);
cookieGer.setCookiePath("/web_project");
cookieGer.addCookie(res, val);
}
|
- 게시물 로그 테이블
- bm_id : 아이디
- bm_cate : 카테고리
- bm_board : board 번호
- bm_content : 댓글
- bm_type : 조회인지, 추천,반대를 하였는지 조회
- bm_date : 기록 시간
- 게시물 로그 기록 삽입, 조회는 간단하니 생략합니다.
1
2
3
4
5
6
7
8 | CREATE TABLE `board_log` (
`bm_id` varchar(20) NOT NULL,
`bm_cate` varchar(20) NOT NULL,
`bm_board` int(20) unsigned NOT NULL DEFAULT '0',
`bm_comment` varchar(5) NOT NULL,
`bm_type` varchar(10) NOT NULL,
`bm_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
댓글 없음:
댓글 쓰기