0

当页面上发生某些操作时,我想在我的网络应用程序中进行身份验证。例如,用户单击“添加到购物车”按钮,如果他尚未通过身份验证,则会显示登录页面。登录后返回到上一页。我可以在检票口中使用什么来实现这一点?

PS 在产品页面上,我还链接了“立即购买”,它导航到带有 @AuthorizeInstantiation("USER") 注释的购买页面。这个链接工作得很好。

我认为 MetaDataRoleAuthorizationStrategy 可以用来在“添加到购物车”上做同样的事情。但可用的操作只有 ENABLE 和 RENDER。我可以将自己的 Action 添加到组件中,但是如何将 Action 与组件的 onClick() 方法相关联?

---已编辑---

不知道在哪里写,所以我编辑了帖子。我尝试了 Christoph Leiter 的解决方案:

add(link = new AjaxFallbackLink("add2cart") {
 @Override
  public void onClick(AjaxRequestTarget target) {
   if (!CynephoneSession.get().isSignedIn()) {
    throw new RestartResponseAtInterceptPageException(SignIn.class);
   }
   user.addItem(item.copy());
   target.add(cartPanel);
  }
});

但是在我以某种方式单击此链接后,我在 Firefox 中看到了带有更新的 cartPanel 的 ajax 响应。我的意思是它向我显示带有源代码的页面:

<?xml version="1.0" encoding="UTF-8"?><ajax-response><component id="cart2" ><![CDATA[<div class="cart" wicket:id="cart" id="cart2">
<span wicket:id="total">11 800</span> <img src="./resource/top.Top/img/rouble-ver-1346040298957.gif"/><br/>
<img src="./resource/top.Top/img/good-ver-1346040298926.gif"/>х<span wicket:id="quantity">2</span>
</div>]]></component></ajax-response>

不明白它是如何通过异常...

4

2 回答 2

3

我不是 authroles 模块的专家,所以我不确定是否可以添加另一个动作来完成你想要的。我会使用类似的东西:

new AjaxLink<Product>("addToCart", product) {
    @Override
    public void onClick(AjaxRequestTarget target) {
        if (!AbstractAuthenticatedWebSession.get().isSignedIn()) {
            // code to remember product to add to cart in session
            throw new RestartResponseAtInterceptPageException(LoginPage.class);
        }
        // continue normally
    }
};

在您的LoginPage/Session中,您应该检查会话中是否有产品在用户成功通过身份验证时应该添加到购物车中。然后调用continueToOriginalDestination以便 Wicket 显示上一页(或setResponsePage(CartPage.class))。

可能有比“手动”执行此操作更好的方法,但这应该有效。

于 2012-08-26T15:03:07.037 回答
1

您还应该看一下 SimplePageAuthorizationStrategy 类。此类已经检查了用户在请求特定页面类时是否已签名,如果他未登录,它会自动将他重定向到登录页面。
我还将使用 PageParameters 将我们必须添加到的产品的 ID 传递给 CartPage大车。通过这种方式,您可以避免将所选产品存储到会话中并在用户成功登录后检索它。

于 2012-08-26T17:57:58.523 回答