基本思想:先將的IP地址轉換成long型的數,然后比較IP的大小來判斷是否處在符合條件的IP地址段。
IP地址轉化成long型數的算法
接著再編寫IP攔截器如下:
IP地址轉化成long型數的算法
1
2
// 一個IP,是一個32位無符號的二進制數。故用long的低32表示無符號32位二進制數。
3
public long getIP(InetAddress ip) {
4
byte[] b = ip.getAddress();
5
long l = b[0] << 24L & 0xff000000L | b[1] << 16L & 0xff0000L
6
| b[2] << 8L & 0xff00 | b[3] << 0L & 0xff;
7
return l;
8
}
9
10
// 一個IP,是一個32位無符號的二進制數。故用long的低32表示無符號32位二進制數。
11
public long getIP(InetAddress ip) {
12
byte[] b = ip.getAddress();
13
long l = b[0] << 24L & 0xff000000L | b[1] << 16L & 0xff0000L
14
| b[2] << 8L & 0xff00 | b[3] << 0L & 0xff;
15
return l;
16
}
在struts2相應的action中編寫如下判斷是否用戶是校內用戶的方法(方法參數中ip1的IP大小應該大于ip2的IP大小):
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

1
public void isSchoolUser(String ip1, String ip2) throws Exception {
2
// 得到用戶的IP地址
3
String s = ServletActionContext.getRequest().getRemoteAddr();
4
long l = getIP(InetAddress.getByName(s));
5
// 設置IP地址段
6
long l1 = getIP(InetAddress.getByName(ip1));
7
long l2 = getIP(InetAddress.getByName(ip2));
8
// 判斷用戶IP是否處在IP段中
9
if (l >= l1 && l <= l2) {
10
ActionContext.getContext().getSession().put("isSchoolUser","yes");
11
}
12
}
13
14
public void isSchoolUser(String ip1, String ip2) throws Exception {
15
// 得到用戶的IP地址
16
String s = ServletActionContext.getRequest().getRemoteAddr();
17
long l = getIP(InetAddress.getByName(s));
18
// 設置IP地址段
19
long l1 = getIP(InetAddress.getByName(ip1));
20
long l2 = getIP(InetAddress.getByName(ip2));
21
// 判斷用戶IP是否處在IP段中
22
if (l >= l1 && l <= l2) {
23
ActionContext.getContext().getSession().put("isSchoolUser","yes");
24
}
25
}
上面的方法中用到了InetAddress,所以需要引入java.net.InetAddress包;
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

接著再編寫IP攔截器如下:
1
public class IpAuthorityInterceptor extends AbstractInterceptor {
2
public String intercept(ActionInvocation invocation) throws Exception {
3
ActionContext context = invocation.getInvocationContext();
4
Map<String, String> session = context.getSession();
5
if ("yes".equals(session.get("isSchoolUser"))){
6
return invocation.invoke();
7
} else {
8
context.put("AuthorityError", "你是外網用戶無法訪問此資源");
9
return "error";
10
}
11
}
12
}
13
14
public class IpAuthorityInterceptor extends AbstractInterceptor {
15
public String intercept(ActionInvocation invocation) throws Exception {
16
ActionContext context = invocation.getInvocationContext();
17
Map<String, String> session = context.getSession();
18
if ("yes".equals(session.get("isSchoolUser"))){
19
return invocation.invoke();
20
} else {
21
context.put("AuthorityError", "你是外網用戶無法訪問此資源");
22
return "error";
23
}
24
}
25
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

1
<interceptors>
2
<interceptor name="IpAuthorityInterceptor"
3
class="web.IpAuthorityInterceptor">
4
<!--此class對應你項目中的IpAuthorityInterceptor的編寫位置-->
5
</interceptor>
6
<interceptor-stack name="IpAuthority">
7
<interceptor-ref name="defaultStack"></interceptor-ref>
8
<interceptor-ref name="IpAuthorityInterceptor"></interceptor-ref>
9
</interceptor-stack>
10
</interceptors>
11
12
<interceptors>
13
<interceptor name="IpAuthorityInterceptor"
14
class="web.IpAuthorityInterceptor">
15
<!--此class對應你項目中的IpAuthorityInterceptor的編寫位置-->
16
</interceptor>
17
<interceptor-stack name="IpAuthority">
18
<interceptor-ref name="defaultStack"></interceptor-ref>
19
<interceptor-ref name="IpAuthorityInterceptor"></interceptor-ref>
20
</interceptor-stack>
21
</interceptors>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
