【问题标题】:what's the proper way to write a js that will be included in other websites?编写将包含在其他网站中的js的正确方法是什么?
【发布时间】:2011-08-29 10:26:55
【问题描述】:

我需要编写一个我想包含在不同网站上的脚本(类似于您必须包含在您的网站页面中的谷歌分析 js)。

这个脚本必须向我的一个 servlet(我正在使用 java)发送一个请求。

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

我还需要在 servlet 中获取客户端的信息(ip 等)。如果我使用 getRemoteAddr() 方法,它会在这种情况下工作吗?

此外,我需要跟踪显示给客户端的图像。(我不知道应该在哪里,客户端还是服务器端)。

这样做的正确方法是什么?

【问题讨论】:

    标签: java javascript ajax servlets


    【解决方案1】:

    您的 JS 必须在文档中打印/附加一个指向 1x1 透明 GIF 图像的 <img>。 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 中,您必须在图像 URL 上映射 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);
    }
    

    【讨论】:

    • 很好的解释!谢谢。关于如何在服务器端获取提供者名称的任何想法?
    • 不客气。但是,“提供者”到底是什么意思?这个词在当前语境中非常含糊。
    • 我想跟踪用户的 IP、地理位置和互联网服务提供商。
    • IP 是答案中的remoteAddr。对于地理位置和 ISP,请使用接受 IP 并返回所需信息的第 3 方 API/数据库。
    【解决方案2】:

    假设您正在使用 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');
    

    【讨论】:

      【解决方案3】:

      你可以像这样放一个图片标签

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

      并根据该请求提供图像 那么你不需要分发脚本

      请求用户的信息都在servlet api中

      【讨论】:

        猜你喜欢
        • 2021-08-29
        • 2014-10-10
        • 2021-03-21
        • 2019-07-28
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        相关资源
        最近更新 更多