我正在尝试根据用户请求保存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,这是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编码和-decode。 JSF实用程序库OmniFaces提供了隐式执行此操作的帮助程序方法。
username = Faces.getRequestCookie("username");

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

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

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

10-11 22:56
查看更多