2011-11-18 102 views
1

要從JSF 2.0 Managed Bean的操作處理程序通過一個隱藏的參數到Servlet,我傳遞參數值到一個會話屬性:我可以使用JSF flash將參數傳遞給Servlet嗎?

public void callServlet(long id) { 
    try { 
    ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext(); 
    HttpSession sess = (HttpSession) ctx.getSession(false); 
    sess.setAttribute("id", id); 
    ctx.redirect("MyServlet"); 
    } catch (IOException ex) { 
    Logger.getLogger(ResultBean.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

是否有更好的方法來做到這一點,例如是否有可能使用閃存映射發送這個隱藏的參數到Servlet?

回答

2

Flash作用域使用cookies和會話作用域的組合。因此,爲了達到同樣的效果,您需要通過JSF設置cookie並在Servlet中獲取cookie。但是這並不比你現有的好。另一種方法是在會話中通過唯一標識符存儲屬性,並將其作爲請求參數傳遞,如果您想阻止最終用戶知道/猜測值並希望確保同一會話中多個請求的完整性。

public void callServlet(Long id) throws IOException { 
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    String uuid = UUID.randomUUID().toString(); 
    ec.getSessionMap().put(uuid, id); 
    ec.redirect("MyServlet?id=" + uuid); 
} 

(注意,我定你的代碼去除潛在NullPointerException和去除需要在你的JSF javax.servlet特定的代碼是實踐不良的徵兆)

,並在servlet的:

String uuid = request.getParameter("id"); 
Long id = (Long) request.getSession().getAttribute(uuid); 
request.getSession().removeAttribute(uuid); 
// ... 
相關問題