1. 程式人生 > >防止未登入的使用者直接重寫URL訪問系統

防止未登入的使用者直接重寫URL訪問系統

    最近在開發系統的時候,碰到個問題,就是未登入的使用者可以通過重寫url登入他本不能登入的系統。

經過研究,終於把此問題解決了。呵~

   思路是:每當有使用者成功登入系統時,把其資訊儲存到session中。在相應被訪問的頁面,其對應的bean中的建構函式來獲得session 中使用者物件,若使用者物件為空,則表明此使用者是未登入的,使其跳轉到登入頁面。

   session 取得程式碼

  public class SessionHelper
  {

    private static final String OA_WEB_SESSION="OAWebSession";
    private static HttpSession getSession()
    {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        return request.getSession();
    }

    public static OAWebSession getOAWebSession()
    {
        Object session = getSession().getAttribute(OA_WEB_SESSION);
        if (session == null)
        {
            session = new OAWebSession();
            getSession().setAttribute(OA_WEB_SESSION, session);
        }
        return (OAWebSession) session;
    }

    public static void removeOAWebSession()
    {
        getSession().removeAttribute(OA_WEB_SESSION);
    }
}

  在使用者成功登入後把其資訊儲存到session中

            User user = new User();
            user.login(userID, password);
            SessionHelper.getOAWebSession().setUser(user);

   被訪問的頁面對應的bean

   public class Top{

     public Top(){

              user = SessionHelper.getOAWebSession().getUser();
             if (user == null) {
              NavigateHelper.redirect("Logon.jsp");
        }

    }

  }

  redirect 方法如下:

   public class NavigateHelper
{
    public static void redirect(String url)
    {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        try
        {
            response.sendRedirect(url);
        }
        catch (IOException ex)
        {
            ExceptionHelper.jumpToErrorPageWithResponseComplete(ex, SessionHelper.getOAWebSession());
        }
    }
}

  註明: 由於jsf 是先走建構函式,才走get方法,所以get方法要加個物件或值取得為空的判斷。

  註明: 此塊功能只對未登入的使用者有效,登入了但沒權挾的在研究中。