【问题标题】:Can I use JSF flash to pass parameters to a Servlet?我可以使用 JSF flash 将参数传递给 Servlet 吗?
【发布时间】:2012-01-01 06:28:24
【问题描述】:

为了将隐藏参数从 JSF 2.0 托管 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?

【问题讨论】:

    标签: java jsf servlets jsf-2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多