Jsf 使用CDI保存和使用cookie

Jsf 使用CDI保存和使用cookie,jsf,cookies,javabeans,cdi,Jsf,Cookies,Javabeans,Cdi,我试图在用户请求时保存一个Cookie,并在以后使用该Cookie填充文本字段。我正在使用JavaCDI和一个登录bean。我对这三个人都是新手。对于在线资源,我只能找到 @Inject @CookieParam private String username; 及 @Inject@CookieParam(“用户名”) 私有实例usernamesolver; ... 字符串username=usernamesolver.get(); 对于第一个问题,错误消息显示“类型[String]与限定符

我试图在用户请求时保存一个Cookie,并在以后使用该Cookie填充文本字段。我正在使用JavaCDI和一个登录bean。我对这三个人都是新手。对于在线资源,我只能找到

@Inject @CookieParam
private String username;

@Inject@CookieParam(“用户名”)
私有实例usernamesolver;
...
字符串username=usernamesolver.get();
对于第一个问题,错误消息显示
“类型[String]与限定符[@Default]的依赖关系未得到满足”

对于第二个,我得到的唯一错误是
“无法启动上下文”

我应该如何解决这个问题

感谢您的提示,这是JAX-RS所特有的,JAX-RS是JavaEE的另一个RESTfulWeb服务框架。这只适用于由
@Path
注释的JAX-RS托管资源。这在由
@ManagedBean
@Named
注释的JSF或CDI托管bean中不起作用

如果您使用JSF的
@ManagedBean
来管理bean,那么它可以作为
@ManagedProperty
使用

@ManagedBean
public class Bean {

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

    // ...
}
如果您使用CDI的
@命名
来管理bean,那么您可以使用自定义注释,或者从当前的
FacesContext
获取它。由于前者并不琐碎(但实际上是一个不错的想法),我将仅展示后者:

@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();
        }
    }

    // ...
}
那么,为了保存它,唯一的方法就是使用

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

username = Faces.getRequestCookie("username");
Faces.addResponseCookie(“用户名”,用户名,-1);


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

“登录bean”?豆子?那是什么课?谁在管理那个班?您实际使用的是什么web框架?正如包名所提示的那样,
@CookieParam
是特定于JAX-RS的,JAX-RS是Java EE的RESTful框架,显然不适用于由另一个Java EE框架(如JSF、Servlet等)管理的类。哦,好的,框架是JSF。我不知道它们不兼容。但是我找不到任何关于这方面的资源。好的,知道这一点很有用。我将更改代码中的名称。对于第二段代码,您是指命名而不是ManagedBean吗?我正在使用命名染料,
@Named
。我已经修好了。而且,既然你是新来的,别忘了在对理解和解决具体问题有帮助(大部分)的时候,标记出你接受的答案。请参阅在适用的情况下对其执行相同的操作。这很有效,我只需将其类型转换为字符串。
FacesContext.getCurrentInstance().getExternalContext().addResponseCookie("username", username, properties);
username = Faces.getRequestCookie("username");