ssh2+注解+filter+cookie实现自动登录功能。

把这些内容记录下来,以后可以拿过来就用。

我做的这个功能是在登录时点选自动登录的checkbox,当登录成功能后会在本地生成一个cookie记录用户数据,以便下次用户不用再次登录。

项目整体的框架才用的是ssh2,这里我还用到了filter,每一个网页请求都会被filter拦截到,这样在filter中把cookie从本地取出,然后把取出的用户数据和数据库验证返回结果,如果验证成功,将用户数据保存到seession中,如果没有验证成功就执行chain.doFilter(request, response);往下继续执行。

还有很多实现的filter方法,spring security这个框架很好的实现了对用户登录权限的管理。但我唯一只用到了filter实现成功了,以后在研究其他的吧。

首先,加入filter的话就要在web.xml中配置filter。

        <filter>
		<filter-name>MySpringFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><!--这是一个代理filter的类-->
		<init-param>
			<param-name>targetBeanName</param-name>
			<param-value>cookieLoginFilter</param-value><!--代理类代理了filter之后会通过<span style="font-family: Arial, Helvetica, sans-serif;">cookieLoginFilter去spring中找到对应的bean</span>-->
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>MySpringFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
<p>	</filter-mapping></p>
这里要讲一下,web.xml中为什么filter的信息要这么配置呢,这样配置是为了让spring来管理这个filter,这样filter在执行时service也被spring注入了,如果不用spring管理的话,当filter执行时spring管理的bean像service啊,sessionFactory啊都没有被注入,这样就无法访问数据库来验证用户。 这里要说filter是依赖于servlet容器的。

        @Override
	public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		// 获取到session中用户对象
		Object object = request.getSession().getAttribute(CommonConstants.SESSION_USER);

		String email = null;
		String password = null;
		String autoStatus = null;

		// 判断如果object等于空 session中没有用户
		if (object == null) {
			Cookie[] cookies = request.getCookies();
			if (cookies != null && cookies.length > 0) {
				for (int i = 0; i < cookies.length; i++) {
					Cookie cookie = cookies[i];

					// 判断Cookie的邮箱名是否等于"HKPhotoUserEmail"
					if (CommonConstants.BROWSER_COOKIE_EMAIL.equals(cookie.getName())) {
						email = cookie.getValue().trim();
					}

					// 判断Cookie的密码名是否等于"HKPhotoUserPassword"
					if (CommonConstants.BROWSER_COOKIE_PASSWORD.equals(cookie.getName())) {
						password = cookie.getValue().trim();
					}

					// 判断Cookie的自动登录状态名是否等于"HKPhotoAutoLoginStatus"
					if (CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME
							.equals(cookie.getName())) {
						autoStatus = cookie.getValue().trim();
					}
				}
				if (autoStatus != null && autoStatus.equals("1")) {
					if (email != null && password != null && email.length() > 0
							&& password.length() > 0) {
						vlUser = new VLUser();
						vlUser.setUEmail(email);
						vlUser.setUPwd(password);
						vlUser = vlUserServiceImpl.searchUser(vlUser).get(0);

						if (vlUser != null) {
							// 将该user放入到session中
							request.getSession().setAttribute(CommonConstants.SESSION_USER, vlUser);
							chain.doFilter(request, response);//这句是继续执行下面的filter
						} else {
							chain.doFilter(request, response);
						}
					} else {
						chain.doFilter(request, response);
					}
				} else {
					chain.doFilter(request, response);
				}

			} else {
				chain.doFilter(request, response);
			}
		} else {
			chain.doFilter(request, response);
		}
	}
给出filter中doFilter的代码,init()和destroy()中没有内容。

    public void addCookieingUserToResponse(VLUser vlUser) {  
  
        // 设置cookie邮箱名值对  
        Cookie cookieEmail = new Cookie(CommonConstants.BROWSER_COOKIE_EMAIL,vlUser.getUEmail());  
        cookieEmail.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        cookieEmail.setPath("/");  
        RequestAndResponse.getResponse().addCookie(cookieEmail);  
  
        // 设置cookie密码名值对  
        Cookie cookiePassword = new Cookie(CommonConstants.BROWSER_COOKIE_PASSWORD, vlUser.getUPwd());      
        cookiePassword.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        cookiePassword.setPath("/");  
        RequestAndResponse.getResponse().addCookie(cookiePassword);  
          
          
        // 设置cookie自动登录状态名值对  
        Cookie autoLoginStatusCookie = new Cookie(  
                CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME,  
                "1");  
        autoLoginStatusCookie  
                .setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        autoLoginStatusCookie.setPath("/");  
        RequestAndResponse.getResponse().addCookie(autoLoginStatusCookie);  
          
        // 设置cookie登出名值对  
        Cookie loginOutCookie = new Cookie(CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME,"0");  
        loginOutCookie.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        loginOutCookie.setPath("/");  
        RequestAndResponse.getResponse().addCookie(loginOutCookie);  
    }
    
    public void removeCookieingUserInResponse(){ 
    	System.out.println("removeCookie");
        // 设置cookie邮箱名值对  
        Cookie cookieEmail = new Cookie(CommonConstants.BROWSER_COOKIE_EMAIL,null);  
        cookieEmail.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        cookieEmail.setPath("/");  
        RequestAndResponse.getResponse().addCookie(cookieEmail);  
  
        // 设置cookie密码名值对  
        Cookie cookiePassword = new Cookie(CommonConstants.BROWSER_COOKIE_PASSWORD, null);   
        cookiePassword.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        cookiePassword.setPath("/");  
        RequestAndResponse.getResponse().addCookie(cookiePassword);  
          
          
        // 设置cookie自动登录状态名值对  
        Cookie autoLoginStatusCookie = new Cookie(CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME,"0");  
        autoLoginStatusCookie.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        autoLoginStatusCookie.setPath("/");  
        RequestAndResponse.getResponse().addCookie(autoLoginStatusCookie);  
          
        // 设置cookie登出名值对  
        Cookie loginOutCookie = new Cookie(CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME,"0");  
        loginOutCookie.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);  
        loginOutCookie.setPath("/");  
        RequestAndResponse.getResponse().addCookie(loginOutCookie);  
    }
cookie的代码也很简单

我觉得主要是web.xml那块需要记录下来,因为spring管理filter的配置那块和以前的filter不太一样,让我找了好一段时间。



猜你喜欢

转载自blog.csdn.net/wsadzxcleg/article/details/50531212
今日推荐