实施自定义授权操作检票口

时间:2012-08-26 11:29:17

标签: wicket

我想在我的网络应用中进行身份验证,当页面上发生某些操作时。例如,用户单击“添加到购物车”按钮,如果尚未进行身份验证,则显示登录页面。签到后,它返回到previos页面。 我可以在wicket中使用什么来实现它?

P.S。在产品页面上,我还链接“立即购买”,导航到带有@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>

不明白它是如何通过例外的......

2 个答案:

答案 0 :(得分:3)

我不是authroles模块的专家,所以我不确定是否可以添加另一个Action来完成你想要的任务。我会用这样的东西:

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))。

可能有一种比“手动”更好的方法,但这应该有用。

答案 1 :(得分:1)

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