天天看点

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("-")[];
    //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容器的(这里也是那位网友的理解,我感觉挺对的)。