我需要编写一个脚本,我希望将其包含在不同的网站上(类似于您必须包含在网站页面中的Google Analytics js)。
此脚本必须向我的一个servlet(我正在使用java)发送请求。
在servlet中我需要增加一些变量,之后将图像返回给客户端。图像将显示在用户访问的网站上。
我还需要在servlet中获取客户端的信息(ip等)。如果我使用getRemoteAddr()方法,它会在这种情况下工作吗?
此外,我需要跟踪我向客户端显示的图像。(我不知道应该在哪里,客户端或服务器端)。
Whics是这样做的正确方法吗?
答案 0 :(得分:3)
您的JS必须打印/追加<img>
指向文档的1x1透明GIF图像。 JS收集的所有信息都可以作为图像URL上的查询字符串发送。 Google Analytics会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>
在servlet的doGet()
方法中,您可以收集所有信息,最后返回一个真正的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);
}
答案 1 :(得分: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');
答案 2 :(得分:0)
你可以放一个像这样的图像标签
<img href="yourserver.com/the-servlet-path" />
并根据该请求提供图片 然后你不需要分发脚本
有关请求用户的信息全部在servlet api
中