JSP-Как скрыть панель инструментов в бэкэнде при просмотре PDF в браузере?

У меня есть страница JSP, которая отображает PDF-документ при его вызове. Предполагая, что я создаю URL-адрес в этом формате:

http://localhost:8080/repository/file/view/viewPDF.jsp?fileID=27455

и отправить другому пользователю. Пользователь без проблем может просмотреть документ (id:27455) в своем браузере. Но допустим, я хочу скрыть отображаемую панель инструментов PDF, чтобы пользователю не был разрешен доступ к этой панели инструментов.

Я обнаружил, что, введя эту ссылку:

http://localhost:8080/repository/file/view/viewPDF.jsp?fileID=27455#toolbar=0

Затем это выше скроет панель инструментов, но она уязвима, поскольку другой пользователь может изменить ее значение на 1, и панель инструментов появится. Я думаю, можно ли вместо этого скрыть это внутри внутреннего кода, но не могу понять, как это сделать.

Мой взглядPDF.jsp:

<%@page import="java.io.*"%>



<%@include file="../../../WEB-INF/jspf/mcre.jspf" %>



<%



    response.setContentType("application/pdf");
    boolean debug = true;
    try {


        String snodeid = request.getParameter("nodeID");
        long nodeid = Long.parseLong(snodeid);

        Pdfinfo pdf = PPFacade.getPDFInfo(nodeid);
        String pdfpath = pdf.getFfullpath();
        if (debug) {
            System.out.println("=============== PDF STREAM ================");
            System.out.println("pdfpath = "+ pdfpath);
        }

        //int len = (int)new File("D://test.pdf").length();
        int len = (int)new File(pdfpath).length();
        response.setContentLength(len);
        byte[] buf = new byte[len];
        FileInputStream pdfin = new FileInputStream(pdfpath);
        pdfin.read(buf);
        pdfin.close();
        OutputStream pdfout = response.getOutputStream();
        pdfout.write(buf,0,len);
        pdfout.flush();

        if (debug) {
            System.out.println("=============== END PDF STREAM ================");
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

%>

<head>
    PDF

</head>

Конечно, я знаю, что скрытие #toolbar не является надежным, так как любой пользователь с такими знаниями может легко обойти его.


person Daredevil    schedule 13.03.2019    source источник
comment
Почему бы вам просто не скрывать панель инструментов и не отображать PDF-файл в новой вкладке/окне или в iframe? Затем можно было поделиться ссылкой, предоставив кнопку «Поделиться», которая предоставляет ссылку только на документ.   -  person Thomas    schedule 13.03.2019
comment
Как это работает, я генерирую обычную ссылку в формате, показанном выше, и отправляю ее кому-то другому. Что кто-то может ввести URL-адрес в браузере и просмотреть его. Вот так.   -  person Daredevil    schedule 13.03.2019
comment
Кроме того, почти забыл, потому что как пользователь мне нужно проверить, есть ли у меня разрешение на печать и загрузку. Если да, то отправка ссылки должна разрешать панель инструментов = 1, иначе отправка ссылки должна разрешать панель инструментов = 0. Это моя логика. Надеюсь, это имеет смысл.   -  person Daredevil    schedule 13.03.2019
comment
Если я правильно понимаю задачу, то одни пользователи по каким-то критериям должны иметь доступ к панели инструментов, а другие нет. Поэтому я бы сделал проверку в бэкэнде, должен ли текущий пользователь видеть панель инструментов (например, вошел в систему), а затем передать эту информацию в jsp, в jsp панель инструментов отображается или нет на основе этой информации. Выполнение этой проверки через URL-адрес не похоже на чистое решение.   -  person Dimitris    schedule 13.03.2019
comment
@Dimitris Я считаю, что ты все правильно понял. Я имею в виду, что это не очень хорошее решение, и я не мог придумать лучшего, потому что, даже скрыв панель инструментов, я могу легко добавить toolbar=1 к URL-адресу, и это разрушит цель, я прав?   -  person Daredevil    schedule 13.03.2019
comment
Похоже, главный вопрос в том, КОГДА кто-то должен увидеть панель инструментов. Если это ясно, я ожидаю, что будет легко решить вашу проблему программно в бэкэнде, а не во внешнем интерфейсе. Кроме того, если бэкэнд обрабатывает это, пользователь не может ничего сделать, чтобы повлиять на него (как и должно быть).   -  person Dimitris    schedule 13.03.2019
comment
Ну, я знаю, когда кто-то должен увидеть панель инструментов. Допустим, если у меня есть разрешение на печать и разрешение на загрузку, и я получаю URL-адрес и отправляю его вам, вы сможете просматривать документ вместе с панелью инструментов. Это все. Проблема в том, что я не хочу, чтобы вы видели URL-адрес, содержащий #toolbar, поэтому я решил сделать это в бэкэнде, но понятия не имею, как это сделать.   -  person Daredevil    schedule 13.03.2019
comment
Могу ли я что-нибудь сделать, чтобы outputstream pdfout скрыл панель инструментов?   -  person Daredevil    schedule 13.03.2019
comment
Вы описываете разрешения, которые не видны в вашем коде. Кроме того, я никогда не писал java в jsp, я почти уверен, что это приводит к плохим практикам. Но способ, которым я бы атаковал проблему, был бы следующим. Перейдите к своему контроллеру, вызовите службы, которые предоставляют разрешения, проверьте, есть ли у текущего пользователя разрешения, необходимые для просмотра панели инструментов, добавьте логический атрибут модели для панели инструментов.   -  person Dimitris    schedule 13.03.2019
comment
Да, но предположим, что я знаю логику использования if else для решения проблемы. Мне просто интересно узнать о настройках панели инструментов в бэкэнде. Потому что, когда я ввожу URL-адрес, он в основном вызывает viewPDF.jsp, что показано в моем вопросе.   -  person Daredevil    schedule 13.03.2019
comment
Я не уверен, что разрешить пользователям просматривать PDF-файл, но не загружать его, если у них нет разрешения, это легко сделать. Если вы отправляете данные PDF в браузер для отображения, то пользователь уже имеет к ним доступ и может сохранить страницу и т. д., поэтому, если вы хотите предотвратить загрузку/печать, если у пользователя нет разрешения, вам нужно отправить что-то еще, например отображать только отдельные страницы и отправлять их в виде изображений (дополнительная информация: stackoverflow.com/questions/4930914/, kbdeveloper.qoppa.com/)   -  person Thomas    schedule 13.03.2019


Ответы (1)


Поскольку панель инструментов является функцией браузера, а не сервера или pdf-файла, невозможно заставить ее отображаться или нет, не уведомив каким-либо образом браузер.

И любой, кто перехватывает информацию, поступающую в браузер, действительно может изменить эту информацию.

Конечно, даже если бы вы смогли предотвратить это, они всегда могли бы загрузить PDF-файл в свою файловую систему и открыть его с помощью любого инструмента, позволяющего читать PDF-файлы, включая такие инструменты, которые они могут создать сами.

Так что нет, вы не можете заблокировать такие вещи. А зачем тебе вообще?

Самое близкое, что вы могли бы сделать, это встроить PDF в div, который загружает плагин браузера для просмотра PDF и использует запрос AJAX к серверу для извлечения содержимого PDF. Но даже в этом случае кто-то может перехватить запрос к серверу и реплицировать этот запрос, скажем, с помощью curl, и напрямую загрузить поток в файл.

person jwenting    schedule 13.03.2019
comment
Я понимаю. Но могу ли я просто отключить панель инструментов до 0 и проверить, не разрешено ли это разрешение? - person Daredevil; 13.03.2019
comment
@ Daredevil нет, этот флаг разрешения повлияет только на страницу, которую вы создали для его отображения. Это не окажет никакого влияния на стороннее средство просмотра, которое просто устанавливает этот флаг и перехватывает вывод. - person jwenting; 13.03.2019
comment
Вы правы, я мог бы легко щелкнуть тройную точку в Chrome, нажать more tools и нажать «Сохранить как», и это все равно не поможет. - person Daredevil; 13.03.2019