- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们在使用 Wicket 6(即版本 6.22.0)时遇到了问题。看起来这就是这里修复的内容:https://issues.apache.org/jira/browse/WICKET-5068简而言之:页面过期后,Wicket 尝试通过调用以页面类和 PageParameters
作为参数的构造函数来重建它,但 PageParameters
(错误地)为空,即使一些参数随请求一起发送。
After Wicket session timeout - pageParameters are null似乎与同一个问题有关。
WICKET-5068 已修复 Wicket 7,但我们有 Wicket 6,我们需要对其进行修复。
以下是对我们的发现和一些问题的详细解释。
发生的情况是这样的:
用户返回到初始浏览器选项卡并单击链接。这是链接的代码:
AjaxLink<Void> link = new AjaxLink<Void>("link") {
@Override
public void onClick(AjaxRequestTarget target) {
showWindow(dataModel, window, target);
}
};
add(link);
当 BookmarkableMapper
根据请求构建 IRequestHandler
时,会调用以下方法 (AbstractBookmarkableMapper:294):
protected PageParameters getPageParametersForListener(PageInfo pageInfo, PageParameters pageParameters)
{
if (pageInfo.getPageId() != null)
{
// WICKET-4594 - ignore the parsed parameters for stateful pages
return null;
}
return pageParameters;
}
因此,根据请求构建的 ListenerInterfaceRequestHandler
的 PageParameters
为 null
。
Wicket 开始处理点击。它尝试恢复被单击的链接所属的页面,这是通过以下方法完成的(PageProvider,从第 252 行开始):
private void resolvePageInstance(Integer pageId, Class<? extends IRequestablePage> pageClass,
PageParameters pageParameters, Integer renderCount)
{
IRequestablePage page = null;
boolean freshCreated = false;
if (pageId != null)
{
page = getStoredPage(pageId);
}
if (page == null)
{
if (pageClass != null)
{
page = getPageSource().newPageInstance(pageClass, pageParameters);
freshCreated = true;
}
}
if (page != null && !freshCreated)
{
if (renderCount != null && page.getRenderCount() != renderCount)
{
throw new StalePageException(page);
}
}
pageInstanceIsFresh = freshCreated;
pageInstance = page;
}
当页面从页面存储中逐出时,以下语句的条件成立:
if (page == null)
因此它尝试从类和页面参数创建页面实例:
page = getPageSource().newPageInstance(pageClass, pageParameters);
但是 pageParameters
在这里是 null
(因为第 5 项中的 getPageParametersForListener()
)。因此页面构造函数得到空的 PageParameters
并失败,因为它需要一些 id。
以下是从页面构造函数中的 PageParameters
中提取 id 的代码:
pageParameters.get("id").toLong()
这是生成的异常(仅显示顶行,因为其余行不相关):
org.apache.wicket.util.string.StringValueConversionException: Unable to convert 'null' to a long value
at org.apache.wicket.util.string.StringValue.toLong(StringValue.java:664)
因此,在我们的例子中,getPageParametersForListener()
方法破坏了恢复过期页面处理的可能性。
为了解决这个问题,我们用自定义实现替换了 BookmarkableMapper
:
public class BookmarkableMapperThatSavesPageParametersForListener extends BookmarkableMapper {
@Override
protected PageParameters getPageParametersForListener(PageInfo pageInfo, PageParameters pageParameters) {
return pageParameters;
}
}
我们在WebApplication#init()
方法中挂载:
mount(new BookmarkableMapperThatSavesPageParametersForListener());
它似乎解决了我们面临的问题:链接点击不会触发处理程序(onClick()
方法),但至少页面不会爆炸,只是自行刷新。
问题是:
最佳答案
这是 Wicket 6.x 的限制,已在 7.x 中实现。6.x 没有进行此更改,因为我们不确定它是否不会默默地破坏某人的应用程序。IIRC 如果升级期间需要,可以重写 7.x 中的方法以恢复到旧的行为。AFAIK 没有人提示 7.x 中的这一变化,所以我想将其向后移植到 6.x (6.27.0) 是可以的,但是 Wicket 的活跃开发人员不再使用 6.x,而且有人这样做的机会是相当低。建议您升级到7.x。它很稳定,有许多新功能和错误修复。在那之前,我猜您的选择是使用此请求映射器的自定义版本。
关于java - Wicket 口 6 : empty PageParameters when recreating a page after expiration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751254/
我的 Twilio 可编程视频控制台定期收到此警告。它似乎并没有影响我的视频 session ,但是因为,好吧,我有点强制症,我想知道如何让这个警告消失。 在房间进行时是否有规定的刷新 token 的
在 stackoverflow 中搜索后,我了解了如何使用 session 过期。感谢计算器! 代码是: session_start();// Starting Session // Storing
我正在尝试遵循 aws s3 cp 的 AWS 文档, 其中 documents the --expires flag作为: --expires (string) The date and time
我正在尝试缓存控制所有静态 css/js 文件。代码看起来像: @Override public void addResourceHandlers(ResourceHandlerRegis
我正在使用 Spring Security 3.0.2 基于表单的身份验证。但我不知道如何配置它,以便在 session 过期时请求不会重定向到其他页面(过期 url)或显示“ session 过期”
我对基于 token 的授权相当陌生。我正在尝试找出自定义过期/ token 刷新方案中的缺陷。 我在 Express API 中有一个基本的 JWT 身份验证设置;我将 JWT 过期时间设置为 1
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
在 android 应用程序中,当使用 DefaultHttpClient 获取 URL 内容(执行 HttpGet)时,我在日志中收到以下警告: W/ResponseProcessCookies(2
这与 DST Root CA X3 Expiration (September 2021) 有关 当在线搜索修复程序以应用于旧服务器(在我的情况下为 Debian 8)时,该服务器确实调用了使用 le
我很难弄明白这一点。我想在 paypal 中创建一个永远不会结束的月度订阅,除非用户取消它。每次订阅运行时,我都希望它调用我的 IPN url。 下面是我正在使用的: 请注意,我删除了 IPN ur
对于下面的 block ,生命周期'b和'c什么时候结束? use core::ops::Deref; #[derive(Debug)] struct A { child_b: &'b T,
我正在尝试为我的网站设置 cookie。我正在使用: ServletActionContext.getResponse().addCookie(); Cookie maxAge 设置为“2592000
我正在尝试编写一个 HOC,在一段时间后将其状态属性 visible 更改为 false。 这是我到目前为止所得到的: const withExpire = (WrappedComponent) =>
在我的 WordPress 网站上,我有数千个过期交易的帖子。它们都属于已存档类别。我正在寻找一个 Mysql 查询或 php 程序,它将在所有标题(存档帖子)前面插入字符串“EXPIRED”。我很感
我为 HTML 和 CSS 制作了一个日历,但我没有足够的 JS(或 jQuery),所以在一定时间后,日期会变得不活动。所有不活动的按钮(带日期)都有“过期”类,我有必要在每天过期后,将“过期”类添
我正在使用 tymondesigns/jwt-auth我的应用程序包,但一段时间后显示 token expired 消息。我已经设置了 'ttl' => null 并删除了 exp 但它没有用。 这是
我正在使用 axios 向 diro 发送请求使用端点 /user/create 创建用户. 但是,我不断收到这样的错误: Error response: { Error: certificate h
尝试使用 Mechanize 从 https asp 站点上抓取一些内容,看起来好像登录页面提交有效,因为我返回了 200。但是当我尝试打开一个可能使用登录后捕获的 cookie 的 url 时,我重
我正在使用以下命令创建 keystore : keytool -genkey -keystore myStore.keystore -keyalg RSA -keysize 1024 -alias m
使用这行代码时,我不断收到错误消息,我试图让 cookie“myCookie”在凌晨 12:00 过期。 但我不确定为什么我无法做到这一点。 这些是错误: 如果我用这个, Response.Cooki
我是一名优秀的程序员,十分优秀!