JSP實現網頁的自動登入(session+cookie)實現
阿新 • • 發佈:2018-12-19
1、session的作用
使用者用瀏覽器訪問web伺服器時,會為每個使用者建立一個session(會話),session在使用者關閉瀏覽器之前都是有效的,所以我們可以在session中儲存使用者的一些資訊,以供使用。這裡我們用session儲存使用者的賬號名稱,以表示使用者已經登入,可以直接訪問後臺頁面。
2、cookie的作用
cookie是客戶端儲存的一些少量資料,每次使用者通過瀏覽器訪問web伺服器時,cookie可以通過request一起傳送至伺服器端,這裡我們使用cookie儲存使用者的賬號密碼,以便實現自動登入功能。
說明:實現過程分為兩個頁面
- login.jsp 是前臺登入介面分別有賬號、密碼輸入區
- mypage.jsp是登入後的顯示介面,有一個登出按鈕,以便使用者登出。
3、流程
- 使用者訪問login.jsp進行第一次登入,對應的servlet將提交的使用者名稱與密碼和資料庫中的記錄進行匹配,如果:
- 匹配失敗(要考慮使用者名稱和密碼為空的情況),則返回login.jsp進行再次登入,並且報告錯誤資訊(記住提交URL引數中的中文需要用URLEncoder進行編碼,不然會亂碼)
- 匹配成功 (cookie是儲存在客戶端的,程式中進行配置之後一定需要用response.addCookies將cookie新增至response從而發回客戶端瀏覽器)
- 如果選擇了未自動登入,此時從request中取出原來的cookies,將有效時間設為0,表示不再進行自動登入。
- 如果選擇了自動登入,那麼就要建立兩個新的cookie,一個儲存username,一個儲存passwd(安全的做法是用MD5等加密演算法加密後儲存),並根據選擇的有效時間設定cookie的有效時間
- 之後用reque.getsession.setAttribute()設定username屬性表示使用者已經登入,最後將頁面重定向至mypage.jsp
程式碼如下所示:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String command= request.getParameter("command");
//這裡是使用者登入的介面,需要處理邏輯關係,考慮
if(command.equals("login"))
{
//1、沒有輸入使用者名稱 2、使用者名稱錯誤 3、密碼錯誤
String username = request.getParameter("username");
String passwd = request.getParameter("passwd");
//如果未輸入使用者名稱
if(username.equals("")||passwd.equals(""))
{
System.out.println("未輸入使用者名稱");
String error_msg = "請輸入使用者名稱和密碼";
String error =URLEncoder.encode(error_msg, "utf-8");
response.setCharacterEncoding("utf-8");
response.sendRedirect("/MyDBtest/login.jsp?error="+error);
}
//對使用者名稱進行查詢
else
{
String real_passwd = loginChecker.getPasswd(username);
//沒有此使用者
if(real_passwd.equals(""))
{
System.out.println("沒有此使用者");
String error_msg = "沒有此使用者,請重新輸入使用者名稱";
String error =URLEncoder.encode(error_msg, "utf-8");
response.setCharacterEncoding("utf-8");
response.sendRedirect("/MyDBtest/login.jsp?error="+error);
}
//查詢成功 檢查使用者是否設定自動登入,如果是則傳送cookies
else if(real_passwd.equals(passwd))
{
//設定session username屬性表示使用者已經登入
request.getSession().setAttribute("username", username);
//檢查使用者是否選擇自動登入
//如果選擇了自動登入,則需要儲存cookies
if("on".equals(request.getParameter("autologin")))
{
int saveTime = Integer.parseInt(request.getParameter("maxage"));
saveTime =24*60*60*saveTime;
Cookie user_cookie = new Cookie("username", username);
Cookie passwd_cookie = new Cookie("passwd", passwd);
user_cookie.setMaxAge(saveTime);
passwd_cookie.setMaxAge(saveTime);
response.addCookie(user_cookie);
response.addCookie(passwd_cookie);
}
//如果沒有選擇自動登入
else
{
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies)
{
System.out.println("刪除 cookie");
if(cookie.getName().equals("username"))
{
cookie.setMaxAge(0);
response.addCookie(cookie); //新增生成的新的cookie
}
else if(cookie.getName().equals("passwd"))
{
cookie.setMaxAge(0);
response.addCookie(cookie); //新增生成的新的cookie
}
}
}
//重定向到後臺介面
response.sendRedirect("/MyDBtest/mypage.jsp");
}
//密碼錯誤
else {
System.out.println("密碼錯誤");
String error_msg = "密碼錯誤,請重新輸入密碼";
String error =URLEncoder.encode(error_msg, "utf-8");
response.setCharacterEncoding("utf-8");
response.sendRedirect("/MyDBtest/login.jsp?error="+error);
}
}
}
else if(command.equals("deleteCookies"))
{
//使用者主動登出,那麼不用再儲存Cookies
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies)
{
if(cookie.getName().equals("username"))
{
cookie.setMaxAge(0);
response.addCookie(cookie); //設定失效
}
else if(cookie.getName().equals("passwd"))
{
cookie.setMaxAge(0);
response.addCookie(cookie); //設定失效
}
}
//重定向到登入介面
request.getSession().removeAttribute("username");
response.sendRedirect("/MyDBtest/login.jsp");
}
}
}
- 對於訪問mypage.jsp,步驟如下:
- 首先檢查session是否有username屬性,如果存在那麼可以直接訪問mypage.jsp,若不存在則進行下一步判斷
- 取出request中的cookie(考慮為空的情況),取出使用者名稱和密碼,與資料庫中記錄進行匹配,若匹配成功,則設定session的username屬性,表示已經登入成功,然後跳轉至mypage.jsp
- 若與資料庫匹配失敗或者cookie為空,那麼可將頁面重定向至錯誤頁面,提示使用者進行登入後才能訪問。
不難想到,應該為 mypage.jsp設定一個過濾器,每次訪問該頁面,先由過濾器完成上述流程,過濾器配置如下:
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>Filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/mypage.jsp</url-pattern>
</filter-mapping>
過濾器程式碼如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
//訪問 mypage 頁面前需要經過此過濾器
//System.out.println("進入到後臺登入過濾器");
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
//這裡說明使用者未登入,那麼獲取cookies並驗證是否能登入
if(req.getSession().getAttribute("username")==null )
{
System.out.println("進入到後臺登入過濾器");
Cookie[] cookies = req.getCookies();
String username=null;
String passwd=null;
if(cookies!=null)
{
for(Cookie cookie:cookies)
{
if(cookie.getName().equals("username"))
{
username = cookie.getValue();
}
else if(cookie.getName().equals("passwd"))
{
passwd =cookie.getValue();
}
}
}
if(username!=null&&passwd!=null)
{
//匹配資料中的使用者名稱以及密碼
//匹配成功則設定登入,否則退出登入
if(loginChecker.getPasswd(username).equals(passwd))
req.getSession().setAttribute("username", username);
}
}
// pass the request along the filter chain
chain.doFilter(req, res);
}
mypage.jsp頁面還有一個登出按鈕,使用者登出後,servlet應該主動刪除使用者的cookie資訊。