`
gavinxixi
  • 浏览: 21589 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Struts2中的Cookie疑问

阅读更多
问题已经解决 写道
原因是IE只能接受Expires字段来控制过期时间,真奇怪,是不是大家看不起这样的问题竟然没人回答。
 String[] d = date.toString().split(" ");
             //IE的日期格式 Fri, 27-Aug-2010 02:38:12 GMT
             //格式化日期
             SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z",Locale.US);
             sdf.setTimeZone(TimeZone.getTimeZone("Etc/Greenwich"));
             //String expires = d[0]+", "+d[2]+"-"+d[1]+"-"+d[5]+" "+d[3]+" "+d[4];
             String expires = sdf.format(date);
             response.setHeader("Set-Cookie",AuthorizationInterceptor.COOKIE_REMEMBERME_KEY + "=\""+cookie.getValue()+"; Max-Age="+cookie.getMaxAge()+"; Path="+cookie.getPath()+";expires="+expires);
 

 

 

我最近在做Struts2的登录权限验证,使用总所周知的Cookie保存用户登陆状态。

实际过程中发现Cookie并不起效,关闭浏览器后即失效。


这是LoginAction的execute方法,Cookie是使用ServletActionContext的Response添加的

在服务器打印Cookie信息正常如下:

true
NEW cookie:37 123

 

	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println(rememberMe);
		User u = new User();
		User u2 = null;
		u.setUsername(this.getUsername());
		u.setPassword(this.getPassword());
		Query q = session.createQuery("from User where username='"
				+ this.getUsername() + "'");
		if (q.list().size() == 1)
			u2 = (User) (q.list().get(0));
		session.close();
		if (u.getUsername().equals(u2.getUsername())
				&& u.getPassword().equals(u2.getPassword())) {
			ActionContext.getContext().getSession().put("id", u2.getId());
			ActionContext.getContext().getSession().put(
					AuthorityInterceptor.USER_SESSION_KEY, u2.getUsername());
			ActionContext.getContext().getSession().put("usertype",
					u2.getUsertype());
			HttpServletResponse response = (HttpServletResponse) ActionContext
					.getContext().get(StrutsStatics.HTTP_RESPONSE);
			if (Boolean.valueOf(rememberMe)) {
				Cookie cookie = new Cookie(
						AuthorityInterceptor.COOKIE_REMEMBERME_KEY, u2.getId()
								+ "==" + password);
				cookie.setMaxAge(60 * 60 * 24 * 14);
				System.out.println("NEW cookie:" + u2.getId() + " " + password);
				ServletActionContext.getResponse().addCookie(cookie);
			}
			String goingToURL = (String) ActionContext.getContext()
					.getSession().get(AuthorityInterceptor.GOING_TO_URL_KEY);
			if (StringUtils.isNotBlank(goingToURL)) {
				setGoingToURL(goingToURL);
				ActionContext.getContext().getSession().remove(
						AuthorityInterceptor.GOING_TO_URL_KEY);
			} else {
				setGoingToURL("index.action");
			}
			if (u.getUsertype() == 1)
				return "jobp";
			else if (u.getUsertype() == 0)
				return "jobh";
			else
				return "joba";
		} else {
			return LOGIN;
		}
	}

 

下面是LogoutAction的execute方法,用于清除session和Cookie。

在浏览器未关闭是调用此Action,返回是正常的,也就是可以根据Cookie的Key正确的找到Cookie并删除。

输出:

2            //这个是get到的Cookie个数,我也不明白为什么这么小,我电脑实际储存了大量Cookie
cookie removed!

 

public String execute() throws Exception {
		// TODO Auto-generated method stub
		Map session = ActionContext.getContext().getSession();
		HttpServletRequest request= (HttpServletRequest) ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
		HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(StrutsStatics.HTTP_RESPONSE);
		if (session!=null)   {
			session.remove(AuthorityInterceptor.USER_SESSION_KEY); 
			session.remove("id"); 
			session.remove("usertype"); 
		}  
              
        Cookie[] cookies = request.getCookies();
        System.out.println(cookies.length);
        if (cookies!=null) {      
            for (Cookie cookie : cookies) {      
                if (AuthorityInterceptor.COOKIE_REMEMBERME_KEY.equals(cookie.getName())) {
                	System.out.println("cookie removed!");
                    cookie.setValue("");      
                    cookie.setMaxAge(0);      
                    response.addCookie(cookie);      
                    return "login";      
                }      
            }      
        }      
        return "login";
	}

 

下面是权限控制的Interceptor,拦截了需要登陆的Action,是能够成功拦截的,同样在浏览器关闭后就找不到Cookie了

 

private static final long serialVersionUID = 1L;
public static final String USER_SESSION_KEY="username";      
public static final String COOKIE_REMEMBERME_KEY="gavin.cookie.rememberme";      
    public static final String GOING_TO_URL_KEY="GOING_TO";

public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		ActionContext actionContext = invocation.getInvocationContext();
        HttpServletRequest request= (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);      
              
        Map session = actionContext.getSession();      
        if (session != null && session.get(USER_SESSION_KEY) != null){      
            return invocation.invoke();      
        }
              
        Cookie[] cookies = ServletActionContext.getRequest().getCookies();
        if (cookies!=null) { 
            for (Cookie cookie : cookies) {  
            	System.out.println(cookie.getName());
                if (COOKIE_REMEMBERME_KEY.equals(cookie.getName())) {      
                    String value = cookie.getValue(); 
                    System.out.println(value);
                    if (StringUtils.isNotBlank(value)) {      
                        String[] split = value.split("==");      
                        String userName = split[0];      
                        String password = split[1];
                        System.out.println("cookie:"+userName+" "+password);
                        try {      
                            User user = null;
                            Query q = se.createQuery("from User where id='"+userName+"'");		
                    		if(q.list().size()==1) user= (User)(q.list().get(0));
                    		if (user != null) {
                    			if(user.getPassword().equals(password)) {
                    				session.put("id" , user.getId());
                    				session.put(USER_SESSION_KEY , user.getUsername());
                    				session.put("usertype" , user.getUsertype());
                    			}
                    		}
                        } catch (Exception e) {      
                            setGoingToURL(session, invocation);      
                            return "login";      
                        }      
                    } else {      
                        setGoingToURL(session, invocation);      
                        return "login";      
                    }      
                    return invocation.invoke();      
                }      
            }      
        }      
        setGoingToURL(session, invocation);      
        return "login";
	}

 

检查一下IE的临时文件夹也没有发现相应的Cookie文件,应该是Cookie没有写入成功,Struts2的ServletResponse也不是直接的,不知道有没有影响。也不知道Localhost有没有影响……

 

新手请指教~!!

分享到:
评论

相关推荐

    struts2用cookie实现自动登录中用过滤器执行读取上下文方法

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。在Struts2中实现自动登录功能,通常涉及到利用Cookie来保存用户登录状态,以便在用户再次访问时能够快速恢复其身份。这个...

    struts2与cookie实现自动登录

    Struts2是一个强大的MVC(模型-视图-控制器)框架,被广泛应用于Java Web开发中,它提供了灵活的控制层结构,使开发者能够构建可维护、可扩展的Web应用程序。而Cookie是Web应用程序中常见的一种客户端存储机制,用于...

    Struts2+cookie实现的购物车

    Struts2+cookie实现的购物车

    struts2中文学习文档

    这些特性后来都被融入到了Struts2中,使得Struts2不仅继承了WebWork的优点,还在此基础上进行了改进和扩展,成为了更加强大和灵活的框架。 ### Struts2的关键特性 1. **拦截器机制**:这是Struts2的核心概念之一,...

    struts2jar包

    在使用Struts2进行开发之前,我们需要先将Struts2的jar包引入到项目中,这样才能利用其提供的API和服务。 Struts2的核心jar包通常包括以下几个部分: 1. **struts2-core.jar**:这是Struts2的核心库,包含了框架的...

    Struts2漏洞检查工具Struts2.2019.V2.3

    "Struts2漏洞检查工具Struts2.2019.V2.3"是一个专门针对这些漏洞进行检测的工具,旨在帮助开发者和网络安全专业人员识别并修复Struts2框架中的安全问题。 Struts2的安全漏洞主要包括以下几类: 1. OGNL(Object-...

    struts2帮助文档

    struts2中的国际化 struts2转化器 struts2实现表单数据校验 struts2的基石-拦截器 struts2中实现IOC struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2...

    留言板留言板struts2留言板struts2

    下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:Struts2是Apache软件基金会下的开源项目,它继承了Struts1的优点,并融合了WebWork框架的许多特性。Struts2的主要目标是...

    Struts2-API+Struts2中文帮助文档

    文档中还会讲解如何使用Struts2的异常处理机制,以及如何调试和解决常见的运行时问题。 总的来说,这个压缩包对于想深入理解并熟练掌握Struts2框架的开发者来说是宝贵的资源。通过API文档可以了解框架的底层机制,...

    Struts2漏洞测试

    Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试...

    Struts2教学视频

    以上就是关于Struts2的一些基础知识点,学习Struts2不仅可以帮助理解MVC模式在实际应用中的工作原理,还能提升Java Web开发的技能。通过观看教学视频,结合实践操作,可以更好地掌握这些概念和技术。

    struts1和struts2的区别

    - **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...

    struts2-core.jar

    struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...

    struts2项目开发

    在 Struts2 项目开发中,需求分析是非常重要的一步。通过对项目的需求分析,可以确定项目的功能需求、性能需求、安全需求等。例如,在个人信息管理系统中,需要分析用户的需求,例如登录与注册、个人基本信息管理、...

    Struts2接口文档

    总的来说,Struts2接口文档是学习和使用Struts2框架不可或缺的工具,它能帮助开发者高效地理解和使用框架提供的各种组件和接口,提升开发效率,减少错误,并有助于深入理解MVC模式在实际项目中的应用。通过仔细研读...

    struts2 总结工程大全

    struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...

    Struts2视频教程

    - **适用范围**:Struts2广泛应用于企业级Java Web项目的开发中,特别是那些需要处理大量用户交互和数据展示的应用。 #### 二、Struts2入门案例 - **Hello Struts2**:通过创建一个简单的“Hello World”示例,...

    struts2 最新漏洞 S2-016、S2-017修补方案 .docx

    Struts2 最新漏洞 S2-016、S2-017 修补方案 Struts2 是一个基于 Java 的 Web 应用程序框架,由 Apache 软件基金会维护。最近,Struts2 发生了两个严重的漏洞,分别是 S2-016 和 S2-017,这两个漏洞可能会导致攻击者...

    struts2jar.zip

    "使用说明-jar包.txt"很可能是一个文本文件,提供了关于如何在项目中使用Struts2库的指导。通常,Struts2的核心库和其他依赖库会以JAR(Java Archive)文件的形式包含在项目中,这些JAR文件包含了框架的所有类和方法...

    Struts 2中文帮助文档

    Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

Global site tag (gtag.js) - Google Analytics