Spring MVC之java 使用cookie记住用户名和密码

作者:青山常在人不老   阅读 (6227)  |  收藏 (2)  |  点赞 (0)

摘要

本文将在Spring MVC的框架下介绍如何使用java代码在后台使用cookie设置用户的浏览器记住用户的用户名和密码。


原文链接:Spring MVC之java 使用cookie记住用户名和密码

本文不是坑,作者已试,完美解决用户记住登陆状态的问题。本示例需要使用Spirng的拦截器。

前端代码:         

<form id="login_form" action="<%=path%>/login/toLogin" method="post" class="login-form">
    <div class="form-group">
	<label class="sr-only" for="userName">用户名</label> <input
		type="text" name="userName" placeholder="用户名"
		class="form-username form-control" id="userName" maxlength="20" required>
    </div>
    <div class="form-group">
	<label class="sr-only" for="password">密码</label> <input
		type="password" name="password" placeholder="密码" required
		class="form-password form-control" id="password" maxlength="16">
    </div>
    <div class="checkbox">
	<label> <input name="rememberPwd" type="checkbox"> 记住我
	</label>
    </div>
</form>


cokkieTool.java工具类,用户可以完全拷贝此类的内容:

package com.blog.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.blog.constraint.BlogConstraint;
import com.blog.entity.User;

/**
 * cookie设置工具类
 * 
 * @author guopengfei 2016/12/28
 * @since v2.0
 * 
 */
public class CookieTool {
	/**
	 * 设置cookie(接口方法)
	 * 
	 * @author 郭鹏飞  码上中国博客(www.blog-china.cn)
	 * @param response
	 * @param name
	 *            cookie名字
	 * @param value
	 *            cookie值
	 * @param maxAge
	 *            cookie生命周期 以秒为单位
	 */
	public static void addCookie(HttpServletResponse response, String name,
			String value, int maxAge) {
		Cookie cookie = new Cookie(name, value);
		cookie.setPath("/");
		if (maxAge > 0) {
			cookie.setMaxAge(maxAge);
		}
		response.addCookie(cookie);
	}

	/**
	 * 根据名字获取cookie(接口方法)
	 * 
	 * @author guopengfei
	 * @param request
	 * @param name
	 *            cookie名字
	 * @return
	 */
	public static Cookie getCookieByName(HttpServletRequest request, String name) {
		Map<String, Cookie> cookieMap = ReadCookieMap(request);
		if (cookieMap.containsKey(name)) {
			Cookie cookie = (Cookie) cookieMap.get(name);
			return cookie;
		} else {
			return null;
		}
	}

	/**
	 * 将cookie封装到Map里面(非接口方法)
	 * 
	 * @author guopengfei
	 * @param request
	 * @return
	 */
	private static Map<String, Cookie> ReadCookieMap(HttpServletRequest request) {
		Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
		Cookie[] cookies = request.getCookies();
		if (null != cookies) {
			for (Cookie cookie : cookies) {
				cookieMap.put(cookie.getName(), cookie);
			}
		}
		return cookieMap;
	}
	/**
	 * 获取请求中的session用户
	 * @param request
	 * @return
	 */
	public static User getSessionUser(HttpServletRequest request) {
		return (User) request.getSession().getAttribute(BlogConstraint.SESSION_USER);
	}
}

拦截器代码,此处仅仅处理了用户是否登陆,cookie是否存有用户信息,session中是否存在用户信息,cookie中保存的用户信息是否能够在系统中查找到该用户:

	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object arg2) throws Exception {
		String uri = request.getRequestURI();// 返回请求行中的资源名称
		String contextPath = request.getContextPath();
		User users = null;
		System.out.println("拦截URL为:\t" + uri);
		//获取session中的用户
		User utcUsers = (User) request.getSession().getAttribute(
				BlogConstraint.SESSION_USER);

		if(utcUsers !=null){
			System.out.println("session中存在用户");
			return true;
		}
		
		/*
		 * 注意:每次重新启动浏览器会重新启动一个sessionId和Cookie,之前设置的session会因为sessionId的变化而取不到,
		 * 所以会出现用户明明已经登录,但是重开浏览器又需要登录. 流程:
		 * 1、用户选择记住密码:取出cookie中的用户名和密码查询,如果此用户已不存在
		 * ,则清除cookie中的值,如果存在则判断用户是否重新登录,如果未重新登录则将cookie中用户信息设置到session中
		 * ,如果用户重新登录了则判断登录用户是否与cookie中用户一致
		 * ,一致则将cookie中用户信息设置到session中,不一致则将当前登录用户的信息设置到session中。
		 * 将用户信息放入session中是为了(通过cookie中的用户名密码可以得到用户信息):
		 * 1、重开浏览器的时候如果已经登录的用户可以直接进入
		 * 2、防止用户直接将执行方法的连接拷贝进地址栏,而方法中又需要在session中取用户信息的错误
		 * 2、用户未选记住密码:判断session中是否存在用户信息,如果存在,则true,如果不存在则返回登录页面
		 */
		Cookie cokLoginName = CookieTool.getCookieByName(request, "loginName");
		Cookie cokLoginPwd = CookieTool.getCookieByName(request, "loginPwd");
		// 如果前面的人登录勾选了记住密码,cookie中存在上一个人的信息
		if (cokLoginName != null && cokLoginPwd != null
				&& cokLoginName.getValue() != ""
				&& cokLoginPwd.getValue() != "") {
			String loginName = cokLoginName.getValue();
			String loginPwd = cokLoginPwd.getValue();

			// 检查到客户端保存了用户的密码,进行该账户的验证
			users = userDao.findUserByNameAndPwd(loginName,loginPwd);

			if (users == null) {
				//cookie中缓存的用户在数据库中不存在
				CookieTool.addCookie(response, "loginName", null, 0); // 清除Cookie
				CookieTool.addCookie(response, "loginPwd", null, 0); // 清除Cookie
			} else {
				// cookie中缓存的用户在数据库中存在
				request.getSession().setAttribute(
						BlogConstraint.SESSION_USER, users);
			}
		} 
		
		
}

用户点击登陆时的controller代码下面代码的含义是,当用户登录时勾选了name属性为“rememberPwd”的复选框时,传递到后台的值默认就是on,如果没勾选,值为空或者in,当用户勾选了记住我的选项,则将用户的信息保存进入session,同时设置cookie信息:

int  loginMaxAge = Integer.MAX_VALUE;   //定义账户密码的生命周期,这里是一个月。单位为秒  
String rememberPwd = request.getParameter("rememberPwd")==null?"":request.getParameter("rememberPwd").toString();  
if ("on".equals(rememberPwd)) {  
	 CookieTool.addCookie(response , "loginName" , user.getUserName() , loginMaxAge); //将姓名加入到cookie中  
	  CookieTool.addCookie(response , "loginPwd" , user.getPassword() , loginMaxAge);   //将密码加入到cookie中  
}
request.getSession().setAttribute(BlogConstraint.SESSION_USER, (User) map.get("user"));

记得用户点击退出登录时,需要将cokkie中的用户信息抹除:

	@RequestMapping("/singUp")
	public String singUp(HttpServletRequest request,HttpServletResponse response) {
		String prePage = request.getParameter("prePage");
		request.getSession().removeAttribute(BlogConstraint.SESSION_USER);
		CookieTool.addCookie(response, "loginName", null, 0); // 清除Cookie  
        CookieTool.addCookie(response, "loginPwd", null, 0); // 清除Cookie  
		if(prePage == null || prePage.trim().equals(""))
			prePage = "/";
		logger.info("退出时的当前页面为:" + prePage);
		return "redirect:" + prePage;
	}

至此,就完成了使用java设置浏览器cookie记住用户登录信息的功能。

分类   默认分组
字数   5615

博客标签    java记住用户登录信息   cookie记录用户登录密码   java设置cookie记录用户登录  

评论