Cookie和Session的使用——登录、自动登录、注销登录(实例)

登录用户(使用session在页面判断)

验证用户提交的登录信息后,如何在后续页面判断登录状态(以控制访问权限等),这里使用session变量来表示登录状态。登录成功后,将用户信息封装起来(这里使用的是一个javabean)存放到session中。在需要进行权限登录验证的页面通过获取该session标记“loginUser”来判断是否是登录状态。request.getSession().setAttribute("loginUser",loginUser);

本项目中,在每个页面右上角都会显示登录和注册选项,当用户处于登录状态时会显示用户名的信息。当然该部分用include标签简化(分块设计,在页面分块设计中有相关说明),使用仅用设置一处即可。判断登录状态的核心代码(jstl方式)如下:

<c:choose>
	<c:when test="${islogin eq 'false'}">
		非登录状态显示的信息
	</c:when>
	<c:otherwise>
		登录状态显示的信息
	</c:otherwise>
</c:choose>
其中islogin是在页面中判断登录标志Javabean(loginUser)是否为空来说明的一个标志字段。

设置自动登录(登录时写入cookie)

自动登录是通过在用户通过账号、密码登录是,是在cookie来实现的。为了让用户感觉不到登录的过程,本项目采用的是在在过滤器(filter)中判断是否满足自动登录条件,若满足便自动登录。具体实现是设置表示用户信息的唯一编码(本项目中使用用户唯一id及用户名加上干扰字符生成的字符串)到cookie,每次访问请求在判断登录标志为空的情况下继续判断cookie的信息是否有满足自动登录的项。并对信息进行处理确保登录用户的有效性。在信息验证成功后,要对登录标志进行相应的处理(将loginUser写入cookie中)。

下面是保存cookie信息的核心部分:

//设置cookie保持登录状态
//对用户信息编码(用户名和id)在非登录状态进行自动登录处理。
String value="msg_ic"+loginUser.getMnumber()+"msg_ic"+loginUser.getMname()+"msg_ic";
Cookie cookie = new Cookie(URLEncoder.encode("idvaluename"),URLEncoder.encode(value));
cookie.setMaxAge(60*60*24*7);//保存用户cookie7天
cookie.setPath("/graduation_project");//设置有效范围
response.addCookie(cookie);

下面是在过滤器中提取相关信息实现自动登录的核心思路(对登录状态以及cookie中保存的信息编码(idvaluename)的获取这里不再进行说明):

int mnumber=Integer.parseInt(idvaluename.split("msg_ic")[1]);//对字符串拆分,获取id和用户名
String mname=idvaluename.split("msg_ic")[2];
//上述信息验证成功,登录成功后设置session变量,在每个页面使用(检测登录状态等)
MemberDao memberDao=new MemberDao();
MemberOutInfo loginUser=memberDao.getmemberOutInfoByMnumberAndMname(mnumber,mname);
if(loginUser!=null){    //验证cookie中的信息是否正确
    req.getSession().setAttribute("loginUser",loginUser);
} 

注销登录(清除cookie以及session域的标识Javabean)

注销登录即对登录标志(loginUser)、cookie中自动登录字段(idvaluename)进行处理。使当前用户,即客户端(因为自动登录的使用,所以这里使用客户端的“非登录状态”)处于非登录状态。

//移除用来标志登录的session变量loginUser
request.getSession().removeAttribute("loginUser");
//移除自动登录的cookie变量idvaluename
//注销该会话
request.getSession().invalidate();
//注销cookie(通过设置过期时间为0)
Cookie cookie = new Cookie(URLEncoder.encode("idvaluename"),"0");
cookie.setMaxAge(0);//设置有效期0即删除cookie
cookie.setPath("/graduation_project");
response.addCookie(cookie);

登录、注销、注册后跳转到之前的页面

这里在每次请求(除登录、注销、注册操作)时设置session变量(reurl)保存请求的url,这样在进行登录、注销、注册后就可以获取相应的session变量(reurl)来跳转到最后请求的url。这样做的一个好处是,无需在登录、注销、注册页面设置相应的跳转参数(这样做同样是繁琐的,对于转发的请求可以会带来一些新的问题)即可以跳转到之前的访问页面

//获取session变量,将要跳转的位置
String gotourl=request.getSession().getAttribute("reurl").toString();
if(gotourl==null)gotourl="/graduation_project/";  //设置默认的跳转页面
try {
    response.sendRedirect(gotourl);
} catch (IOException e) { e.printStackTrace();
}

使用cookie保存登录信息(最后一次登录时间,ip等)

只需要在每次请求对相应的cookie进行设置即可。

这里仅提供一种通过System类中的currentTimeMillis方法来获取当前时间的方法:SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   System.out.println(df.format(System.currentTimeMillis()));

对于获取ip的方法,这里不再进行说明。

新加评论 评论标题:

登录用户(使用eio在页面判断)
设置自动登录(登录时写入cookie)
注销登录(清除cookie以及eio域的标识Jvbe)
登录、注销、注册后跳转到之前的页面
使用cookie保存登录信息(最后一次登录时间,i等)