通过 CDI 保存和使用 cookie
Saving and using a cookie with 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 的,Java EE 的另一个 framefork RESTful Web 服务。这仅适用于由 @Path
注释的 JAX-RS 托管资源。这在 @ManagedBean
或 @Named
.
注释的 JSF 或 CDI 托管 bean 中不起作用
如果您使用 JSF 的 @ManagedBean
来管理 bean,那么它可以通过 EL-evaluating #{cookie.username}
as @ManagedProperty
.
获得
@ManagedBean
public class Bean {
@ManagedProperty("#{cookie.username}")
private String username;
// ...
}
如果您使用 CDI 的 @Named
来管理 bean,那么您可以求助于自定义注释,或者将其作为 Cookie
from the current FacesContext
. As the former is not trivial (but actually a nice idea for 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);
与具体问题无关,将像 "user name" 这样敏感的东西存储为 cookie 是可怕的。您知道最终用户可以操纵 cookie 吗?访问您网页的人可以轻松地将代表 "user name" 的 cookie 值编辑为其他人的值?
我正在尝试根据用户请求保存一个 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 的另一个 framefork RESTful Web 服务。这仅适用于由 @Path
注释的 JAX-RS 托管资源。这在 @ManagedBean
或 @Named
.
如果您使用 JSF 的 @ManagedBean
来管理 bean,那么它可以通过 EL-evaluating #{cookie.username}
as @ManagedProperty
.
@ManagedBean
public class Bean {
@ManagedProperty("#{cookie.username}")
private String username;
// ...
}
如果您使用 CDI 的 @Named
来管理 bean,那么您可以求助于自定义注释,或者将其作为 Cookie
from the current FacesContext
. As the former is not trivial (but actually a nice idea for 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);
与具体问题无关,将像 "user name" 这样敏感的东西存储为 cookie 是可怕的。您知道最终用户可以操纵 cookie 吗?访问您网页的人可以轻松地将代表 "user name" 的 cookie 值编辑为其他人的值?