2011-05-20 34 views
1

我需要写一个脚本,我想包括在不同的网站上(类似于谷歌分析js,你必须包括在你的网站页面)。什么是写入将包含在其他网站中的js的正确方法?

此脚本必须发送到我的一个servlet(我使用java)请求。

在servlet中,我需要增加一些变量,然后将图像返回给客户端。该图像将显示在用户访问的网站上。

我还需要在servlet中获取客户端的信息(ip等)。如果我使用getRemoteAddr()方法,它会在这种情况下工作吗?此外,我需要跟踪显示给客户端的图像(我不知道应该在哪里,客户端或服务器端)。

Whics是这样做的正确方法吗?

回答

3

您的JS必须打印/追加<img>指向1x1透明GIF图像到文档。 JS收集的所有信息都可以作为图像URL上的查询字符串发送。谷歌分析确实similar thing

基本上是:

<script src="http://yourdomain.com/track.js"></script> 

有:

var requestURI = window.location; 
var referrer = document.referrer; 
var resolution = screen.width + 'x' + screen.height; 
var colorDepth = screen.colorDepth; 
// ... 

var query = '?requestURI=' + encodeURIComponent(requestURI) 
      + '&referrer=' + encodeURIComponent(referrer) 
      + '&resolution=' + encodeURIComponent(resolution) 
      + '&colorDepth=' + encodeURIComponent(colorDepth); 

document.write('<img src="http://yourdomain.com/track.gif' + query + '" />'); 

然后,在yourdomain.com,你必须对图片网址servlet地图:

<servlet> 
    <servlet-name>trackServlet</servlet-name> 
    <servlet-class>com.example.TrackServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>trackServlet</servlet-name> 
    <url-pattern>/track.gif</url-pattern> 
</servlet-mapping> 

doGet() servlet的方法可以收集所有信息并最终返回一个真正的1x1 gif图像:

private static final byte[] GIF = { 
    71, 73, 70, 56, 57, 97, 1, 0, 1, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 33, -7, 
    4, 1, 0, 0, 0, 0, 44, 0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 2, 68, 1, 0, 59 
}; 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // Gather JS-collected parameters. 
    String requestURI = request.getParameter("requestURI"); 
    String referrer = request.getParameter("referrer"); 
    String resolution = request.getParameter("resolution"); 
    String colorDepth = request.getParameter("colorDepth"); 
    // ... 

    // Gather server-collected parameters. 
    String remoteAddr = request.getRemoteAddr(); 
    String userAgent = request.getHeader("user-agent"); 
    // ... 

    // Send 1x1 transparent gif (and disable browser caching on it!) 
    response.setHeader("Content-Type", "image/gif"); 
    response.setHeader("Cache-Control", "no-cache,no-store,must-revalidate"); 
    response.setHeader("Pragma", "no-cache"); 
    response.setDateHeader("Expires", 0); 
    response.getOutputStream().write(GIF); 
} 
+0

不错的解释!谢谢。关于如何在服务器端获取提供者名称的任何想法? – 2011-05-22 19:43:10

+0

不客气。但是,你认为“提供者”究竟意味着什么?这个术语在当前的情况下非常不明确。 – BalusC 2011-05-22 19:46:31

+0

我想跟踪用户的IP,地理位置和Internet服务提供商。 – 2011-05-23 06:37:19

1

比方说,你正在使用PHP这样做:

文件:api.js.php

<?php 

    // get user ip and do something with it 
    $ip = $_SERVER['REMOTE_ADDR']; 

    // since we're in a PHP file, we need to tell the client it's actually JS 
    header('Content-Type: application/javascript',true); 

?> 

// your regular JS folows here 
alert('Hi there'); 
0

你可以把图像标记像这样

<img href="yourserver.com/the-servlet-path" /> 

和服务从图像请求 那么你不需要分发脚本

有关请求用户的信息全部在servlet api中

相关问题