jsf - 通过 CDI 保存和使用 cookie

标签 jsf cookies javabeans cdi

我正在尝试根据用户请求保存一个 Cookie,稍后使用该 cookie 来填写文本字段。我正在使用 Java CDI 和登录 bean。我对这三个都是新手。对于在线资源,我只能找到

@Inject @CookieParam
private String username;

@Inject @CookieParam("username")
private Instance<String> usernameResolver;
...
String username = usernameResolver.get();

对于第一个,错误消息显示 "Unsatisfied dependencies for type [String] with qualifiers [@Default]"

对于第二个,我得到的唯一错误是 "Failed to start context"

我该如何解决这个问题?

谢谢

最佳答案

作为@CookieParam package name提示,这是 JAX-RS 特有的,JAX-RS 是 Java EE 的另一个用于 RESTful Web 服务的框架。这仅适用于由 @Path 注释的 JAX-RS 托管资源。这在由 @ManagedBean@Named 注释的 JSF 或 CDI 托管 bean 中不起作用。

如果您使用 JSF 的 @ManagedBean 来管理 bean,那么它可以通过 EL 评估 #{cookie.username} 作为 @ManagedProperty.

@ManagedBean
public class Bean {

    @ManagedProperty("#{cookie.username}")
    private String username;

    // ...
}

如果您正在使用 CDI 的 @Named 来管理 bean,那么您要么求助于自定义注释,要么将其抓取为 Cookie。来自当前的 FacesContext。由于前者不是微不足道的(但实际上对于 OmniFaces 来说是个好主意),我将只展示后者:

@Named
public class Bean {

    private String username;

    @PostConstruct
    public void init() {
        Cookie cookie = (Cookie) FacesContext.getCurrentInstance().getExternalContext().getRequestCookieMap().get("username");

        if (cookie != null) {
            username = cookie.getValue();
        }
    }

    // ...
}

那么,为了保存它,唯一的办法就是使用ExternalContext#addResponseCookie()。 .

FacesContext.getCurrentInstance().getExternalContext().addResponseCookie("username", username, properties);

不要忘记考虑到 cookie 值对允许的字符有非常严格的限制。您可能希望在保存和检索时对其进行 URL 编码和解码。 JSF 实用程序库 OmniFaces提供隐式执行此操作的辅助方法。

username = Faces.getRequestCookie("username");
Faces.addResponseCookie("username", username, -1);

与具体问题无关,将诸如“用户名”之类的敏感内容存储为 cookie 是可怕的。您知道最终用户可以操纵 cookie 吗?访问您网页的人可以轻松地将代表“用户名”的 cookie 值编辑为其他人的值?

关于jsf - 通过 CDI 保存和使用 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27807847/

相关文章:

python - 如何通过 Plotly 从 Dash 中的回调函数访问 cookie?

css - Sitecore 语言版本字体系列

Asp.NET cookie 返回 null

jsf - <pe :exporter> showcase 中 #{exporterController.customExporter} 的实现在哪里

java - 如何将网站与 Java 后端集成?

string - 如何验证 JSF 表单上模式的字符串输入字段

java - EJB异常,可能是什么原因造成的?注解?服务器 :GlassFish

Java Bean 不被识别

java - 为什么我得到 : java. lang.NullPointerException?

jsf - p :ajax getter for update being called before listener