Wicket 9:使用 JavaScriptFilteredIntoFooterHeaderResponse 似乎会导致 renderHead 出现问题
Wicket 9: usage of JavaScriptFilteredIntoFooterHeaderResponse seems to cause trouble with renderHead
我通过包含 wicket-spring-boot-starter 3.0.4 来使用 Wicket 9。
在我的demo工程中,需要在<body>
的末尾加上JavaScript。所以我遵循了https://ci.apache.org/projects/wicket/guide/9.x/single.html#_put_javascript_inside_page_body
中的解释
我还在我的页面中通过 Component#renderHead(IHeaderReponse)
的实现添加了资源(CSS 和 JS)。
Wicket 8(来自 wicket-spring-boot-starter 2.1.9)一切正常。
使用 Wicket 9,为了制作我的应用 运行,我首先将 webApplication.getCspSettings().blocking().disabled();
放入 WicketApplicationInitConfiguration#init(WebApplication)
。我的应用程序启动了,但生成的页面不包含 <head>
部分,因此该应用程序因缺少资源而无法运行。
为了使 <head>
元素与所有引用一起出现在我的页面中,我注释掉了所有引用 <body>
中呈现 JavaScript 的代码。
但是我的应用程序不适用于此“解决方法”。
我是不是做错了什么?
@ApplicationInitExtension
public class DemoWicketInitializer implements WicketApplicationInitConfiguration {
@Override
public void init(WebApplication webApplication) {
webApplication.getCspSettings().blocking().disabled();
webApplication.getHeaderResponseDecorators().add(response -> new ResourceAggregator(
new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts")));
webApplication.getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
}
}
@WicketHomePage
public class MyPage extends WebPage {
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(JavaScriptHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.js"));
response.render(JavaScriptHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.js"));
// this piece of JS has to appear in <body>. ################################
response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(getClass(),
"js/demoMapbox.js")));
response.render(CssHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.css"));
response.render(CssHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.css"));
}
public MyPage(PageParameters parameters) {
// some components
add(new HeaderResponseContainer("scriptBlock", "scripts"));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org" lang="de">
<head>
</head>
<body>
<h1>Wicket und Mapbox</h1>
<div id="ndsmap" style="width: 800px; height: 500px"></div>
<a href="#" wicket:id="sendPostDrawingAction">als POST</a><br>
<h4>Zeichnung als GeoJSON</h4>
<p wicket:id="drawingJson"></p>
<h4>Polygone WGS84</h4>
<p wicket:id="geoWGS84"></p>
<h4>Polygone UTM32N</h4>
<p wicket:id="geoUTM32N"></p>
<wicket:container wicket:id="scriptBlock"/>
</body>
</html>
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoWicketMapboxApplication.class);
}
}
看起来 CSP 机制正在干扰 JavaScriptFilteredIntoFooterHeaderResponse。我将在 JIRA 上打开一个关于这个的问题。同时,作为解决方法,您可以使用 setHeaderResponseDecorator(已弃用)代替 getHeaderResponseDecorators:
setHeaderResponseDecorator(response -> new ResourceAggregator(
new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts")));
这应该能让您的应用正常运行。
更新
as pointed out on jira 这不是错误。由于现在我们已经使用 CSP 默认添加了 ResourceAggregator,要添加进一步的响应装饰器,我们应该执行以下操作:
getHeaderResponseDecorators().add(response ->
new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts"));
我们将相应地更新 Wicket 9.x 及其迁移指南的文档。
我通过包含 wicket-spring-boot-starter 3.0.4 来使用 Wicket 9。
在我的demo工程中,需要在<body>
的末尾加上JavaScript。所以我遵循了https://ci.apache.org/projects/wicket/guide/9.x/single.html#_put_javascript_inside_page_body
我还在我的页面中通过 Component#renderHead(IHeaderReponse)
的实现添加了资源(CSS 和 JS)。
Wicket 8(来自 wicket-spring-boot-starter 2.1.9)一切正常。
使用 Wicket 9,为了制作我的应用 运行,我首先将 webApplication.getCspSettings().blocking().disabled();
放入 WicketApplicationInitConfiguration#init(WebApplication)
。我的应用程序启动了,但生成的页面不包含 <head>
部分,因此该应用程序因缺少资源而无法运行。
为了使 <head>
元素与所有引用一起出现在我的页面中,我注释掉了所有引用 <body>
中呈现 JavaScript 的代码。
但是我的应用程序不适用于此“解决方法”。
我是不是做错了什么?
@ApplicationInitExtension
public class DemoWicketInitializer implements WicketApplicationInitConfiguration {
@Override
public void init(WebApplication webApplication) {
webApplication.getCspSettings().blocking().disabled();
webApplication.getHeaderResponseDecorators().add(response -> new ResourceAggregator(
new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts")));
webApplication.getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
}
}
@WicketHomePage
public class MyPage extends WebPage {
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(JavaScriptHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.js"));
response.render(JavaScriptHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.js"));
// this piece of JS has to appear in <body>. ################################
response.render(JavaScriptHeaderItem.forReference(new PackageResourceReference(getClass(),
"js/demoMapbox.js")));
response.render(CssHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.css"));
response.render(CssHeaderItem.forUrl(
"https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.css"));
}
public MyPage(PageParameters parameters) {
// some components
add(new HeaderResponseContainer("scriptBlock", "scripts"));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org" lang="de">
<head>
</head>
<body>
<h1>Wicket und Mapbox</h1>
<div id="ndsmap" style="width: 800px; height: 500px"></div>
<a href="#" wicket:id="sendPostDrawingAction">als POST</a><br>
<h4>Zeichnung als GeoJSON</h4>
<p wicket:id="drawingJson"></p>
<h4>Polygone WGS84</h4>
<p wicket:id="geoWGS84"></p>
<h4>Polygone UTM32N</h4>
<p wicket:id="geoUTM32N"></p>
<wicket:container wicket:id="scriptBlock"/>
</body>
</html>
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoWicketMapboxApplication.class);
}
}
看起来 CSP 机制正在干扰 JavaScriptFilteredIntoFooterHeaderResponse。我将在 JIRA 上打开一个关于这个的问题。同时,作为解决方法,您可以使用 setHeaderResponseDecorator(已弃用)代替 getHeaderResponseDecorators:
setHeaderResponseDecorator(response -> new ResourceAggregator(
new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts")));
这应该能让您的应用正常运行。
更新
as pointed out on jira 这不是错误。由于现在我们已经使用 CSP 默认添加了 ResourceAggregator,要添加进一步的响应装饰器,我们应该执行以下操作:
getHeaderResponseDecorators().add(response ->
new JavaScriptFilteredIntoFooterHeaderResponse(response, "scripts"));
我们将相应地更新 Wicket 9.x 及其迁移指南的文档。