天天看点

cookie java 对象_Java对象详解之cookie使用(初级)

因项目需要,最近改用了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的操作基本上介绍完了。个人认为,实践是最好的老师。希望各位新手朋友能自己动手,去理解其中的奥妙。