实现自定义授权操作wicket

实现自定义授权操作wicket,wicket,Wicket,当页面上发生某些操作时,我想在我的web应用程序中进行身份验证。例如,用户单击按钮“添加到购物车”,如果他尚未通过身份验证,则显示登录页面。登录后返回previos页面。 我可以在wicket中使用什么来实现这一点 另外,在产品页面上,我还有一个链接“buy now”,它导航到带有@AuthorizationInstantiation(“用户”)注释的购买页面。这个链接工作得很好 我认为MetadataRoleAuthorization策略也可以用于“添加到购物车”上。但可用操作仅为启用和渲染。

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

另外,在产品页面上,我还有一个链接“buy now”,它导航到带有@AuthorizationInstantiation(“用户”)注释的购买页面。这个链接工作得很好

我认为MetadataRoleAuthorization策略也可以用于“添加到购物车”上。但可用操作仅为启用和渲染。我可以将自己的操作添加到组件中,但如何将操作与组件的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>

11800
х2 ]]>

不明白它是如何传递异常的…

我不是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
    }
};
新AjaxLink(“addToCart”,产品){
@凌驾
公共void onClick(AjaxRequestTarget目标){
如果(!AbstractAuthenticatedWebSession.get().isSignedIn()){
//用于在会话中记住要添加到购物车的产品的代码
抛出新的RestartResponseAtInterceptPageException(LoginPage.class);
}
//正常继续
}
};
登录页面
/
会话
中,您应该检查会话中是否有产品应在用户成功通过身份验证后添加到购物车中。然后调用
continuetooriginaldestation
,以便Wicket显示上一页(或
setResponsePage(CartPage.class)


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

我不是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
    }
};
新AjaxLink(“addToCart”,产品){
@凌驾
公共void onClick(AjaxRequestTarget目标){
如果(!AbstractAuthenticatedWebSession.get().isSignedIn()){
//用于在会话中记住要添加到购物车的产品的代码
抛出新的RestartResponseAtInterceptPageException(LoginPage.class);
}
//正常继续
}
};
登录页面
/
会话
中,您应该检查会话中是否有产品应在用户成功通过身份验证后添加到购物车中。然后调用
continuetooriginaldestation
,以便Wicket显示上一页(或
setResponsePage(CartPage.class)


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

您还应该看看类SimplePageAuthorizationStrategy。该类已检查用户在请求特定页面类时是否已签名,如果用户未登录,该类会自动将其重定向到登录页面。

我还将使用PageParameters向CartPage传递我们必须添加到购物车的产品id。通过这种方式,您可以避免将所选产品存储到会话中,并在用户成功登录后检索它。

您还应该了解SimplePageAuthorizationStrategy类。该类已检查用户在请求特定页面类时是否已签名,如果用户未登录,该类会自动将其重定向到登录页面。

我还将使用PageParameters向CartPage传递我们必须添加到购物车的产品id。通过这种方式,您可以避免将所选产品存储到会话中,并在用户成功登录后检索它。

谢谢!我以前没有调查过wicket异常。现在我明白了,这是控制执行流的另一种方法。我尝试了这个方法,出现了奇怪的结果。我把它添加到head中。你能试着用调试器一步一步地检查一下到底发生了什么吗?如果抛出异常,我不知道如何执行此代码。我现在运行调试。看起来wicket非常聪明,continueToOriginalDestination将其移动到previos页面并单击按钮。这对我来说是个好消息-不需要记住produst。我将尝试进一步了解此异常的工作原理。谢谢!我以前没有调查过wicket异常。现在我明白了,这是控制执行流的另一种方法。我尝试了这个方法,出现了奇怪的结果。我把它添加到head中。你能试着用调试器一步一步地检查一下到底发生了什么吗?如果抛出异常,我不知道如何执行此代码。我现在运行调试。看起来wicket非常聪明,continueToOriginalDestination将其移动到previos页面并单击按钮。这对我来说是个好消息-不需要记住produst。我将尝试进一步了解此异常的工作原理。谢谢!但我有cartPanel,它已经在我的页面上实例化了。所以,若用户单击“添加到购物车”,并且他已经通过了身份验证,那个么我的购物车标签就更新了wia ajax。我可以在这种情况下使用策略吗?不,我以为你的购物车是在一个页面中处理的,而不是在一个面板中处理的。SimplePageAuthorizationStrategy只能处理页面。谢谢!但我有cartPanel,它已经在我的页面上实例化了。所以,若用户单击“添加到购物车”,并且他已经通过了身份验证,那个么我的购物车标签就更新了wia ajax。我可以在这种情况下使用策略吗?不,我以为你的购物车是在一个页面中处理的,而不是在一个面板中处理的。SimplePageAuthorizationStrategy只能处理页面。