ssh框架中如何實現使用者自動登入
自動登陸:
自動登入是我們在日常瀏覽網站中經常使用的功能,之前我們在學習過濾器的時候已經實現過該功能;
自動登入的簡單原理:使用者登入成功後,我們在後臺判斷使用者有沒有勾選自動登陸的複選框,根據匹配複選框的值的結果來判斷使用者是否自動登陸,如果使用者自動登入了則將使用者名稱和密碼儲存在cookie中,再將使用者儲存在session中,以便我們在前臺可以獲取到使用者的相關資訊,同時我們可以設定cookie的時間,當網頁關閉後,使用者下次登入時,我們在filter中可以判斷使用者攜帶過來的cookie資訊,如果有我們自動登陸的cookie,再去資料庫核對資訊後,我們則將使用者儲存在session中,這樣在首頁載入時,又可以顯示使用者資訊,要是沒有的話,直接放行,session中沒有我們的使用者資訊,前臺獲取不到使用者資訊,會要求使用者登入,這樣我們就可以實現使用者的自動登陸功能;
在ssh框架中,將之前的filetr複製過來,然後在配置檔案中配置好後,準備實現自動登入功能時,卻出現了bug,
// 有自動登入的cookie
// 去資料庫核對
String value = cookie.getValue();
//System.out.println("value:" + value);
String username = value.split("-")[0];
//System.out.println("name:" + username);
String password = value.split("-")[1];
//System.out.println("password:" + password);
//bug程式碼
/*User existUser = userService.loginUser(username, password);
if (existUser == null) {
// 使用者名稱或者密碼可能被篡改
chain.doFilter(request, response);
return;
}*/
// 使用者正常登入,顯示登入的資訊
這是我們在filte中的一小段程式碼,當用戶自動登入,網頁關閉再開啟時會執行,我們在控制檯可以看到輸出的cookie內容,使用者名稱username和密碼password,但是在這裡出現了空指標:
User existUser = userService.loginUser(username, password);
我們通過debug模式執行可以看到,在service層:
//bug程式碼
@Override
public User loginUser(String username, String password) {
return userDao.loginUser(username,password);
}
userDao的值為null,所以出現了空指標但是我們在service層已經通過註解的形式注入了userDao,為什麼userDao還是空呢,百思不得其解後我在百度上面找到了答案,原來我們在struts2中直接引入servlet的過濾器是不會起作用的,spring沒有獲得過濾器的管理,導致不能依賴注入物件,我們需要在web.xml中修改filter的配置,我的配置如下,仿照百度的那位網友的:
`
MySpringFilter
org.springframework.web.filter.DelegatingFilterProxy
targetBeanName
cookieLoginFilter
<filter-mapping>
<filter-name>MySpringFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
` 這裡要講一下,web.xml中為什麼filter的資訊要這麼配置呢,這樣配置是為了讓spring來管理這個filter,這樣filter在執行時service也被spring注入了,如果不用spring管理的話,當filter執行時spring管理的bean像service啊,sessionFactory啊都沒有被注入,這樣就無法訪問資料庫來驗證使用者。這裡要說filter是依賴於servlet容器的(這裡也是那位網友的理解,我感覺挺對的)。