跳到主要內容

發表文章

目前顯示的是有「Wicket」標籤的文章

Wicket - Websocket disconnection handling

Problem 造成Websocket突然斷線的原因很多,像是網路不穩定或是閒置過久遭server或是browser中斷連線等,都有可能導致接下來的工作不正常。因此我們需要方法去處理Websocket連線中斷的情況。本篇文章分享我們有使用過的解決方式,供大家參考。 How to? 我們Web框架使用Apache Wicket(6.22),而Server是Jetty(9.3.9)。我們最早使用的解法是在server side判斷連線狀態,但這並非百分之百的解決方式,所以最近改使用client side的解法。除此之外,ping&pong也是一種解決方法,但由於Wicket本身不支援,且套用send message去實作較複雜,因此不在本篇文章討論範圍內。 Handle On Server Side 我們在Server Side根據user request做處理,假如user request對應的Websocket連線已中斷,那我們就會透過AjaxRequestTarget送一個reload給client: public class WebSocketCheckListener extends AbstractRequestCycleListener {   @Override public void onRequestHandlerScheduled ( RequestCycle cycle, IRequestHandler handler ) { if ( ! ( handler instanceof AjaxRequestTarget ) ) return ;   AjaxRequestTarget target = ( AjaxRequestTarget ) handler ; Page page = target. getPage ( ) ;   Application application = Application. get ( ) ;   IWebSocketSettings webSocketSettings = IWebSocketSettings. Holder . get ( application ) ; IWebS...

Wicket - Don't autocomplete

Problem 瀏覽器的貼心有時會為開發人員帶來困擾: 相信這個畫面大家並不陌生,登入facebook、mail都會跳這個dialog;在你下次登入時,瀏覽器會自動幫你輸入帳號密碼。當你做的軟體有整合LDAP、AD、SMTP、Samba任何與帳號密碼有關的功能時,使用者會想遇到這樣的狀況嗎? 假如我根本不需要使用帳號密碼,你幫我填入我不是還要自己消掉嗎? 除此之外,在Submit後所跳出的對話盒,是另一個困擾。本篇文章會分享針對這兩個問題的治療經驗。 How to prevent the autocomplete? 我撰寫此篇文章時,測試的瀏覽器分別為以下版本: Chrome: 70.0.3538.77 Firefox: 63.0.1 IE: 11.0.9600.19129 分享的方法是給大家參考,最後要使用哪種就看應用程式需求。 Don't use type="password" 要一次解決以上兩個問題,就是不要使用password。目前看到唯一跨瀏覽器的方法,可以使用這個GitHub上MIT license的project: text-security ;它是透過css去模擬密碼的外表,可以直接看 demo 。 Declare field as Readonly 這個做法是為了解決autocomplete的問題。原理就是將password field設定為readonly,而瀏覽器針對有值或者readonly的password不會自動填入,最後再透過onfocus將readonly屬性移除就可以正常使用: < input type = "password" readonly onfocus = "this.removeAttribute('readonly');this.select(); this.selectionStart = this.selectionEnd = this.value.length;" onblur = "this.setAttribute('readonly','readonly');" / > 在IE上如果僅移除readonly屬性,會造成點擊兩...

Wicket - Get/Set SessionTimeout

How to? 假如是在Page中實作: // org.apache.wicket.protocol.http.servlet.ServletWebRequest ServletWebRequest servletWebRequest = ( ServletWebRequest ) getRequest ( ) ; // Get int sessionTimeout = servletWebRequest. getContainerRequest ( ) . getSession ( ) . getMaxInactiveInterval ( ) ; // Set servletWebRequest. getContainerRequest ( ) . getSession ( ) . setMaxInactiveInterval ( sessionTimeout ) ;