小东Freeman + 关注

签名:我们爱我们的倒霉工作,也爱这千疮百孔的世界。

利用springmvc拦截器防止恶意刷新页面

发表于 6个月前   7258次查看    1评论  45 赞

前言:前段时间学会了如何恶意刷新别人的网站,就是一秒内连续刷新别人网站,评论等,频率快的话可导致网站崩溃,所以要防止用户恶意刷新页面,经过5、6个小时的研究终于做完了,主要是利用spring mvc自带的拦截器和session进行访问时间的判断来对该用户进行限制,接下来贴出代码教你如何利用springmvc拦截器防止恶意刷新页面


首先配置拦截器在springmvc.xml

1
2
3
4
5
<mvc:interceptor>
    <!-- 进行ip检测的拦截器 -->
    <mvc:mapping path="/**" />
    <bean class="com.fman.ssm.interceptor.IPInterceptor"></bean>
</mvc:interceptor>

新建IPInterceptor,在加载前方法里进行编写

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//页面加载前进行ip判断
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object arg2) throws Exception {
        //获取ip
        //由于反向代理
         String ip  =  request.getHeader("x-forwarded-for"); 
         if (ip == null || ip.length() == 0 || " unknown ".equalsIgnoreCase(ip)) {
                ip = request.getHeader(" Proxy-Client-IP ");
            }
            if (ip == null || ip.length() == 0 || " unknown ".equalsIgnoreCase(ip)) {
                ip = request.getHeader(" WL-Proxy-Client-IP ");
            }
            //获取真实ip
            if (ip == null || ip.length() == 0 || " unknown ".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
            System.out.println("ip为"+ip);
         //开始进行判断
           HttpSession session=request.getSession();
           Ip ipo=(Ip) session.getAttribute(ip);
         //如果session为空
           if(null == ipo){  
               //放入到session中
               Ip ipoo=new Ip();
               ipoo.setTime(System.currentTimeMillis());
               ipoo.setRecount(1);
               session.setAttribute(ip,ipoo);
               System.out.println("通过!");
               return true;
           }else{
               //如果ip不为空则禁止访问(恶意刷新后把ip存到session中)
               if(ipo.getIp()!=null){
                   System.out.println("session消失前永远被拦截了");
                   request.getRequestDispatcher("/jsp/pi.jsp").forward(request, response);
                   return false;
               }else{
               //如果session不为空
               Long Time = ipo.getTime();
               //如果时间为null表示单秒内刷新过快
               if(Time==null){
                   Ip ipoo=new Ip();
                   ipo.setIp(ip);
                   session.setAttribute(ip, ipoo);
                   System.out.println("刷新过快");
                   request.getRequestDispatcher("/jsp/pi.jsp").forward(request, response);   
               }else{
                   //当前时间减去session中的时间大于两秒的
                   if(((System.currentTimeMillis() - Time)/1000) > 2){
                        //当前时间离上一次请求时间大于2秒,可以直接通过,保存这次的请求
                       Ip ipoo=new Ip();
                       ipoo.setTime(System.currentTimeMillis());
                       ipoo.setRecount(1);
                       session.setAttribute(ip, ipoo);
                       System.out.println("大于两秒");
                      return true
               }else{
                   //小于两秒的
                   if(ipo.getRecount() > 12){
                       //小于2秒,并且2秒间隔之内请求了12次
                       System.out.println("进行拦截!");
                       //将ip放到session中用来禁止该ip访问
                       ipo.setIp(ip);
                       //将ip存到数据库里用来后台查看,如发现多次攻击将永远禁止访问
                       //获取ip所在区域
                       Ip jdip=new Ip();
                       AddressUtils addutil=new AddressUtils();
                       System.out.println(addutil.getAddresses("ip="+ip, "utf-8"));
                       //获取地址
                       String loacl=addutil.getAddresses("ip="+ip, "utf-8");
                       //写入ip类
                       jdip.setCreatTime(new Date());
                       jdip.setLocation(loacl);
                       jdip.setIp(ip);
                       userService.insertIp(jdip);
                       request.getRequestDispatcher("/jsp/pi.jsp").forward(request, response);
                       return false;
                   }else{
                        //小于2秒,但请求数小于12次,给对象添加
                       ipo.setTime(System.currentTimeMillis());
                       ipo.setRecount(ipo.getRecount()+1);
                       System.out.println("访问次数"+ipo.getRecount());
                       request.getSession().setAttribute(ip,ipo);
                   }
               }
           }
        }
    }
//如果未出现上述情况直接通过
  return true;
}

这里我还把攻击我的ip以及他的地址获取到了,存放在数据库内了,如果三番五次的进行攻击将永久拉黑该ip

分享下获取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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
package com.fman.ssm.utils;
import java.io.BufferedReader;  
import java.io.DataOutputStream;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.io.UnsupportedEncodingException;  
import java.net.HttpURLConnection;  
import java.net.URL;  
/** 
 *  根据IP地址获取详细的地域信息 
 */  
public class AddressUtils {   
 /** 
  
  * @param content 
  *            请求的参数 格式为:name=xxx&pwd=xxx 
  * @param encoding 
  *            服务器端请求编码。如GBK,UTF-8等 
  * @return 
  * @throws UnsupportedEncodingException 
  */  
 public String getAddresses(String content, String encodingString)  
   throws UnsupportedEncodingException {  
  // 这里调用pconline的接口  
  String urlStr = "http://ip.taobao.com/service/getIpInfo.php";  
  // 从http://whois.pconline.com.cn取得IP所在的省市区信息  
  String returnStr = this.getResult(urlStr, content, encodingString);  
  if (returnStr != null) {  
   // 处理返回的省市区信息  
   System.out.println(returnStr);  
   String[] temp = returnStr.split(",");  
   if(temp.length<3){  
    return "0";//无效IP,局域网测试  
   }  
   String region = (temp[5].split(":"))[1].replaceAll("\"""");  
   region = decodeUnicode(region);// 省份  
     
            String country = "";  
            String area = "";  
            // String region = "";  
            String city = "";  
            String county = "";  
            String isp = "";  
            for (int i = 0; i < temp.length; i++) {  
                switch (i) {  
                case 1:  
                    country = (temp[i].split(":"))[2].replaceAll("\"""");  
                    country = decodeUnicode(country);// 国家  
                    break;  
                    case 3:  
                        area = (temp[i].split(":"))[1].replaceAll("\"""");  
                        area = decodeUnicode(area);// 地区   
                    break;  
                    case 5:  
                        region = (temp[i].split(":"))[1].replaceAll("\"""");  
                        region = decodeUnicode(region);// 省份   
                    break;   
                    case 7:  
                        city = (temp[i].split(":"))[1].replaceAll("\"""");  
                        city = decodeUnicode(city);// 市区  
                    break;   
                    case 9:  
                            county = (temp[i].split(":"))[1].replaceAll("\"""");  
                            county = decodeUnicode(county);// 地区   
                    break;  
                    case 11:  
                        isp = (temp[i].split(":"))[1].replaceAll("\"""");  
                        isp = decodeUnicode(isp); // ISP公司  
                    break;  
                }  
            }  
      
    System.out.println(country+"="+area+"="+region+"="+city+"="+county+"="+isp);  
   return region+city;  
  }  
  return null;  
 }  
 /** 
  * @param urlStr 
  *            请求的地址 
  * @param content 
  *            请求的参数 格式为:name=xxx&pwd=xxx 
  * @param encoding 
  *            服务器端请求编码。如GBK,UTF-8等 
  * @return 
  */  
 private String getResult(String urlStr, String content, String encoding) {  
  URL url = null;  
  HttpURLConnection connection = null;  
  try {  
   url = new URL(urlStr);  
   connection = (HttpURLConnection) url.openConnection();// 新建连接实例  
   connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒  
   connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫秒  
   connection.setDoOutput(true);// 是否打开输出流 true|false  
   connection.setDoInput(true);// 是否打开输入流true|false  
   connection.setRequestMethod("POST");// 提交方法POST|GET  
   connection.setUseCaches(false);// 是否缓存true|false  
   connection.connect();// 打开连接端口  
   DataOutputStream out = new DataOutputStream(connection  
     .getOutputStream());// 打开输出流往对端服务器写数据  
   out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxx  
   out.flush();// 刷新  
   out.close();// 关闭输出流  
   BufferedReader reader = new BufferedReader(new InputStreamReader(  
     connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据  
   // ,以BufferedReader流来读取  
   StringBuffer buffer = new StringBuffer();  
   String line = "";  
   while ((line = reader.readLine()) != null) {  
    buffer.append(line);  
   }  
   reader.close();  
   return buffer.toString();  
  catch (IOException e) {  
   e.printStackTrace();  
  finally {  
   if (connection != null) {  
    connection.disconnect();// 关闭连接  
   }  
  }  
  return null;  
 }  
 /** 
  * unicode 转换成 中文 
  
  * @author fanhui 2007-3-15 
  * @param theString 
  * @return 
  */  
 public static String decodeUnicode(String theString) {  
  char aChar;  
  int len = theString.length();  
  StringBuffer outBuffer = new StringBuffer(len);  
  for (int x = 0; x < len;) {  
   aChar = theString.charAt(x++);  
   if (aChar == '\\') {  
    aChar = theString.charAt(x++);  
    if (aChar == 'u') {  
     int value = 0;  
     for (int i = 0; i < 4; i++) {  
      aChar = theString.charAt(x++);  
      switch (aChar) {  
      case '0':  
      case '1':  
      case '2':  
      case '3':  
      case '4':  
      case '5':  
      case '6':  
      case '7':  
      case '8':  
      case '9':  
       value = (value << 4) + aChar - '0';  
       break;  
      case 'a':  
      case 'b':  
      case 'c':  
      case 'd':  
      case 'e':  
      case 'f':  
       value = (value << 4) + 10 + aChar - 'a';  
       break;  
      case 'A':  
      case 'B':  
      case 'C':  
      case 'D':  
      case 'E':  
      case 'F':  
       value = (value << 4) + 10 + aChar - 'A';  
       break;  
      default:  
       throw new IllegalArgumentException(  
         "Malformed      encoding.");  
      }  
     }  
     outBuffer.append((char) value);  
    else {  
     if (aChar == 't') {  
      aChar = '\t';  
     else if (aChar == 'r') {  
      aChar = '\r';  
     else if (aChar == 'n') {  
      aChar = '\n';  
     else if (aChar == 'f') {  
      aChar = '\f';  
     }  
     outBuffer.append(aChar);  
    }  
   else {  
    outBuffer.append(aChar);  
   }  
  }  
  return outBuffer.toString();  
 }  
 // 测试  
 public static void main(String[] args) {  
  AddressUtils addressUtils = new AddressUtils();  
  // 测试ip 119.167.110.110 
  String ip = "119.167.110.110";  
  String address = "";  
  try {  
   address = addressUtils.getAddresses("ip="+ip, "utf-8");  
  catch (UnsupportedEncodingException e) {  
   // TODO Auto-generated catch block  
   e.printStackTrace();  
  }  
  System.out.println(address);  
 }  
}

这样就可以利用springmvc拦截器防止恶意刷新页面了,希望可以帮到你

45人已赞


本文由Fun言网 – 小东Freeman创作,转载请务必附上本文链接和出处,欢迎参与我们的付费投稿计划


你还没有登录,请先 登录注册!
文章评论1