我有一個ListView由不同的片段組成,其中包含文本和鏈接(在另一個片段內)。根據列表視圖模型的狀態,鏈接可見。Wicket鏈接重播攻擊
爲了簡單起見,假設鏈接是可見的,取決於列表視圖模型的布爾字段,如果它是真的是可見的,否則不可見。
首先鏈接是可見的,我複製鏈接位置(加密),我等待我的模型改變(即布爾值爲false),並且在刷新頁面後鏈接消失。 (正確!)
如果我試圖在瀏覽器中返回URL(之前複製),我收到一個WicketRuntimeException,告訴我沒有找到該鏈接的偵聽器。
更完整的鏈接是一個片段內:
<wicket:fragment wicket:id="reservationRatingFragment">
<li>
<div>
<img src="/img/good.png" />
</div>
<p>
<a wicket:id="ratingGoodLink" href="#"> <wicket:message
key="messaging.reservation.rating.good" />
</a>
</p>
</li>
</wicket:fragment>
當我說看不見我的意思是我設置的片段的標記容器如.setVisible(假);
這是怎麼發生的?我假設,如果我記得一個不再可見的鏈接,框架應該跳過它並刷新我目前正在使用的頁面(或將頁面重定向到基本頁面)。
例如,如果我複製鏈接並更改BasePage(例如轉到主頁),當我調用複製的URL時,仍會發生異常。
EDITED:
在第一片段:
嵌套片段(ReservationRatingFragment):
public ReservationRatingFragment(String id, String markupId,MarkupContainer markupContainer, Item item, Message msg) {
super(id, markupId, markupContainer, new Model<Message>(msg));
/* Avoid render container */
setRenderBodyOnly(true);
/* Load button components */
Link<Void> ratingGoodLink = new Link<Void>("ratingGoodLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
processRating(ReservationEvaluationResult.GOOD);
}
};
add(ratingGoodLink);
Link<Void> ratingBadLink = new Link<Void>("ratingBadLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
processRating(ReservationEvaluationResult.BAD);
}
};
add(ratingBadLink);
}
標記爲兩個片段:
<wicket:fragment wicket:id="messageFragment">
Some content...
<!-- Here goes my fragment with link -->
<ul wicket:id="messageRatingContainer">
<div wicket:id="messageRatingSection"></div>
</ul>
<wicket:fragment wicket:id="reservationRatingFragment">
<li><div>
<img src="/img/messaging/good.png" />
</div>
<p>
<a wicket:id="ratingGoodLink" href="#"> <wicket:message
key="messaging.reservation.rating.good" />
</a>
</p></li>
<li><div>
<img src="/img/messaging/bad.png" />
</div>
<p>
<a wicket:id="ratingBadLink" href="#"> <wicket:message
key="messaging.reservation.rating.bad" />
</a>
</p></li>
</wicket:fragment>
</wicket:fragment>
EDIT ED: processRating只是調用一個控制器(處理後端變化)。在控制器中,我檢查重播攻擊(如果這個動作已經被執行),如果是的話,我會拋出一個運行時異常,導致用戶到一個警告頁面(您已經評估過這條信息)。事實是,在這種情況下,它沒有到達這一點,因爲鏈接不可用,它不會調用控制器,並且它只是拋出InvalidUrlException,因爲鏈接不可見。
檢票版本:1.4.19
感謝
這將有助於看到,除了HTML標記您的Java代碼。你在使用BookmarkablePageLink嗎? – OnesAndZeros
我已經添加了一些代碼,我沒有使用任何BookmarkablePageLink,只是org.apache.wicket.markup.html.link.Link – Wizche