我正在尝试在facelet页面上显示存储在Oracle中的用户配置文件数据。但我不知道如何在托管bean中的Session中指定用户ID(下面的@PostConstruct中的“myUserId”)。
receiving email? #{member.receive_email} <br/>
signed waiver? #{member.signed_waiver} <br/>
@SessionScoped
public class MemberProfile implements Serializable {
@Inject
private EntityManager em;
private Member member;
@Produces
@Named
public Member getMember() {
return member;
}
@PostConstruct
public void getMemberData() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
Root<Member> _member = criteria.from(Member.class);
criteria.select(_member);
criteria.where(cb.equal(_member.get("userid"), "myUserId"));
member = em.createQuery(criteria).getSingleResult();
}
当我对用户ID进行硬编码时,它可以工作,但我想查询登录的用户。好吧,没有人真正登录到他们的PC的Web应用程序。在我的公司,IT已经设置Apache使用Kerberose和Active Directory并将其发送给JBoss。所以我通过request.getAttribute("REMOTE_USER")
我有一个servlet过滤器,它读取request.getAttribute(“REMOTE_USER”)并设置一个对象User
,它在httpsession中有基本的员工数据(电话,电子邮件,姓名等)。现在,成员资料来自另一个Oracle桌面,用于员工滑雪俱乐部应用程序。
在facelet中,我可以像这样访问用户数据:
Hello: ${STKUserSession.fname } ${STKUserSession.lname } (${STKUserSession.userId})
那么如何在上面的查询构建器中使用此STKUserSession.userId。也许我无法理解,因为我一直在使用错误的方法
基于下面的答案,建议是这样做,但我不确定这是最干净的方法。
HttpServletRequest httpRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpSession session = httpRequest.getSession();
STKUser authenticatedUser = (STKUser) session.getAttribute("STKUserSession");
String autheticatedBadge = authenticatedUser.getBadge();
criteria.where(cb.equal(_member.get("badge"), autheticatedBadge));
答案 0 :(得分:1)
您可以使用
检索发出请求的用户名FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
或
FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();
那么如何在查询构建器中使用此STKUserSession.userId 以上。也许我无法理解,因为我使用了错误 完全接近
只需将从上述方法之一检索到的用户名作为参数传递到sql查询中,类似以下内容应该有效:
criteria.where(cb.equal(_member.get("userId", FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName())));
答案 1 :(得分:1)
这就是我要做的事情:
1)为STKUser
对象创建一个持有者对象:
@Named("STKUserSession")
@SessionScoped
public class STKUserSession implements Serializable {
private STKUser instance;
@PostConstruct
public void init() {
instance = new STKUser(Faces.getRequestAttribute("REMOTE_USER"));
}
// facade methods for STKUser
}
2)使用STKUserSession
对象获取您的个人资料:
@Named
@SessionScoped
public class MemberProfile implements Serializable {
@Inject
private STKUserSession user;
@PersistenceContext
private transient EntityManager em;
private Member member;
@PostConstruct
public void init() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> cq = cb.createQuery(Member.class);
Root<Member> root = cq.from(Member.class);
cq.where(cb.equal(root.get("badge"), user.getBadge()));
member = em.createQuery(cq).getSingleResult();
}
}
请注意,这是演示代码:您可能希望错误检查丢失的徽章,捕获getSingleResult()
引发的异常(或使用getResultList()
)。它还使用omnifaces快捷方式。
另外,检查周期:如果将MemberProfile
注入STKUserSession
使用的bean,您的CDI实现会抱怨。