此問題與我最近發佈的另一個相關:Understanding HttpServletRequest and cookies in JSF。WebFilter,EL和SessionScoped ManagedBean處理記住我登錄
爲了實施記住我登錄JSF
,我正在使用cookie並在WebFilter
中讀取它。過濾器獲取cookie並在SessionScoped
ManagedBean
中設置cookie值,但由於某些原因,ManagedBean
無法在網頁中顯示。
過濾器的的doFilter實現:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("MyTestCookie")) {
System.out.println("Filter got cookie: " + cookie.getValue());
cookieBean.setValue(cookie.getValue());
}
}
}
chain.doFilter(request, response);
}
CookieBean類:
@ManagedBean
@SessionScoped
public class CookieBean implements Serializable {
private String value;
@PostConstruct
public void init() {
System.out.println("Instantiated CookieBean");
}
public String getValue() {
System.out.println("CookieBean returning Value: " + value);
return value;
}
public void setValue(String value) {
System.out.println("CookieBean getting Value: " + value);
this.value = value;
}
public void create() {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
Map<String, Object> props = new HashMap<String, Object>();
props.put("maxAge", 10000);
ec.addResponseCookie("MyTestCookie", "Hello Cookie", props);
}
}
CookieBean
cookieBean
由javax.inject.Inject
註釋的方式注入到過濾器。
的index.xhtml:
<h:form>
<h:commandButton value="Create Cookie!" action="#{cookieBean.create()}" >
<f:ajax render="@form" />
</h:commandButton>
<p></p>
<h:outputText value="Cookie value: #{cookieBean.value}" />
</h:form>
的第一個問題是,設置cookie後,如果我開始一個新的會話(通過打開一個新的瀏覽器會話),網頁ISN」 t知道cookie值,因爲在之後SessionScoped
ManagedBean
被更新頁面顯示。
問題1:如何檢測cookie值及時更新網頁中的rendered
屬性?
的第二個問題是,如果我在瀏覽器中按重載(或刷新)按鈕重新加載網頁時,ManagedBean實例是像以前一樣(的@PostConstruct
方法是不啓動),但網絡頁面顯示了一個空的cookie值和相同的顯示在服務器的輸出:
CookieBean returning Value: null
Filter got cookie: Hello Cookie
CookieBean getting Value: Hello Cookie
問題2:怎麼可能,一個SessionScoped
ManagedBean
失去其財產不會被重新創建?