因项目需要,最近改用了cookie进行登录。下面详细解说一下,具体的使用。
我们都知道,cookie最重要的,一个是键值集合,一个是生命周期。它的特点在于前端和后台都可以轻松对其进行操作,当然这也导致了存在一定的安全隐患,所以,大多数主流网站,在用户体验上,比如说记住用户帐号和密码,会对用户进行安全提醒。
这里我们通过示例,讲cookie的基本操作方法,安全问题的补救方法后续再聊。分两部分,一是前端操作,二是后台操作。
一、前端代码:
1.定义cookie工具类,用于封装对cookie的操作。
function CookieUtil(){
}
CookieUtil.prototype={
support:function(){
var cookieEnable = (navigator.cookieEnable)?true:false;
if(typeof navigator.cookieEnable == "undefined" && !cookieEnable)
{
document.cookie="mycookie";
cookieEnable=(document.cookie.indexOf("mycookie")>-1)?true:false;
document.cookie="";
}
return cookieEnable;
},
set:function(key,value,time)
{
if(!this.support())
{
alert("当前浏览器设置不支持cookie,请启用cookie支持!");
return;
}
if(time==null)
{
time=1;
}
var edate= new Date();
edate.setDate(edate.getDate()+time);
document.cookie=key+"="+escape(value)+";expires="+edate;
},
get:function(key)
{
if(!this.support())
{
alert("当前浏览器设置不支持cookie,请启用cookie支持!");
return;
}
if(document.cookie.length>0)
{
var reg=new RegExp("(^| )"+key+"=([^;]*)(;|$)");
var arr= document.cookie.match(reg);
if(arr!=null&&arr.length>2)
{
return arr[2];
}
return null;
}
else
{
alert("读取cookie失败!")
}
}
}
2.在页面中调用工具类方法,来读取和设置cookie
function readCookies(){
var cookie = new CookieUtil();
var r =cookie.get("remember");
var u =cookie.get("username");
var p =cookie.get("password");
//记住密码设置
if(r=="on")
{
if(u!=null)
{
$("#username").val(u);
}
if(p!=null)
{
$("#password").val(p);
}
$("#remember").attr("checked","true");
}
}
设置的话,可以用下面的代码:
var cookie = new CookieUtil();
cookie.set("username","test")
或者
cookie.set("username","test",1)
二、后台代码
1.同样是定义操作工具类,这里用到了反射,通过反射来自动映射cookie
package com.yeegee.test;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.activation.FileDataSource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieUtil {
private static CookieUtil instance;
private CookieUtil() {
// TODO Auto-generated constructor stub
}
public static CookieUtil getInstance() {
if (instance == null)
instance = new CookieUtil();
return instance;
}
public 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);
}
public Cookie GetCookie(HttpServletRequest request, String name) {
Cookie[] cookie = request.getCookies();
for (Cookie c : cookie) {
if (c.getName().equals(name)) {
return c;
}
}
return null;
}
public Object CookieToObject(HttpServletRequest request, Class clazz) {
Object o = null;
try {
Field[] fields = clazz.getDeclaredFields();
o = clazz.newInstance();
for (Field field : fields) {
Cookie c = this.GetCookie(request, field.getName());
if (c != null) {
field.setAccessible(true);
field.set(o, c.getValue());
}
}
} catch (Exception e) {
}
return o;
}
public void ObjectToCookie(HttpServletResponse response, Object o) {
try {
Field[] fields = o.getClass().getDeclaredFields();
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), o.getClass());
Method m = pd.getReadMethod();
if (m != null&&m.invoke(o)!=null) {
String val = m.invoke(o).toString();
if (val != null) {
this.AddCookie(response, field.getName(), val, (12*60*60));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.调用时,以登录为例,先将object转成cookie存储在客户端,当登录之后,再获取信息,则从cookie转成object
//登录
CookieUtil cookie = CookieUtil.getInstance();
@RequestMapping("/checklogin")
@ResponseBody
public String CheckLogin(LoginUserEntity user) throws IOException
{
//TODO (省略逻辑代码)
cookie.ObjectToCookie(this.response, user);
}
//登录后
Object o=cookie.CookieToObject(req, LoginUserEntity.class);
//Object转成目标对象
LoginUserEntity user = (o==null?null:(LoginUserEntity)o);
到此,cookie的操作基本上介绍完了。个人认为,实践是最好的老师。希望各位新手朋友能自己动手,去理解其中的奥妙。