前台是Flex,后台是Java,想要取得客户端的IP,似乎Flex不好实现,那么方法大概有3种:
1是为了这件事,后台再搭个IIS用ASP取,或用PHP取,然后Flex中通过HTTPService得到
2是后台Java取。但是,绝大部分例子都是Java的Servlet取客户端IP,和Flex连接的Java(或者说连接AMF的Spring)该如何取,还不知道,但今天找了一个非Servlet的例子,希望能有所启发。
3是通过JavaScript取得,然后在嵌入SWF的HTML里和SWF通讯
Java取得客户端IP地址
最近做一个安全系统,需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户端ip和mac地址的两个方法,留存。
1.获取客户端ip地址( 这个必须从客户端传到后台):
jsp页面下,很简单,request.getRemoteAddr() ;
因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换
2.获取客户端mac地址
调用window的命令,在后台Bean里实现 通过ip来获取mac地址。方法如下:
javascript获取客户端网卡MAC地址和IP地址和计算机名
在做 B/S 结构的系统时,我们常常需要获取客户端的一些信息,如 IP 和 MAC ,以结合身份验证。 要获取服务器端的 MAC 很容易,但是要获取客户端的 MAC 的地址确要花费一翻心思,通常的做法是调用 Win32API 或直接调用 nbtstat 命令,这样做有很多问题,而另一种方法就是直接用客户端脚本,我们这里用 Javascript ,这样做的好处是不需要服务器端进行处理,有客户端自行获取,传递到服务器端,且速度和可靠性都比在服务器端获取好。
具体实现的html和javascript如下:
其实最关键的还是用到两个ActiveX:
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
不过这两个ActiveX都是系统自带,不用去下载或注册。
接下来的工作就是用脚本和ActiveX交互
附件:Javascript和swf通讯基础
需要这个包
import flash.external.ExternalInterface;
这是一个静态类,主要用两个方法:
AS给做一个接口,然后Flash就可以访问AS的接口,从而可以调用AS的函数
ExternalInterface.addCallback("browse",this,upBrowse);
其中borwse是javascript可以调用flash 的接口,upBrowse是AS的函数
ExternalInterface.call("upAllComplete",upCount);
这个是AS调用Javascript的接口
其中upAllComplete是Javascript的函数,upCount是需要传递的参数
废话少说,例子上。
这个是AS调JS
AS代码:
JS代码:
这个是JS调用AS的(有点麻烦)
html代码:
JS代码:
AS代码:
1是为了这件事,后台再搭个IIS用ASP取,或用PHP取,然后Flex中通过HTTPService得到
2是后台Java取。但是,绝大部分例子都是Java的Servlet取客户端IP,和Flex连接的Java(或者说连接AMF的Spring)该如何取,还不知道,但今天找了一个非Servlet的例子,希望能有所启发。
3是通过JavaScript取得,然后在嵌入SWF的HTML里和SWF通讯
MXML:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
creationComplete="dpxml.send();"
viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
]]>
</mx:Script>
<mx:Style source="Standard.css"/>
<mx:HTTPService id="dpxml"
showBusyCursor="true" method="POST" url="xxx.asp" useProxy="false" resultFormat="e4x"/>
<mx:DataGrid id="myDG" width="300" rowCount="20"
dataProvider="{dpxml.lastResult.Province}" x="6" y="30" height="141" alpha="0.5">
<mx:columns>
<mx:DataGridColumn headerText="客户端" dataField="@label" width="100"/>
<mx:DataGridColumn headerText="信息" dataField="@data" width="200"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
ASP:
<%
dim IPDataArr,IPQuery,IPDataStr,country,city
ipdata = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If ipdata = "" Then ipdata = Request.ServerVariables("REMOTE_ADDR")
IPDataArr=Split(ipdata,".")
IPDataStr=Cint(IPDataArr(0))*16777216 + Cint(IPDataArr(1))*65536 + Cint(IPDataArr(2))*256 + Cint(IPDataArr(3))
Set conn = Server.CreateObject("ADODB.Connection")
DBPath = Server.MapPath("ipaddress.mdb")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& DBPath
Set rs = Server.CreateObject("ADODB.Recordset")
SQL="select * from ipdatatable where ip1<="&IPDataStr&" AND ip2>="&IPDataStr&""
rs.Open SQL,conn,1,3
FOR I=1 TO RS.recordcount
if rs.Eof then Exit For
if rs.eof and rs.bof then
country="none"
city="none"
else
country=rs("country")
city=rs("city")
end if
if rs("city")="CSSFLEX" then CF=rs("city")
rs.movenext
next
%>
<?xml version="1.0" encoding="utf-8"?>
<Provinces>
<Province label="ipdata" data="<%=ipdata%>" />
<Province label="country" data="<%=country%>" />
<Province label="city" data="<%=city%>" />
</Provinces>
<%
set rs=nothing
conn.close
set conn=nothing
%>
Java取得客户端IP地址
最近做一个安全系统,需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户端ip和mac地址的两个方法,留存。
1.获取客户端ip地址( 这个必须从客户端传到后台):
jsp页面下,很简单,request.getRemoteAddr() ;
因为系统的VIew层是用JSF来实现的,因此页面上没法直接获得类似request,在bean里做了个强制转换
public String getMyIP() {
try {
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest)fc.getExternalContext().getRequest();
return request.getRemoteAddr();
}
catch (Exception e) {
e.printStackTrace();
}
return "";
}
2.获取客户端mac地址
调用window的命令,在后台Bean里实现 通过ip来获取mac地址。方法如下:
public String getMACAddress(String ip){
String str = "";
String macAddress = "";
try {
Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
InputStreamReader ir = new InputStreamReader(p.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (int i = 1; i < 100; i++) {
str = input.readLine();
if (str != null) {
if (str.indexOf("MAC Address") > 1) {
macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length());
break;
}
}
}
} catch (IOException e) {
e.printStackTrace(System.out);
}
return macAddress;
}
javascript获取客户端网卡MAC地址和IP地址和计算机名
在做 B/S 结构的系统时,我们常常需要获取客户端的一些信息,如 IP 和 MAC ,以结合身份验证。 要获取服务器端的 MAC 很容易,但是要获取客户端的 MAC 的地址确要花费一翻心思,通常的做法是调用 Win32API 或直接调用 nbtstat 命令,这样做有很多问题,而另一种方法就是直接用客户端脚本,我们这里用 Javascript ,这样做的好处是不需要服务器端进行处理,有客户端自行获取,传递到服务器端,且速度和可靠性都比在服务器端获取好。
具体实现的html和javascript如下:
<HTML><HEAD><TITLE>WMI Scripting HTML</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);
//document.formbar.submit();
</SCRIPT>
<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
{
if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
MACAddr = objObject.MACAddress;
if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
IPAddr = objObject.IPAddress(0);
if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
sDNSName = objObject.DNSHostName;
}
</SCRIPT>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language=JScript>
var service = locator.ConnectServer();
var MACAddr ;
var IPAddr ;
var DomainAddr;
var sDNSName;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>
<FORM id="formfoo" name="formbar" action="index.do" method="post"><INPUT value="00-11-11-B4-52-EF" name="txtMACAddr"> <INPUT value="210.42.38.50" name="txtIPAddr"> <INPUT value="zhupan" name="txtDNSName"> </FORM></BODY></HTML>
其实最关键的还是用到两个ActiveX:
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
不过这两个ActiveX都是系统自带,不用去下载或注册。
接下来的工作就是用脚本和ActiveX交互
附件:Javascript和swf通讯基础
需要这个包
import flash.external.ExternalInterface;
这是一个静态类,主要用两个方法:
ExternalInterface.addCallback(给Javascript的接口,AS函数位置,AS函数名)
ExternalInterface.call(Javascript函数名,传值)
AS给做一个接口,然后Flash就可以访问AS的接口,从而可以调用AS的函数
ExternalInterface.addCallback("browse",this,upBrowse);
其中borwse是javascript可以调用flash 的接口,upBrowse是AS的函数
ExternalInterface.call("upAllComplete",upCount);
这个是AS调用Javascript的接口
其中upAllComplete是Javascript的函数,upCount是需要传递的参数
废话少说,例子上。
这个是AS调JS
AS代码:
ExternalInterface.call("upAllComplete",upCount);
JS代码:
function upAllComplete(upData){
//upData是AS中的upCount传过来的值,可以是对象,数组,字符串 ,数字
alert(upData);
}
这个是JS调用AS的(有点麻烦)
html代码:
<object type="application/x-shockwave-flash" data="test.swf" width="525" height="390" name="testcommand">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="scale" value="noScale" />
<param name="wmode" value="transparent" />
</object>
JS代码:
function thisMovie(movieName) {
if (navigator.appName.indexOf ("Microsoft") !=-1) {
return window[movieName];
} else {
return document[movieName];
}
}
thisMovie("testcommand").browse(toSwfData);
//testcommand是HTML中Object的id和name,name和id要一样,这个是考虑到浏览器兼容性
//browse是swf函数upBrowse的映射名称
AS代码:
function upBrowse(jsData){
trace(jsData);
}
ExternalInterface.addCallback("browse",this,upBrowse);
//映射upBrowse这个函数为接口browse