文档章节

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

xiaobo137
 xiaobo137
发布于 2016/07/06 10:47
字数 808
阅读 20
收藏 1

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

© 著作权归作者所有

xiaobo137
粉丝 35
博文 64
码字总数 33309
作品 0
长沙
项目经理
私信 提问
JavaEE程序员必读图书大推荐

下面是我根据多年的阅读和实践经验,给您推荐的一些图书: 第一部分: Java语言篇 1 《Java编程规范》 星级: 适合对象:初级,中级 介绍:作者James Gosling(Java之父),所以这本书我觉得...

长平狐
2012/11/12
1K
0
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
223
0
真实项目中 ThreadLocal 的妙用

一、什么是 ThreadLocal ThreadLocal 提供了线程的局部变量,每个线程都可以通过 set() 和 get() 来对这个局部变量进行操作,但不会和其他线程的局部变量冲突,实现了线程间的据隔离。 简单讲...

泥瓦匠BYSocket
07/07
161
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
268
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
49分钟前
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
78
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部