2

私は主にこの答えに従おうとしていますが、これは...

AppManager am = (AppManager) req.getSession().getAttribute("appManager");

常にnullです。ログイン画面でユーザー情報を印刷しようとしていますが、どのようにアクセスしても、管理者ページから直接アドレスを入力しても、すべてのフィールド(ユーザー名、パスワード、loggedIn ...)は常にnullになります(つまり、ログインしたときに取得する場所)。手動でアドレスを入力したりページを離れたりするたびにホイップされるのではなく、セッションが保存されるようにするにはどうすればよいですか?

AppManager:

import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import jobapp.controller.Controller;

@ManagedBean(name="appManager")
@SessionScoped
public class AppManager implements Serializable {
private static final long serialVersionUID = 16247164405L;
    @EJB
    private Controller controller;
    private String username;
    private String password;
    private boolean loggedIn;
    private Exception failure;
    ...
     /**
     * 
     * @param e an exception to handle.
     */
    private void handleException(Exception e) {
        e.printStackTrace(System.err);
        failure = e;
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    }

    /**
     * The login method.
     * calls the controllers login method.
     * 
     */ 
    public void login(){
        try{
            failure = null; 
            loggedIn = controller.login(username, password);

        }catch (Exception e){
            handleException(e);
        }
    }
    /**
     * The logout method.
     * Sets the user's info to null
     * and stops the conversation.
     */
    public void logout(){
        username = null;
        password = null;
        loggedIn = false;
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    }
...

フィルター:

@WebFilter("/faces/admin.xhtml")
public class LoginFilter implements Filter {
...
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest req = (HttpServletRequest) request;
        //TODO fix "am" nullpointer
        AppManager am = (AppManager) req.getSession().getAttribute("appManager");
        if (am != null && am.isLoggedIn()) {
            // User is logged in, so just continue request.
            chain.doFilter(request, response);
        } else {
            // User is not logged in, so redirect to login.
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect(req.getContextPath() + "/faces/login.xhtml");
        }
    }
4

1 に答える 1

2

@SessionScopedはjavax.enterprise.context.SessionScopedからのものです

これはCDIとの組み合わせで@Namedのみ機能します。JSFを使用しているため、代わりにパッケージ@ManagedBeanのスコープアノテーションを使用する必要があります。javax.faces.bean

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class AppManager implements Serializable {

有効なスコープがないと、JSFマネージドBeanは次のように動作します@RequestScoped。つまり、リクエストごとに何度も何度も構築されるということです。

于 2013-02-27T19:00:46.710 に答える