问题已经解决 写道
原因是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有没有影响……
新手请指教~!!
分享到:
- 2009-06-02 13:39
- 浏览 3279
- 评论(0)
- 论坛回复 / 浏览 (0 / 4019)
- 查看更多
相关推荐
Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。在Struts2中实现自动登录功能,通常涉及到利用Cookie来保存用户登录状态,以便在用户再次访问时能够快速恢复其身份。这个...
Struts2是一个强大的MVC(模型-视图-控制器)框架,被广泛应用于Java Web开发中,它提供了灵活的控制层结构,使开发者能够构建可维护、可扩展的Web应用程序。而Cookie是Web应用程序中常见的一种客户端存储机制,用于...
Struts2+cookie实现的购物车
这些特性后来都被融入到了Struts2中,使得Struts2不仅继承了WebWork的优点,还在此基础上进行了改进和扩展,成为了更加强大和灵活的框架。 ### Struts2的关键特性 1. **拦截器机制**:这是Struts2的核心概念之一,...
在使用Struts2进行开发之前,我们需要先将Struts2的jar包引入到项目中,这样才能利用其提供的API和服务。 Struts2的核心jar包通常包括以下几个部分: 1. **struts2-core.jar**:这是Struts2的核心库,包含了框架的...
"Struts2漏洞检查工具Struts2.2019.V2.3"是一个专门针对这些漏洞进行检测的工具,旨在帮助开发者和网络安全专业人员识别并修复Struts2框架中的安全问题。 Struts2的安全漏洞主要包括以下几类: 1. OGNL(Object-...
struts2中的国际化 struts2转化器 struts2实现表单数据校验 struts2的基石-拦截器 struts2中实现IOC struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2...
下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:Struts2是Apache软件基金会下的开源项目,它继承了Struts1的优点,并融合了WebWork框架的许多特性。Struts2的主要目标是...
文档中还会讲解如何使用Struts2的异常处理机制,以及如何调试和解决常见的运行时问题。 总的来说,这个压缩包对于想深入理解并熟练掌握Struts2框架的开发者来说是宝贵的资源。通过API文档可以了解框架的底层机制,...
Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试...
以上就是关于Struts2的一些基础知识点,学习Struts2不仅可以帮助理解MVC模式在实际应用中的工作原理,还能提升Java Web开发的技能。通过观看教学视频,结合实践操作,可以更好地掌握这些概念和技术。
- **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...
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框架不可或缺的工具,它能帮助开发者高效地理解和使用框架提供的各种组件和接口,提升开发效率,减少错误,并有助于深入理解MVC模式在实际项目中的应用。通过仔细研读...
struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...
- **适用范围**:Struts2广泛应用于企业级Java Web项目的开发中,特别是那些需要处理大量用户交互和数据展示的应用。 #### 二、Struts2入门案例 - **Hello Struts2**:通过创建一个简单的“Hello World”示例,...
Struts2 最新漏洞 S2-016、S2-017 修补方案 Struts2 是一个基于 Java 的 Web 应用程序框架,由 Apache 软件基金会维护。最近,Struts2 发生了两个严重的漏洞,分别是 S2-016 和 S2-017,这两个漏洞可能会导致攻击者...
"使用说明-jar包.txt"很可能是一个文本文件,提供了关于如何在项目中使用Struts2库的指导。通常,Struts2的核心库和其他依赖库会以JAR(Java Archive)文件的形式包含在项目中,这些JAR文件包含了框架的所有类和方法...
Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...