自动登陆:
自动登录是我们在日常浏览网站中经常使用的功能,之前我们在学习过滤器的时候已经实现过该功能;
自动登录的简单原理:用户登录成功后,我们在后台判断用户有没有勾选自动登陆的复选框,根据匹配复选框的值的结果来判断用户是否自动登陆,如果用户自动登录了则将用户名和密码存储在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容器的(这里也是那位网友的理解,我感觉挺对的)。