2015-07-20 60 views
1

考慮這個index.xhtml頁面。如何跨HTTP和HTTPS請求重用SessionScope的JSF Beans?

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html"> 
    <f:view locale="en" encoding="UTF-8"> 
     <h:head> 
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     </h:head> 

     <h:body class="ui-grid" id="body"> 
      <h:form> 
       <h:commandButton value="Invalidate Session" action="#{loggedInUser.invalidateSession}"/> 
      </h:form> 
     </h:body> 
    </f:view> 
</html> 

這SessionScoped豆。

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.enterprise.context.SessionScoped; 
import javax.faces.context.FacesContext; 
import javax.inject.Named; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 

@Named 
@SessionScoped 
public class LoggedInUser implements Serializable { 

    String user; 

    @PostConstruct 
    public void init() { 
     String remoteUser = this.user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); 
     String sessionId = FacesContext.getCurrentInstance().getExternalContext().getSessionId(false); 
     System.out.println("Initializing. With SESSION ID " + sessionId); 
     System.out.println("Initializing. With remote user " + remoteUser); 
    } 

    public void invalidateSession() throws ServletException{ 
     HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     request.logout(); 
     FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
    } 

    public String getUser() { 
     return user; 
    } 

    public void setUser(String user) { 
     this.user = user; 
    } 
} 

我在兩個瀏覽器窗口中訪問該頁面。 一個窗口(W1)具有URL https://localhost:8181/pfdialogdemo/index.xhtml 其他窗口(W2)具有URL http://localhost:8080/pfdialogdemo/index.xhtml

這些都是我做的步驟。

  1. 在W1點擊 「的Invalidate會話」。
  2. 重新加載W1。
  3. 重新加載W2。

通過LoggedInUser.init產生的輸出();是

Information: Initializing. With SESSION ID b6d2858cc441c52540f54ee4cb0c 
Information: Initializing. With remote user null 
Information: Initializing. With SESSION ID b6d60472f8d5cca5b6feb5ff32d5 
Information: Initializing. With remote user null 

如果我這樣做。

  1. 在W2點擊 「的Invalidate會話」。
  2. 重新加載W2。
  3. 重新加載W1。

輸出是。

Information: Initializing. With SESSION ID b6de615078648aa44566af533a9f 
Information: Initializing. With remote user null 

爲什麼SessionScoped豆創造了第一例的第一次?如何確保SessionScoped bean沒有被創建兩次?爲什麼在第二個例子中只創建一次?

此示例使用Glassfish的4.1使用JSF 2.2(鑽嘴魚科)

回答

0

這是預期行爲符合HTTP state (cookie) specification(即超出JSF的控制)。一個HTTPS請求期間創建

Cookies是不提供給相同的域/路徑上的HTTP請求。否則這將是一個破壞HTTPS完整性和感覺的安全漏洞。這是唯一可能的。

由HTTP重定向永久到HTTPS只是禁用HTTP的Web應用程序。

+0

謝謝你的回答。我如何在JSF應用程序中將HTTP從HTTP重定向到HTTPS? –

+1

下面是正確的問題:「我將如何在GlassFish服務器中將HTTP從HTTP重定向到HTTPS?」。 – BalusC