2017-02-20 75 views
0

我有一個Angular + spring REST和Wicket混合應用程序。 Wicket提供UserPage類。這個UserPage包含我的JavaScript頁面。檢票器忽略來自Spring的302重定向

public class UserPage extends WebPage { 

public UserPage() { 
    super(); 
} 

@Override 
public void renderHead(IHeaderResponse response) { 
    super.renderHead(response); 
    response.render(JavaScriptHeaderItem.forUrl("https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js")); 
    response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(UserPage.class, "user.js"))); 
    response.render(CssHeaderItem.forReference(new CssResourceReference(UserPage.class, "user.css"))); 
} 

我實現了一個過濾器來檢查會話處於活動狀態,如果不是這種情況下,頁面應該重定向。

WicketSession s = WicketSession.get(); 

if (s == null) { 
    response.sendRedirect("/"); 
} else if (s.getUser() == null) { 
    response.sendRedirect("/"); 
} else { 
    filterChain.doFilter(request, response); 
} 

但是,當我沒有登錄運行此頁面時,瀏覽器收到302但不重定向。這隻發生在頁面通過檢票服務時。如果我手動去UserPage.html,它會重定向。

無論如何,任何人都知道爲什麼會發生這種情況?它肯定是wicket speficic,我還不熟悉檢票口。

當試圖到達/用戶,頁面停留,和HTML身體發送響應數據,其中我的腳本試圖解析和失敗(因此所有的空複選框)

當手動去UserPage.html,它確實重定向。 enter image description here

有誰知道爲什麼wicket在發送302時不重定向?任何可能的修復線索?

+0

你是怎麼定義你的filterChain的?如果WicketFilter位於您自己的篩選器Wicket之後,則應該無法干預。 –

+0

啊是的,過濾器實際上是在彈簧過濾器之前執行的。 他們現在都重定向,但這導致了另一個問題。 當我在Spring過濾器的WicketSession中調用get()時,它會拋出一個org.apache.wicket.WicketRuntimeException:沒有應用程序附加到當前線程。 – user3761498

+0

這實際上讓我問這個問題。通常,您需要將WicketSessionFilter添加到鏈中,以使Wicket對象(如會話)可用於非檢票代碼。仍然建議將wicket過濾器放在它的前面(如果此頁有時可以由Wicket提供)...也許你想查看Wicket身份驗證並在沒有用戶登錄會話時重定向到特定頁面? –

回答

1

1)如果你將會話數據保存在WicketSession中,那麼它應該在Spring的Filter/Servlet之前的web.xml中。

如果您使用它,我建議將用戶保留在Spring Security Authentication中。

2)WicketSession.get()永不返回null。它充當「獲得或創造」。您需要改爲if (WicketSession.exists()) {...}