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

转载于:https://my.oschina.net/u/2457585/blog/706842

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值