Stateful Session Bean
ログイン セッションを保持するとJSF Session Bean
がありServlet Filter
ます。
私がしなければならないことは、ログインしていないユーザーが自分のページにアクセスできないようにすることです。そのため、フィルターをかけました。
そのdoFilter()
ようなもの:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());
System.out.println(userManager.isLogged());
if (userManager.isLogged() || path.equals("/") || path.equals("/index.xhtml") || path.startsWith(ResourceHandler.RESOURCE_IDENTIFIER) || path.startsWith("/resources/") || path.startsWith("/admin") || path.equals("/admin/login.xhtml")) {
chain.doFilter(request, response);
} else {
request.getRequestDispatcher("/error.xhtml").forward(request, response);
}
}
whereuserManager
は で見つかります:
private UserManagerLocal lookupUserManagerLocal() {
try {
Context c = new InitialContext();
return (UserManagerLocal) c.lookup("java:global/UNILIFE/UNILIFE-ejb/UserManager!ejb.UserManagerLocal");
} catch (NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
throw new RuntimeException(ne);
}
}
現在、System.out.println(userManager.isLogged());
出力は常にfalse ですが、#{loginBean.logged}
出力は true です。
loginBean.logged
ちょうどであることに注意してください
public boolean isLogged() {
return userManager.isLogged();
}
そして、私の管理対象 Bean では、次のようuserManager
に取得されます
@EJB
private UserManagerLocal userManager;
サーブレットは JSF Managed Bean と同じ SFSB を使用していないようです。
私は何を間違っていますか?
編集: 新しいコード
サーブレット
UserManagerLocal userManager = lookupUserManagerLocal();
private UserManagerLocal lookupUserManagerLocal() {
try {
Context c = new InitialContext();
UserManagerLocal userM = (UserManagerLocal) c.lookup("java:global/UNILIFE/UNILIFE-ejb/UserManager!ejb.UserManagerLocal");
HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
req.setAttribute("userManager", userM);
return userM;
} catch (NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
throw new RuntimeException(ne);
}
}
jsf ビーン
@PostConstruct
public void init(){
HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
userManager = (UserManagerLocal) req.getSession().getAttribute("userManager");
}