使用带有vaadin的spring boot时,java-404用于js文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用带有vaadin的spring boot时,java-404用于js文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5021字,纯文字阅读大概需要8分钟。
内容图文
在使用spring-boot的vaadin项目中使用spring security时遇到问题.所以我使用PdfViewer Addon来显示PDF文件.但是我收到以下错误消息:
error:"Not Found"
message:"No message available"
path:"/APP/PUBLISHED/pdf.worker.js"
status:404
我的spring安全配置如下所示:
@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/**");
}
因此,检查Chrome中加载的文件我看到一个文件夹/ vaadinServlet / APP / PUBLISHED /并且需要所有文件.
使用没有Spring Security的Addon工作正常,所以任何人都有任何想法吗?
更新
它似乎与spring安全性无关,因为我在一个新的简单项目中测试Addon时会遇到类似的行为.这似乎是春季靴子的问题.
要重现此问题,您需要(full project for download):
>基本的春季启动vaadin app骨架
>简单的PDF和under / webapp /文件
> PdfViewer add-on在您的pom和widgetset中编译
>以下简单的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);
}
}
> open chrome&选择了“网络”选项卡的开发人员工具,访问该应用程序,您应该看到一个pdf.worker.js请求失败.
解决方法:
TL; DR;版:
pdf.js正在触发第二个请求以下载pdf.worker.js,但它与自动配置的VaadinServlet处理的路径/vaadinServlet/APP/PUBLISHED/pdf.worker.js不匹配,它只是/ APP /出版/ pdf.worker.js.
我能提出的最简单的解决方案是一个控制器,它向VaadinServlet请求forwards:
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 listen
> vaadin春天servlet听
>一个pdf.js bugfix / woraround
会发生什么,spring注册一个DispatcherServlet,为/ *提供请求.并且Vaadin为/ vaadinServlet / *&注册了一个VaadinSpringServlet. / VAADIN路径:
ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
ServletRegistrationBean : Mapping servlet: 'springVaadinServlet' to [/vaadinServlet/*, /VAADIN/*]
为了与调度程序servlet共存并且能够在“/ *”上提供请求,Vaadin还为UI路径注册转发控制器.例如,/ MyUI上的请求将被转发到/ vaadinServlet / MyUI(有关详细信息,请参阅VaadinServletConfiguration sources).
到目前为止一切正常,你不应该有任何问题.就像你说的那样,看看chrome dev-tools所有的js文件都在那里,那有什么不对?如果你看看访问你的应用程序时提出的请求,你会注意到实际上有2个pdf.worker.js请求 – 第一个成功的请求,以及给你404的请求:
失败的调用的Initiator列实际上是pdf.js:2344,如果设置断点,您实际上可以看到workerSrc = / APP / PUBLISHED / pdf.worker.js,这是在pl.pdfviewer.client.ui.PdfViewer.java中定义的值.您可能需要水平滚动有点能够看到代码,所以我把它格式化如下:
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 boot时,java-404用于js文件全部内容,希望文章能够帮你解决使用带有vaadin的spring boot时,java-404用于js文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。