使用CDI保存和使用cookie

时间:2015-01-06 21:54:47

标签: 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"

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:3)

正如@CookieParam package name提示,这是特定于JAX-RS,Java EE的RESTful Web服务的其他框架。这仅适用于由@Path注释的JAX-RS受管资源。这不会在@ManagedBean@Named注释的JSF或CDI托管bean中工作。

如果您正在使用JSF&#39; @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);

无关具体问题,存储敏感内容,例如&#34;用户名&#34;作为一个cookie是可怕的。您是否知道最终用户可以操作cookie?访问您网页的人可以轻松编辑代表&#34;用户名&#34;的Cookie值。对别人的那个?