自動登陸:
自動登入是我們在日常浏覽網站中經常使用的功能,之前我們在學習過濾器的時候已經實作過該功能;
自動登入的簡單原理:使用者登入成功後,我們在背景判斷使用者有沒有勾選自動登陸的複選框,根據比對複選框的值的結果來判斷使用者是否自動登陸,如果使用者自動登入了則将使用者名和密碼存儲在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("-")[];
//System.out.println("name:" + username);
String password = value.split("-")[];
//System.out.println("password:" + password);
//bug代碼
/*User existUser = userService.loginUser(username, password);
if (existUser == null) {
// 使用者名或者密碼可能被篡改
chain.doFilter(request, response);
return;
}*/
// 使用者正常登入,顯示登入的資訊
這是我們在filte中的一小段代碼,當使用者自動登入,網頁關閉再打開時會執行,我們在控制台可以看到輸出的cookie内容,使用者名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容器的(這裡也是那位網友的了解,我感覺挺對的)。