java如何改变java获取cookie值的值

java操作cookie遇到中文会报错的解决方案 - 面向对象 - ITeye技术网站
博客分类:
项目当中用到cookie保存中文,但是会报如下错误:
Control character in cookie value, consider BASE64 encoding your value
大概意思是保存到cookie当中的值存在控制字符,无法保存。但实际上数据是不存在这种问题的。再看后面的那句话,好像是将要保存的值进行了base64编码,可能是因为中文在编码时出现乱码导致一些控制字符的出现。
解决方案:将要保存的值进行URLEncoder.encode(value,"utf-8")编码。
在提取时,同样进行解码:
* 添加一个cookie值
* @param name 名称
* @param value 值
* @param time
cookie的有效期
* @param response 保存cookie的对象
public static void setCookie(String name, String value, Integer time,HttpServletResponse response) {
value = URLEncoder.encode(value,"UTF-8");
} catch (UnsupportedEncodingException e) { }
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
cookie.setMaxAge(time);
response.addCookie(cookie);
* 根据name值,从cookie当中取值
* @param name
要获取的name
* @param request cookie存在的对象
* @return 与name对应的cookie值
public static String getCookie(String name, HttpServletRequest request) {
Cookie[] cs = request.getCookies();
String value = "";
if (cs != null) {
for (Cookie c : cs) {
if (name.equals(c.getName())) {
value = URLDecoder.decode(c.getValue(),"UTF-8");
} catch (UnsupportedEncodingException e) {
浏览: 230142 次
来自: 上海
同步请求不是回执行完,再接着往下走么?不然怎么叫同步。
挺好 稍微改点就能用
String str = &11&script ...
mons.lang.StringU ...查看:34024|回复:9
高级工程师
今天做一个项目就是有一个记住用户名的,选中复选框则记住用户名和密码,下次登录的时候就方便用户名的登陆:
package com.laizhi.
import java.io.IOE
import java.io.PrintW
import java.io.UnsupportedEncodingE
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.http.C
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
import java.security.MessageD
import java.security.NoSuchAlgorithmE
import com.laizhi.bean.U
import com.laizhi.dao.UserDAO;
import com.laizhi.factory.DaoImplF
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
public class CookieUtil {
& && & //保存cookie时的cookieName
& && & private final static String cookieDomainName = “laizhi”;
& && & //加密cookie时的网站自定码
& && & private final static String webKey = “123456”;
& && & //设置cookie有效期是两个星期,根据需要自定义
& && & private final static long cookieMaxAge = 60 * 60 * 24 * 7 * 2;
& && & //保存Cookie到客户端-------------------------------------------------------------------------
& && & //在CheckLogonServlet.java中被调用
& && & //传递进来的user对象中封装了在登陆时填写的用户名与密码
& && & public static void saveCookie(User user, HttpServletResponse response) {
& && && && &&&//cookie的有效期
& && && && &&&long validTime = System.currentTimeMillis() + (cookieMaxAge * 5000);
& && && && &&&//MD5加密用户详细信息
& && && && &&&String cookieValueWithMd5 =getMD5(user.getUserName() + &:& + user.getPassword()
& && && && && && && && && & + &:& + validTime + &:& + webKey);
& && && && &&&//将要被保存的完整的Cookie值
& && && && &&&String cookieValue = user.getUserName() + &:& + validTime + &:& + cookieValueWithMd5;
& && && && &&&//再一次对Cookie的值进行BASE64编码
& && && && &&&String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes()));
& && && && &&&//开始保存Cookie
& && && && &&&Cookie cookie = new Cookie(cookieDomainName, cookieValueBase64);
& && && && &&&//存两年(这个值应该大于或等于validTime)
& && && && &&&cookie.setMaxAge(60 * 60 * 24 * 365 * 2);
& && && && &&&//cookie有效路径是网站根目录
& && && && &&&cookie.setPath(&/&);
& && && && &&&//向客户端写入
& && && && &&&response.addCookie(cookie);
& && & //读取Cookie,自动完成登陆操作----------------------------------------------------------------
& && & //在Filter程序中调用该方法,见AutoLogonFilter.java
& && & public static void readCookieAndLogon(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException,UnsupportedEncodingException{
& && & //根据cookieName取cookieValue
& && & Cookie cookies[] = request.getCookies();
& && && && && && && &String cookieValue =
& && && && && && && &if(cookies!=null){
& && && && && && && && && & for(int i=0;i
& && && && && && && && && && && &&&if (cookieDomainName.equals(cookies[i].getName())) {
& && && && && && && && && && && && && && &cookieValue = cookies[i].getValue();
& && && && && && && && && && && && && && &
& && && && && && && && && && && &&&}
& && && && && && && && && & }
& && && && && && && &}
& && && && && && && &//如果cookieValue为空,返回,
& && && && && && && &if(cookieValue==null){
& && && && && && && && && &
& && && && && && && &}
& && && && &&&//如果cookieValue不为空,才执行下面的代码
& && && && &&&//先得到的CookieValue进行Base64解码
& && && && &&&String cookieValueAfterDecode = new String (Base64.decode(cookieValue),&utf-8&);
& && && && &&&//对解码后的值进行分拆,得到一个数组,如果数组长度不为3,就是非法登陆
& && && && &&&String cookieValues[] = cookieValueAfterDecode.split(&:&);
& && && && &&&if(cookieValues.length!=3){
& && && && && && && &response.setContentType(&text/charset=utf-8&);
& && && && && && && &PrintWriter out = response.getWriter();
& && && && && && && &out.println(&你正在用非正常方式进入本站...&);
& && && && && && && &out.close();
& && && && && && && &
& && && && &&&}
& && && && &&&//判断是否在有效期内,过期就删除Cookie
& && && && &&&long validTimeInCookie = new Long(cookieValues[1]);
& && && && &&&if(validTimeInCookie & System.currentTimeMillis()){
& && && && && && && &//删除Cookie
& && && && && && && &clearCookie(response);
& && && && && && && &response.setContentType(&text/charset=utf-8&);
& && && && && && && &PrintWriter out = response.getWriter();
& && && && && && && &out.println(&&);你的Cookie已经失效,请重新登陆
& && && && && && && &out.close();
& && && && && && && &
& && && && &&&}
& && && && &&&//取出cookie中的用户名,并到数据库中检查这个用户名,
& && && && &&&String username = cookieValues[0];
& && && && &&&
& && && && &&&//根据用户名到数据库中检查用户是否存在
& && && && &&&UserDAO ud = DaoImplFactory.getInstance();
& && && && &&&User user = ud.selectUserByUsername(username);
& && && && &&&//如果user返回不为空,就取出密码,使用用户名+密码+有效时间+ webSiteKey进行MD5加密
& && && && &&&if(user!=null){
& && && && && && && &String md5ValueInCookie = cookieValues[2];
& && && && && && && &String md5ValueFromUser =getMD5(user.getUserName() + &:& + user.getPassword()
& && && && && && && && && && && &&&+ &:& + validTimeInCookie + &:& + webKey);
& && && && && && && &//将结果与Cookie中的MD5码相比较,如果相同,写入Session,自动登陆成功,并继续用户请求
& && && && && && && &if(md5ValueFromUser.equals(md5ValueInCookie)){
& && && && && && && && && & HttpSession session = request.getSession(true);
& && && && && && && && && & session.setAttribute(&user&, user);
& && && && && && && && && & chain.doFilter(request, response);
& && && && && && && &}
& && && && &&&}else{
& && && && &&&//返回为空执行
& && && && && && && &response.setContentType(&text/charset=utf-8&);
& && && && && && && &PrintWriter out = response.getWriter();
& && && && && && && &out.println(&cookie验证错误!&);
& && && && && && && &out.close();
& && && && && &
& && && && & }
& && & //用户注销时,清除Cookie,在需要时可随时调用-----------------------------------------------------
& && & public static void clearCookie( HttpServletResponse response){
& && && && &&&Cookie cookie = new Cookie(cookieDomainName, null);
& && && && &&&cookie.setMaxAge(0);
& && && && &&&cookie.setPath(&/&);
& && && && &&&response.addCookie(cookie);
//获取Cookie组合字符串的MD5码的字符串----------------------------------------------------------------
& && && && &&&public static String getMD5(String value) {
& && && && && && && &String result =
& && && && && && && &try{
& && && && && && && && && & byte[] valueByte = value.getBytes();
& && && && && && && && && & MessageDigest md = MessageDigest.getInstance(&MD5&);
& && && && && && && && && & md.update(valueByte);
& && && && && && && && && & result = toHex(md.digest());
& && && && && && && &} catch (NoSuchAlgorithmException e2){
& && && && && && && && && & e1.printStackTrace();
& && && && && && && &}
& && && && && && && &
& && && && &&&}
& && &//将传递进来的字节数组转换成十六进制的字符串形式并返回
& && && && &&&private static String toHex(byte[] buffer){
& && && && && && && &StringBuffer sb = new StringBuffer(buffer.length * 2);
& && && && && && && &for (int i = 0; i & buffer. i++){
& && && && && && && && && & sb.append(Character.forDigit((buffer[i] & 0xf0) && 4, 16));
& && && && && && && && && & sb.append(Character.forDigit(buffer[i] & 0x0f, 16));
& && && && && && && &}
& && && && && && && &return sb.toString();
& && && && &&&}
学习一下了!
高级工程师
引用:原帖由 ChenYuan_QQ 于
17:10 发表
学习一下了! ありがとうございます支持!
太阳光芒万丈却不及蜡烛只为一人照亮、、、
学习,顶起。
高级工程师
引用:原帖由 黑基蚂蚁 于
23:08 发表
学习,顶起。 (*^__^*) 嘻嘻……ありがとうございます
太阳光芒万丈却不及蜡烛只为一人照亮、、、
中级工程师
你这个能不能保存记住百度的账号密码?
你这个是模拟的,还是实际的?
高级工程师
引用:原帖由 kaluosi0 于
10:41 发表
你这个能不能保存记住百度的账号密码?
你这个是模拟的,还是实际的? 实际的,这个可以用,如果你做一个简单的百度登录页面可以把他用上,,,嘿嘿,,,
希望对你有帮助!!!
太阳光芒万丈却不及蜡烛只为一人照亮、、、
DaoImplFactory和selectUserByUsername里面的代码是什么???
还有其他代码呢传智播客旗下品牌:& & | && | &
改变中国IT教育,我们正在行动 &&&&全国咨询热线:400-618-4000
全国校区 
传智播客官方微信
黑马程序员官方微信
400-618-4000java中cookie的操作(通过cookie实现简单的单点登录)
(一)取得cookie中的相关信息
cookies = request.getCookies();
&&& String
username = "";
&&& String
password = "";
&&& if (cookies
!= null) {
&&& for (int i =
0; i & cookies. i++) {
&&& Cookie c =
cookies[i];
(c.getName().equalsIgnoreCase("xabpoUsername")) {
&&& username =
c.getValue();
&&& } else if
(c.getName().equalsIgnoreCase("xabpoPassword")) {
&&& password =
c.getValue();
(二)将登陆用户的用户名和密码保存到cookie中
Cookie cookieUsername = new
Cookie("xabpoUsername",userForm.getUserID());
Cookie cookiePassword = new
Cookie("xabpoPassword",userForm.getPassword())&&
cookieUsername.setMaxAge(60*60*24); //设定有效时间
cookiePassword.setMaxAge(60*60*24);
cookieUsername.setPath("/");
cookiePassword.setPath("/");
cookieUsername.setDomain("."); //
设定有效域
cookiePassword.setDomain(".");
response.addCookie(cookieUsername);
response.addCookie(cookiePassword);
(三)退出登录的时候将cookie删除
cookies=request.getCookies();
&&& if (cookies
!= null) {
&&& for (int i =
0; i & cookies. i++) {
&&& String
cookieName = cookies[i].getName();
(cookieName.equals("xabpoUsername")
cookieName.equals("xabpoPassword")) {
&&& cookies[i].setValue(null);
&&& cookies[i].setPath("/");
&&& cookies[i].setMaxAge(0);
&&& response.addCookie(cookies[i]);
}catch(Exception e)
LogUtil.error(this.getClass(), e.getMessage(), e);
删除的时候上面标红的几段比较重要
(1)设为null这句如果没有的话,如果你退出登录的逻辑后紧跟着一个从cookie中取值的操作,这时就
能从cookie中取到删除过的值。
(2)cookies[i].setPath("/");这句,如果不和设定cookie的时候的path不对应起来,就有删不掉cookie的可能。
(3)cookies[i].setMaxAge(0);这个就是设定该cookie立马过期的操作。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 java修改cookie的值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信