Отклонение запроса на опубликованный файл для файла, который не был опубликован.Перепробовал все варианты, но не сработало - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь реализовать пример приложения, в котором все файлы javascript (JS) и CSS используют много файлов png.

Я ссылался на множество статей, но они не могли мне помочь.

Длявсе файлы png, я получаю следующую ошибку,

Пример части ошибки,

Jan 29, 2019 3:25:22 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/chartIcon.png
Jan 29, 2019 3:25:22 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/sunburst.png
Jan 29, 2019 3:25:22 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/treemap.png
Jan 29, 2019 3:25:40 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/sprite.png

Ниже приведена структура папок, которая у меня есть,

de.qsoft.manatee.web.vaadin.myapp

de.qsoft.manatee.web.vaadin.myapp.css  --> Contains all CSS files
de.qsoft.manatee.web.vaadin.myapp.fileMenu --> Contains all CSS files
de.qsoft.manatee.web.vaadin.myapp.widgets --> Contains all CSS files

de.qsoft.manatee.web.vaadin.myapp.scripts  --> contains all js files
de.qsoft.manatee.web.vaadin.myapp.widgets  --> contains all js files
de.qsoft.manatee.web.vaadin.myapp.colorpicker  --> contains all js files

SpreadJSWidget.Java

@JavaScript({
   "scripts/jquery-1.11.1.min.js",
   "scripts/jquery-ui-1.10.3.custom.min.js",
   "spreadjs_connector.js",
   "colorpicker/colorPicker.js",
   "fileMenu/fileMenu.js",
   "scripts/actionmanager.js",
   "scripts/app.js",
   "scripts/bootstrap.min.js",
   "scripts/FileSaver.min.js",
   "scripts/gc.spread.excelio.12.0.5.min.js",
   "scripts/gc.spread.sheets.all.12.0.5.min.js",
   "scripts/gc.spread.sheets.barcode.12.0.5.min.js",
   "scripts/gc.spread.sheets.charts.12.0.5.min.js",
   "scripts/gc.spread.sheets.pdf.12.0.5.min.js",
   "scripts/gc.spread.sheets.print.12.0.5.min.js",
   "scripts/gc.spread.sheets.shapes.12.0.5.min.js",
   "scripts/license.js",
   "scripts/resources.js",
   "scripts/ribbon-data.js",
   "scripts/ribbon.js",
   "scripts/sample.js",
   "scripts/spreadActions.js",
   "scripts/util.js",
   "widgets/addChartElement/chartAddChartElement.js",
   "widgets/chartColorPicker/chart-colorPicker.js",
   "widgets/chartLayoutPicker/chartLayoutPicker.js",
   "widgets/richText/richTextEditor.js"
   })


@StyleSheet({
   "colorpicker/colorPicker.css",
   "css/font-awesome/css/font-awesome.min.css",
   "css/bootstrap-theme.min.css",
   "css/bootstrap.min.css",
   "css/borderpicker.css",
   "css/colorpicker.css",
   "css/excel2013.css",
   "css/gc.spread.sheets.12.0.5.css",
   "css/gc.spread.sheets.excel2013white.12.0.5.css",
   "css/insp-slicer-format.css",
   "css/insp-table-format.css",
   "css/inspector.css",
   "css/sample.css",
   "css/shapes.css",
   "fileMenu/fileMenu.css",
   "widgets/addChartElement/chartAddChartElement.css",
   "widgets/chartColorPicker/chart-colorPicker.css",
   "widgets/chartLayoutPicker/chartLayoutPicker.css",
   "widgets/richText/richTextWithRichEditor.css",
   })



public class SpreadJSWidget extends AbstractJavaScriptExtension
{
   /**
    * 
    */
   private static final long serialVersionUID = -804316208810859887L;

   public interface ValueChangeListener extends Serializable {
      void valueChange();
   }

   ArrayList<ValueChangeListener> listeners = new ArrayList<ValueChangeListener>();

   public void addValueChangeListener(ValueChangeListener listener) {
      listeners.add(listener);
   }



   /**
    * 
    */
   public SpreadJSWidget() {
      // TODO hari: Auto-generated constructor stub
   }
   /*'***************************************************************************************
   *   Static/Inner class members                                         
   ******************************************************************************************/

   /*'***************************************************************************************
   *   Class members                                         
   ******************************************************************************************/

   public void setValue(String value) {
      getState().value = value;
   }


   @Override 
   protected void extend(AbstractClientConnector target) {
      // TODO hari: Not Yet Implemented
      super.extend(target);
   }


   public String getValue() {
      return getState().value;
   }

   @Override protected SpreadJSWidgetState getState() {
      return (SpreadJSWidgetState) super.getState();
   }

}

Iпопробовал следующий шаг за шагом, но я не смог получить ожидаемые результаты,

  1. Я сохранил все файлы png в каталоге "de.qsoft.manatee.web.vaadin.myapp.css"as" de.qsoft.manatee.web.vaadin.myapp.css.images "

  2. В папке VAADIN я скопировал все файлы png как" VAADIN / css / images / "

  3. В папке VAADIN, например, "VAADIN / themes / mytheme / img / css / images"

  4. В папке VAADIN, например "VAADIN / themes /mytheme / layouts / css / images "

    @ Theme (" mytheme ") открытый класс MyUI расширяет пользовательский интерфейс {

    @Override
    protected void init(VaadinRequest vaadinRequest) {
    
    SpreadWidget widget = new SpreadWidget();
    setContent(widget);
    
    
    }
    
    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
    

    }

Пожалуйстапозволь мне познатьГде я должен положить все файлы PNG.Каждый файл CSS ссылается на файл изображения как

http://localhost:8080/spreadjs/APP/PUBLISHED/css/images/AllShapes.png

1 Ответ

0 голосов
/ 30 января 2019

То, что здесь происходит, вызвано функцией безопасности.Поскольку в этом случае файлы обслуживаются непосредственно из пути к классам, Ваадин принимает некоторые меры предосторожности, чтобы предотвратить случайную публикацию других вещей из пути к классам, например, что-то вроде DatabaseConnection.java, которое может содержать конфиденциальные пароли.

По этой причине,доступны только файлы, которые явно опубликованы с использованием аннотаций @StyleSheet, @JavaScript или @HtmlImport.Поскольку нет никакой соответствующей аннотации для, например, css/images/AllShapes.png, сервер игнорирует эти запросы.

Мне известны несколько возможных обходных путей в этом случае, но ни один из них не является действительно элегантным:

  1. Поместите изображения, например, VAADIN/css/images и обновите CSS, чтобы использовать соответствующее количество ../ сегментов, чтобы исключить часть /APP/PUBLISHED/ URL.Таким образом, URL в CSS будет выглядеть примерно так: ../../VAADIN/css/images.AllShapes.png.
  2. Поместите CSS вместе с изображениями в VAADIN/.Таким образом, вам не нужно изменять URL-адреса, относящиеся к изображениям, но вместо этого вам нужно вручную загружать CSS, а не полагаться на удобную аннотацию @StyleSheet.В этом случае я бы рекомендовал использовать что-то вроде ui.getPage().getStyles().add(new ThemeResource("../../css/name.css"));.Часть ../../ предназначена для отмены themes/mytheme/, которая будет автоматически использоваться для ресурса темы.Это можно сделать, например, методом attach() (просто не забудьте также вызвать super.attach()).Желательно также добавить некоторую логику, которая добавляет зависимость, только если это еще не было сделано ранее для того же экземпляра пользовательского интерфейса.
  3. Используйте внутренний метод LegacyCommunicationManager.registerDependency, чтобы также зарегистрировать изображения, которые будут доступны непосредственно изпуть к классамВы можете найти экземпляр для LegacyCommunicationManager, используя vaadinSession.getCommunicationManager().

В качестве не связанной заметки, я бы порекомендовал объединить различные скрипты и CSS-файлы в один файл каждого типа.Причина этого заключается в том, что загрузка большого количества небольших файлов по HTTP приводит к некоторому снижению производительности, которого можно избежать, связывая файлы вместе.

...