显示证明

时间:2014-01-13 15:33:56

标签: jquery spring-mvc screenshot

我被要求在网络应用程序中实现“显示证明”......

这意味着我需要以某种方式获取在浏览器中显示(或关闭)客户端的屏幕截图,以便能够证明我们确实给了他所需要的“合法的“证据。

即使我不同意这种证据(浏览器有自己的方式来显示HTML,存储的截图很容易被破解或伪造......),我想知道它是否已经在某处完成了实现这种功能。

任何想法或经验?

为了简化,我们不能要求用户安装任何东西(插件,应用程序......) 使用的技术:主要是Java,Spring-mvc,Thymeleaf和JQuery

2 个答案:

答案 0 :(得分:0)

您可以使用Selenium Webdriver制作屏幕截图并将其保存到本地磁盘。 请查看有关How take screenshot using selenium webdriver with java.

的问题

但是,这又可以用作自动化测试工具,在没有任何用户交互的情况下操纵系统中的用户活动。我们的项目也使用您提到的相同技术堆栈,测试团队使用Selenium webdriver来制作某些条件的屏幕截图,以确保条件有效。

通常通过选择并检查使用Xpath选择器加载的html页面中的id和tag元素来完成。它将在他们运行的java代码中配置的单独文件夹中截取失败和成功条件的屏幕截图。然后,它即时创建Excel文档,以显示执行的任务和这些任务的结果。

答案 1 :(得分:0)

好的,这里有2个解决方案:

一个服务器端:在使用过滤器将HTML流发送到客户端浏览器之前捕获HTML流:

    public class ProofDisplayFilter implements Filter {
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException {

             HttpServletRequest request = (HttpServletRequest) req;
             HttpServletResponse response = (HttpServletResponse) res;  

             Mywriter writer = ...;
             ProofWriter proofWriter = new ProofWriter(response.getWriter(), writer);

              //doFilter will right in the proofWriter that will copy output flow
              chain.doFilter(request, wrapResponse(response, proofWriter)); 

              //do whatever you need with your copy
              saveHTMLAndStaticContentAsZip(proofWriter);
        }

        private static HttpServletResponse wrapResponse (final HttpServletResponse response, final PrintWriter writer){
                return new HttpServletResponseWrapper(response) {
                    public PrintWriter getWriter() throws IOException {
                        return writer;
                    }
                };
       }
    }

问题是您需要修改HTML流程以获得对js,css和图像资源的良好引用。

一个客户端 :(感谢@NimChimpsky)使用html2canvas.js API创建快照并将其作为图像发送到您的控制器:

JS

    html2canvas(document.body, {
                onrendered: function(canvas) {
                    $.post('/myApp/proof',
                            {
                                image : canvas.toDataURL()
                            },
                            function(data) {...});
                }
            });

CONTROLLER

    @RequestMapping(value = "/proof")
    @ResponseBody
    public void proof(@RequestParam(value="image") String imageBase64) throws IOException {
        long now = Calendar.getInstance().getTimeInMillis();
        byte[] bytes = imageBase64.replaceAll("data:image/.+;base64,", "").getBytes();

        File proof = new File("./proof", "display-"+now+".jpeg");

        if(!proof.exists()){
            Files.createParentDirs(proof);
        }
        Files.write(DECODER.decode(bytes), proof);
}

(或者你需要对此图片做任何其他事情)

两种解决方案都有利有弊:
服务器端
赞成
  - 捕获HTML,因为它是   - 处理/比较HTML流量的可能性
CONS
  - 我们不知道它是如何显示给客户的   - 消耗大量磁盘空间:〜1Mo / capture(也需要保存静态文件)
  - 使用AJAX调用的页面部分怎么样?

客户端
赞成
  - 精确:在需要它的页面中设置脚本
  - 管理浏览器的渲染
CONS
  - 使用HTML5画布,直到第9版才在IE中支持   - 侵入性(在我看来)

希望这可以帮助一些人 感谢您的支持!