我可以使用JSF flash将参数传递给Servlet吗?

时间:2011-11-18 13:41:09

标签: java jsf servlets jsf-2

要将隐藏参数从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?

1 个答案:

答案 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);
// ...