当前位置: 首页 > 面试题库 >

使用Vaadin的Spring Boot时的404 for js文件

袁霍英
2023-03-14
问题内容

在带有springboot的vaadin项目中使用spring security时遇到问题
。因此,我正在使用PdfViewer插件来显示PDF文件。但是我收到
以下错误消息:

error:"Not Found"
message:"No message available"
path:"/APP/PUBLISHED/pdf.worker.js"
status:404

and my spring security configuration looks like this:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .headers()
                .defaultsDisabled()
                .frameOptions().sameOrigin().and()
                .csrf().disable() // Use Vaadin's CSRF protection
                .authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/vaadinServlet/HEARTBEAT/**").permitAll()
                .antMatchers("/vaadinServlet/UIDL/**").permitAll()
                .antMatchers("/vaadinServlet/APP/PUBLISHED/**").permitAll()
                .antMatchers("login?debug").permitAll()
                .antMatchers("/#!pwdreset/*").permitAll()
                .antMatchers("/pwdreset/*").permitAll()
                .and()
                .authorizeRequests()
                .and()
                .formLogin().loginPage("/#!login").permitAll()
                .and()
                .logout().logoutUrl("/#!login?logout").logoutSuccessUrl("/").permitAll().and()
                .sessionManagement().sessionFixation().newSession();

    }

@Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**", "/VAADIN/**");
    }

So checking the loaded files in Chrome I see a folder
/vaadinServlet/APP/PUBLISHED/ and there are all the files needed.

Using the Addon without Spring Security works fine, so anyone any idea?

Update

It doesn’t seem to be related to spring security, because I get a similar
behavior while testing the Addon in a new simple project. It seems to be a
problem with spring boot.

To reproduce this issue you need (full project for
download):

  • basic spring boot + vaadin app skeleton
  • simple PDF and under /webapp/files
  • PdfViewer add-on in your pom and widgetset compiled
  • the below simple UI
    @Theme("mytheme")
    @SpringUI
    @Widgetset("org.test.AppWidgetSet")
    public class MyUI extends UI {
        @Override
        protected void init(VaadinRequest vaadinRequest) {
            final VerticalLayout layout = new VerticalLayout();
            String basepath = VaadinService.getCurrent().getBaseDirectory().getAbsolutePath();
            File file = new File(basepath.concat("/files/test.pdf"));
            if (file.exists()) {
                PdfViewer pdfViewer = new PdfViewer(file);
                Label info = new Label("File was found!");
                layout.addComponents(info, pdfViewer);
            } else {
                Label info = new Label("no file found!");
                layout.addComponent(info);
            }
            setContent(layout);
        }
    }
  • 打开Chrome浏览器和开发者工具并Network选择标签,访问该应用,您应该会看到一个pdf.worker.js失败请求。

问题答案:

TL; DR; 版:

正在pdf.js下载触发第二个请求pdf.worker.js,但它/vaadinServlet/APP/PUBLISHED/pdf.worker.js
与自动配置处理的路径不匹配VaadinServlet,只是/APP/PUBLISHED/pdf.worker.js

我能想到的最简单的解决方案是
将请求转发到
的控制器VaadinServlet:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class PdfJsRedirectController {
    private static final String WORKER_JS_INCORRECT_PATH = "/APP/PUBLISHED/pdf.worker.js";
    private static final String WORKER_JS_CORRECT_FORWARD_PATH = "forward:/vaadinServlet/APP/PUBLISHED/pdf.worker.js";

    @RequestMapping(value = WORKER_JS_INCORRECT_PATH)
    public String forwardWorkerJsRequestToVaadin() {
        return WORKER_JS_CORRECT_FORWARD_PATH;
    }
}

详细版本:

因此,我花了一些时间对此进行调试,结果发现这
是不幸的配置的组合:

  • Spring Dispatcher Servlet侦听
  • vaadin spring servlet侦听
  • pdf.js错误修正/解决方法

发生的是,spring注册了的DispatcherServlet投放请求
/。VaadinVaadinSpringServlet为/vaadinServlet/
&/VAADIN路径注册a :

ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
ServletRegistrationBean  : Mapping servlet: 'springVaadinServlet' to [/vaadinServlet/*, /VAADIN/*]

为了与调度程序servlet共存并能够在
“ / *”上处理请求,Vaadin还为UI路径注册了转发控制器。对于
例如要求在/MyUI将被转发到/vaadinServlet/MyUI(见
的VaadinServletConfiguration

获得更多的细节)。

到目前为止,一切正常,您应该没有任何问题。就像
您说的那样,看着chrome开发工具,所有js文件都在那里,
那怎么了?如果您在访问
应用程序时查看closley的请求,您会发现实际上有2个请求pdf.worker.js-
第一个成功,而给您404的请求:

pdf.worker.js请求

Initiator失败呼叫的列实际上是 ,如果您设置了断点,您实际上可以看到在中定义的那个值。您可能需要 水平滚动一点才能看到代码,所以我在 下面进行了格式化:

pdf.js:2344
and if you set a breakpoint you can actually see that
workerSrc=/APP/PUBLISHED/pdf.worker.js, value which is defined in
pl.pdfviewer.client.ui.PdfViewer.java. You may have
to scroll horizontally a bit to be able to see the code, so I’ve formatted it
below:

public native void loadResourcePdf(String fileName, VPdfViewer instance)/*-{
    var pdfviewer = instance.@pl.pdfviewer.client.ui.VPdfViewer::jsObject;
    pdfviewer.work = false;
    if ((pdfviewer.fileName == null || pdfviewer.fileName != fileName) && fileName != null) {
        $wnd.PDFJS.disableStream = true;
======> $wnd.PDFJS.workerSrc = 'APP/PUBLISHED/pdf.worker.js';
        $wnd.PDFJS.getDocument(fileName).then(function (pdf) {
            pdfviewer.pdfFile = pdf;
            pdfviewer.fileName = fileName;
            pdfviewer.pageCount = pdf.numPages;
            if (pdfviewer.pageNumber == 0 && pdf.numPages > 0) {
                pdfviewer.pageNumber = 1;
            }
            pdfviewer.showPdfPage(pdfviewer.pageNumber);
        });
    }

}-*/;

在常规的Vaadin环境中,/APP/PUBLISHED/pdf.worker.js可以直接使用,但是我们现在有了一个稍微改动的环境,因此我们需要进行一些调整。最重要的是,我们可以对Vaadin自动配置使用类似的方法,然后将/APP/PUBLISHED/pdf.worker.js
请求重定向到/vaadinServlet/APP/PUBLISHED/pdf.worker.js,最终解决该问题。为了简洁起见,可以在本文
开头看到重定向控制器。



 类似资料:
  • 我正在尝试将vaadin与spring(没有Spring Boot)和基于java注释的spring部分配置结合起来。 自动连接似乎适用于vaadin ui部分,但不适用于“自定义ui类”(例如,“公共类LoginScreen扩展自定义组件”)。我在SysOut上得到一个NPE或一个空对象。 此外,我注意到“@ComponentScan(base Packages={"net.myapp"})”没

  • 我已经重建了vaadin webapp,并删除了任何Spring功能。我的网络应用程序现在是非基于Spring的应用程序的GreetService入门下载。 该应用程序在tomcat 9.0应用服务器上运行,在tomcat_HOME/conf/web中具有以下配置。用于目录列表的xml。 申请中没有其他web.xml。 我包括一个空的index.html在两个文件夹亚历杭德罗建议,只是把一个简单的

  • 我尝试将Spring Boot与HikariDataSource配合使用,但出现了错误。断管怎么配置比较好还是用c3p0比较好?我正在使用这个配置 我使用: 和 springboot 版本 1.4.2.RELEASE

  • 本文向大家介绍vaadin 使用Maven创建Vaadin项目,包括了vaadin 使用Maven创建Vaadin项目的使用技巧和注意事项,需要的朋友参考一下 示例 使用Maven,您可以创建具有vaadin-archetype-application原型的Vaadin项目。您也可以在IDE中添加该原型,以使用IDE创建Maven项目。 一旦执行了以上命令,您将具有以下项目结构。 创建的默认Mav

  • 我试图上传多个文件使用Spring mvc 4,Spring引导和thymeleaf作为模板引擎,但我无法访问上传的文件,文件被处理为一个多部分文件与内容类型的应用程序/octet-stream. 以及控制器代码: sysout的输出: 上传图像长度:1(即使我上传了多个文件) 文件原始名称(使用getOrialFileName): 文件名(使用getName):文件[] 文件大小: 0 文件内容

  • 使用Eclipse2018_09和Vaadin8的im。我只是直接创建了一个干净的Vaadin项目“MyApplication”。当我创建一个Vaadin设计器文件“testdesigne.html”并尝试打开它时,设计器崩溃,文件将被关闭。它首先尝试加载视图,并在5秒后崩溃。 当我打开Eclipse错误日志视图时,我可以看到以下2个问题: 从插件调用代码时出现问题:“org.eclipse.ui