防止未登入的使用者直接重寫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方法要加個物件或值取得為空的判斷。
註明: 此塊功能只對未登入的使用者有效,登入了但沒權挾的在研究中。