① java中如何獲取用戶的IP地址及禁止此人
樓上的方法是不合理的。第一,如果用戶使用代理,是無法獲得真實Ip的0;第二,IF語句不能保證禁止IP,而且很多網站並不需要登錄的。給樓主些方法,可供參考。
1。 獲取用戶IP
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
這種方法總是獲得用戶的真實IP
2。禁止IP,可以考慮從伺服器下手
(1) 如果用的是tomcat,那麼在tomcat_home/conf/server.xml中的<host></host>之間加一行代碼:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192.168.1.1"/>
這樣192.168.1.1這個ip訪問webapp時會收到 403 錯誤
(2) 如果是apache那麼:
<Directory /var/web/dir1>
Allow from all
Deny from 111.111.111.111
</Directory>
上面限制單個IP,限制IP段用*號代替。如111.111.111.*
(3) 或者樓主也可以像樓上說的用代碼實現,給你個JS代碼:
<SCRIPT LANGUAGE="java script">
<!-- Begin
netscape = (navigator.appName.indexOf("Netscape") != -1);
version4 = (navigator.appVersion.indexOf("4.") != -1);
if (netscape && version4) {
ip = "" + java.net.InetAddress.getLocalHost().getHostAddress();
if (ip.indexOf("235.12") >= -1)
// 這是想要禁止訪問的IP例如: 235.12.xxx.xxx
{
alert("You are not permitted to access this site.");
history.go(-1);
}
}
// End -->
</script>
將以上代碼加入到<head>區域中。
② java如何編程實現,獲取固定IP發來所有的數據包
額。。。初看到你的問題的時候嚇了一跳。還以為是用java實現網路嗅探呢。
你問的是socket編程?
那麼socket 均分為兩個,
一部分是服務端,
一部分是客戶端,
服務端一直開啟著監聽,
現在你的情況和平時不太一樣的是,平時,是服務端的ip不變化,而客戶端的變化。而是客戶端給服務端進行發送。
你的情況是相反。客戶端經常變動ip或者埠,而要求服務端發送。
其實轉換一下思路就好了。
有點類似於現在網頁在線聊天工具里的「長連接」思想。
你的那個固定ip伺服器,可以完全不管,你是什麼埠。因為,如果你的電腦准備好接受數據了。那麼你就向服務端發起請求。而服務端將結果發送給你。就是說,不是說伺服器一直給你發送,而是,你這個客戶端只要准備好接受數據,就向伺服器發送請求。這樣,不是沒有問題了么。。
如果還按你那個思路就是,你的電腦,需要實現網路嗅探的部分功能。但是
Java是網路層以上的。
你通過Java的Socket得到的數據包嗅探不出什麼敏感的東東了。
所以Java不適合做網路嗅探。
不過還好,現在有了叫jpcap的工具。你可以搜一下,
下面是一個簡單的實現,裡面獲得了來源的ip和埠 你可以加一個判斷,如果來源ip是固定的ip的話,那麼,你可以獲取對應的數據包
本程序用eclipse編輯在J2SDK6.0+WinPcap 3.1+Jpcap 0.5下編譯運行
/*******************
* JpcapTip.java
*/
package m;
import jpcap.PacketReceiver;
import jpcap.JpcapCaptor;
import jpcap.packet.*;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
//import java.net.InetAddress;
//import java.net.UnknownHostException;
public class JpcapTip implements PacketReceiver {
public void receivePacket(Packet packet) {
System.out.println("********************************************");
/*IP數據報報文頭*/
byte[] l=packet.header;
/*
for (int t=0;t<21;t++){
System.out.print(l[t]+" *** ");
}
*/
String str="";
System.out.print("報文頭 : ");
for (int i=0;i<l.length;i++) {
//str=str+l;
int m=0;
m=l[i];
m=m<<24;
m=m>>>24;
str=str+Integer.toHexString(m);
//System.out.print(" *** "+l[i]);
}
System.out.println(str);
int d=l.length;
System.out.println("首部長度 :"+(d*8)+"bit");
/*分析源IP地址和目的IP地址*/
/*分析協議類型*/
/**
if(packet.getClass().equals(IPPacket.class)) {
IPPacket ipPacket=(IPPacket)packet;
byte[] iph=ipPacket.option;
String iphstr=new String(iph);
System.out.println(iphstr);
}
*/
if(packet.getClass().equals(ARPPacket.class))
{
System.out.println("協議類型 :ARP協議");
try {
ARPPacket arpPacket = (ARPPacket)packet;
System.out.println("源網卡MAC地址為 :"+arpPacket.getSenderHardwareAddress());
System.out.println("源IP地址為 :"+arpPacket.getSenderProtocolAddress());
System.out.println("目的網卡MAC地址為 :"+arpPacket.getTargetHardwareAddress());
System.out.println("目的IP地址為 :"+arpPacket.getTargetProtocolAddress());
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(UDPPacket.class))
{
System.out.println("協議類型 :UDP協議");
try {
UDPPacket udpPacket = (UDPPacket)packet;
System.out.println("源IP地址為 :"+udpPacket.src_ip);
int tport = udpPacket.src_port;
System.out.println("源埠為:"+tport);
System.out.println("目的IP地址為 :"+udpPacket.dst_ip);
int lport = udpPacket.dst_port;
System.out.println("目的埠為:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(TCPPacket.class)) {
System.out.println("協議類型 :TCP協議");
try {
TCPPacket tcpPacket = (TCPPacket)packet;
int tport = tcpPacket.src_port;
System.out.println("源IP地址為 :"+tcpPacket.src_ip);
System.out.println("源埠為:"+tport);
System.out.println("目的IP地址為 :"+tcpPacket.dst_ip);
int lport = tcpPacket.dst_port;
System.out.println("目的埠為:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(ICMPPacket.class))
System.out.println("協議類型 :ICMP協議");
else
System.out.println("協議類型 :GGP、EGP、JGP協議或OSPF協議或ISO的第4類運輸協議TP4");
/*IP數據報文數據*/
byte[] k=packet.data;
String str1="";
System.out.print("數據 : ");
for(int i=0;i<k.length;i++) {
//int m=0;
//m=k[i];
//m=m<<24;
//m=m>>>24;
//str1=str+Integer.toHexString(m);
str1 = new String(k);
//str1=str1+k[i];
//System.out.print(" *** "+k[i]);
}
System.out.println(str1);
System.out.println("數據報類型 : "+packet.getClass());
System.out.println("********************************************");
}
public static void main(String[] args) throws Exception{
// TODO 自動生成方法存根
NetworkInterface[] devices = JpcapCaptor.getDeviceList(); //.getDeviceList();.
//for (int i =0; i<devices.length;i++) {
int a=0;
//try {
/*本地網路信息*/
byte[] b=devices[1].mac_address; //網卡物理地址
//}
//catch() {}
System.out.print("網卡MAC : 00");
for (int j=0;j<b.length;j++){
//a=a<<8;
a=b[j];
a=a<<24;
a=a>>>24;
System.out.print(Integer.toHexString(a));
}
System.out.println();
NetworkInterfaceAddress[] k=devices[1].addresses;
//System.out.println("網卡MAC : "+Integer.toHexString(a));
for(int n=0;n<k.length;n++) {
System.out.println("本機IP地址 : "+k[n].address); //本機IP地址
System.out.println("子網掩碼 : "+k[n].subnet); //子網掩碼
}
System.out.println("網路連接類型 : "+devices[1].datalink_description);
//}
NetworkInterface deviceName = devices[1];
/*將網卡設為混雜模式下用網路設備deviceName*/
JpcapCaptor jpcap =JpcapCaptor.openDevice(deviceName, 2000, false, 1); //openDevice(deviceName,1028,false,1);
jpcap.loopPacket(-1,new JpcapTip());
}
}
加油~~