我有这样的问题。
我需要在收到404 HTTP错误时显示自定义错误页面。我正在使用Wicket 1.4和Tomcat6。我在web.xml中实现了这些东西,比如
<filter-name>wicket.filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/404</location>
</error-page>
并在我的WebApplication中放置此类代码:
mount(new HybridUrlCodingStrategy("/404", PageNotFound.class));
PageNotFound类isErrorPage设置为true,isVersioned为false和
@Override
protected void configureResponse() {
super.configureResponse();
getWebRequestCycle().getWebResponse().getHttpServletResponse().setStatus(HttpServletResponse.SC_NOT_FOUND);
}
现在的问题是,当我输入一些无效的网址时,如http://localhost:8080/myApp-war/invalidUrl
,我可以看到我的PageNotFound。
但是当我输入类似http://localhost:8080/myApp-war/?wicket:bookmarkablePage=:com.mypackage.invalidUrl
的内容时,我只是在没有任何数据的情况下获得空白页面。
我注意到,在第一种情况下,tomcat只显示“ HTTP状态404 - / myApp-war / invalidUrl ” 在另一种情况下,它显示略有不同的消息:“ HTTP状态404 - 无法加载可收藏的页面”
如何使这两个案例显示相同的页面?也许这个<error-page>
标签需要修改?如果您需要,我会为您提供更多信息。
答案 0 :(得分:1)
您的代码和期望是完美的。它只是一个Wicket bug或Tomcat对404 Exception的错误理解。我想它只是在1.4.x版之前的Wicket中。
修复是覆盖 AbstractRequestCycleProcessor 中的代码,您只能在WebApplication类的工厂方法中覆盖它:
@Override
protected IRequestCycleProcessor newRequestCycleProcessor() {
return new WebRequestCycleProcessor() {
@Override
protected IRequestTarget resolveBookmarkablePage(final RequestCycle requestCycle,
final RequestParameters requestParameters) {
IRequestTarget target = super.resolveBookmarkablePage(requestCycle, requestParameters);
if(target == null) {
return target;
}
if(target instanceof WebErrorCodeResponseTarget) {
WebErrorCodeResponseTarget errorResponse = (WebErrorCodeResponseTarget) target;
if(HttpServletResponse.SC_NOT_FOUND == errorResponse.getErrorCode()) {
return null;
}
}
return target;
}
};
}
我将完整的工作示例放入我的Wicket14测试库https://repo.twinstone.org/projects/WISTF/repos/wicket-examples-1.4/browse