使用request.getRemoteAddr(),只能获取内网的电脑IP,。如果是在外网,只能获得网关的IP,请教一下大家,如何获取到客户端的IP和MAC网卡地址
解决方案 »
- spring 注入, 偶然没有用接口 直接用实现类注入出现问题
- 阿里巴巴旺铺数据库如何设计
- 一个很经典的游戏,你敢回答楼上的问题吗?
- Help!如何获取form中的数组数据。。。。。。
- sturst2中<s:action>的问题
- weblogic连接池的问题,我实在是有点菜!
- 怎么样在SERVLET中调用EXECL文件,并且不会出现乱码的现象了???
- 请提供几种应用系统中有关大量文档管理的方案?
- 大型网站应用服务器用什么好?
- eclipse启动maven用tomcat启动插件报错,Failed to start component [StandardEngine[Tomcat]
- 学编程那么多重要的英文记不住啊!怎么办啊?
- 一个struts2 验证框架 国际化的问题
if ((clientIp == null) || (clientIp.length() == 0)
|| ("unknown".equalsIgnoreCase(clientIp))) {
clientIp = request.getHeader("Proxy-Client-IP");
}
if ((clientIp == null) || (clientIp.length() == 0)
|| ("unknown".equalsIgnoreCase(clientIp))) {
clientIp = request.getHeader("WL-Proxy-Client-IP");
}
if ((clientIp == null) || (clientIp.length() == 0)
|| ("unknown".equalsIgnoreCase(clientIp))) {
clientIp = request.getRemoteAddr();
}
return clientIp;
然后再转一下
String[] ips = clientIp.split("[.]");
StringBuffer sb = new StringBuffer();
sb.append(ips[0]);
for(int i=1;i<ips.length;i++){
if(ips[i].length()==1){
sb.append("00"+ips[i]);
}else if(ips[i].length()==2){
sb.append("0"+ips[i]);
}else{
sb.append(ips[i]);
}
}
return Long.parseLong(sb.toString());
1、借助ActiveX,获取到MAC地址;
2、攻破浏览器安全保护,执行本地代码获取MAC地址。
内网通过 nbtstat -a ipAddress 能够得到mac地址BufferedReader is = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("nbtstat -a 192.168.1.139").getInputStream()));
//得到输入里,然后读取内容, 截取MAC地址。
如果要得到外网mac地址 , 主要是要得到外网IP地址 , 这个没试过 。
ip可以获取的 //获取ip地址
public String getIpAddr(HttpServletRequest request) {
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");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
正解楼主这样的问题CSDN每周都会出现几次。
叫人说啥好呢?基础知识薄弱。
<%
String sip="";
String smac="";
sip = request.getHeader("x-forwarded-for");
if(sip == null ||sip.length() == 0 || "unknown".equalsIgnoreCase(sip))
{
sip = request.getHeader("proxy-Client-IP");
}
if (sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip))
{
sip = request.getHeader("WL-Proxy-Client-IP");
}
if (sip == null ||sip.length() == 0 || "unknown".equalsIgnoreCase(sip))
{
sip = request.getRemoteAddr();
}
//本机过滤掉
if(!"127.0.0.1".equals(sip))
{
//Process process = Runtime.getRuntime().exec("nbtstat -a " + sip);
//InputStreamReader ir = new InputStreamReader(process.getInputStream());
//LineNumberReader input = new LineNumberReader(ir);
//String line;
//while ((line = input.readLine()) != null)
//if (line.indexOf("MAC Address") > 0)
//{
//smac = line.substring(line.indexOf("-") - 2);
//}System.out.println(str.substring(str.indexOf("at")+2, str.indexOf("[ether]")).trim());
Process process = Runtime.getRuntime().exec("arp -a " + sip);
InputStreamReader ir = new InputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line;
while ((line = input.readLine()) != null)
if (line.indexOf("at") > 0)//找到at标识的一行
{
smac = line.substring(line.indexOf("at")+2, line.indexOf("[ether]")).trim();
}
}
out.println(smac);
out.println("<br>");
out.println(sip);
%>
打“//”注释起来的是服务端部署在windows下,没打“//”是部署在liunx上。但以上也只能在局域网里使用。在外网不行。放在外网上ip也是中间代理的ip。解决ip似乎还可以,但是获得mac还是不行。如是我调整设计策略,用不同的方式来绑定客户端的ip和电脑。但是这样还是有bug,不过还是能满足大多数用户。弄完这个后自己想了想,没做之前盲目在网上找资料,浪费了很多时间。现在想想简单的从TCP/IP协议里获得客户端ip和mac有点难度,我们系统也不是c/s模式。网上有好多网站投票貌似一台机器只能投一次,如果细心可以发现过段时间还可以投票,有的网站是需要运行或下载插件。关于这个问题,如果大家还有很好的方法可以提出来探讨一下。
IP?那就更不用说了,在B/S上做这个需求本身就是拍脑袋的事。
自己以为很高明其实弱得一笔