티스토리 뷰

하루에 글 작성 개수를 5개로 제한하고 그 이상 작성하려고 하면 아이피를 금지시켜서 

다른 아이디로 로그인 하더라도 글 작성이 안되게끔 하는 방법을 알아보겠습니다.


우선 아이피 차단기능을 사용하기 위해서 인터셉터라는것이 필요합니다.


인터셉터에 대해서 간단히 설명하자면 DispatcherServlet과 컨트롤러 사이에 위치하며, 

인터셉터에서 설정한 맵핑 경로에 해당하는 요청경로를 모두 가로챈다음 인터셉터 핸들러를 거치게끔 할 수 있습니다.


한마디로 말해서 컨트롤러로 가기전, 컨트롤러를 거치고난 후 어떤 처리를 해주고 싶을때 인터셉터를 사용합니다.


스프링 시큐리티에서 사용하는 필터와 기능은 비슷하지만 

필터는 DispatcherServlet 앞에 위치하기 때문에 가장먼저 요청url을 받는다는 차이가 있습니다.


우선 쿼리문입니다 .mysql을 사용했습니다.


1
2
3
4
create table IPBANLIST(
IP varchar(25primary key not null,
BANDATE datetime default current_timestamp
);
cs

차단 IP 목록과 차단된 날짜 시간 을 저장하는 테이블입니다.


그다음은 인터셉터입니다.


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
47
48
49
50
51
52
53
54
55
56
package com.javalec.ex.Interceptor;
 
import java.io.PrintWriter;
import java.util.List;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import com.javalec.ex.dao.UserDao;
import com.javalec.ex.dao.UserDaoImpl;
 
public class IPCheckInterceptor implements HandlerInterceptor {
    private static final Logger logger = Logger.getLogger(IPCheckInterceptor.class);
    @Autowired
    UserDaoImpl dao;
    
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub
 
    }
 
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub
 
    }
 
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
        logger.info("client ip " + req.getRemoteAddr()); //접속한 사용자의 IP
        List<String> list = dao.find_ip_ban_list(); //오늘 IP밴 당한 사람의 IP만 가져온다.
        for(String li : list)
        {
            logger.info("ban ip " + li);
            if(req.getRemoteAddr().matches(li))
            {
                 res.setContentType("text/html; charset=UTF-8");
                  PrintWriter out = res.getWriter();
                  out.println("<script>alert('도배 때문에 글작성이 하루동안 제한됩니다.');history.go(-1);</script>");
                  out.flush();
                return false;
            }
        }
        return true;
    }
 
}
 
cs


컨트롤러로 가기전에 어떤 처리를 해주는것이 목적이므로 우리는 preHandle 메소드만 구현해 주면 됩니다.

dao.find_ip_ban_list(); => 마이바티스를 사용해서 오늘 날짜로 아이피를 차단당한

아이피의 리스트를 가져오는 메소드입니다.


여기서는 인터셉터 흐름에 초점을 맞출것이기 때문에 dao는 따로 설명하지 않겠습니다. 직접 작성해주세요


밴당한 아이피 리스트중에 사용자의 아이피와 일치하는것이 하나라도 있으면 return false를 해줌으로써 

인터셉터가 컨트롤러로 요청이 가지 못하게끔 막아줍니다.


물론 return true를 하게 된다면 인터셉터는 원래 요청을 그대로 컨트롤러에게 전달합니다.


1
2
3
4
5
6
7
    <!-- 컨트롤러로 요청이 가기전에 인터셉트-->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/write_view/**"/>
                <beans:bean class="com.javalec.ex.Interceptor.IPCheckInterceptor"/>
            </mvc:interceptor>    
        </mvc:interceptors>
cs

인터셉터를 설정해주기 위해서 servlet-context.xml에 위의 내용을 추가해주어야 합니다.

/write_view/포함 그 하위 경로 요청이 들어왔을때 IPCheckInterceptor라는 인터셉터 클래스가 처리를 해준뒤에

컨트롤러로 요청을 전달할지 말지 결정하겠다는 뜻입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RequestMapping(value="/write", method = RequestMethod.POST)
    public String write(BDto Dto, RedirectAttributes rttr,HttpServletRequest request, HttpServletResponse response)
    {
        int count = service.writeCount(Dto);
        if(count >= 5) {
            try {
                response.setContentType("text/html; charset=UTF-8");
                PrintWriter out = response.getWriter();
                out.println("<script>alert('하루 글 작성 가능 개수는 5개까지입니다.');history.go(-1);</script>");
                out.flush();
                logger.info(request.getRemoteAddr());
                dao.insert_ip_ban(request.getRemoteAddr());
                return "write_view";
            } catch (Exception e) {
                System.out.println(e);
            }
        }
        else
            service.write(Dto);
        return "redirect:/list";
    }
cs

사용자가 글을 작성하게 되면 jsp파일의 form태그에서 /write로 요청을 보냅니다.

그렇게 되면 위의 컨트롤러내의 메소드가 그 요청을 받게 되는데,


그 안에서 오늘 작성한 글 개수를 사용자의 닉네임을 통해서 가져오고(service.writeCount(dto))

만약에 그 닉네임을 가진 사용자가 5회이상 글을 입력했을시


dao.insert_ip_ban(request.getRemoteAddr());

사용자의 아이피를 위에 만들었던 테이블에 집어 넣습니다.


그렇게 되면 이제 5회이상 글을 작성한 사용자가 글을 다시 작성하려고 하면 도배떄문에 글 작성이 제한됩니다.

라는 경고창을 보게될것입니다. 이것을 피하려고 다른아이디로 로그인후 글을쓰려고 해도 

아이피가 차단목록에 들어있으므로 마찬가지로 글 작성이 되지 않습니다.





댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함