要将隐藏参数从JSF 2.0 Managed BEan操作处理程序传递给Servlet,我将参数值传递给Session属性:
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);
}
}
有更好的方法可以做到这一点,例如是否可以使用flash map将此隐藏参数发送到Servlet?
答案 0 :(得分:2)
Flash范围使用了Cookie和会话范围的组合。因此,要实现相同的效果,您需要通过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);
// ...