[Tapestry4] 修改cookie时,必须跳转么? Form button提交的listener和button的onclick谁先执行?

baggiogamp 2007-04-13
我在一个Listener中修改cookie中的值,开始一直都改不了,后来才知道就是因为那个确定按钮的onclick调用了一个js函数(负责跳转到登陆页面)。我设断点跟踪,无论有没有js函数,都会运行Listener方法的代码,但如果加入该js函数对cookie的设置就不起作用(反之,则运行正常)。这是为什么啊?
js代码
function logOutForChangeSkin(){
//window.parent.location.href = "app";
}

.html
<select jwcid="userSkinSelection"  style="width:100px" ></select>
.page
    <component id="userSkinSelection" type="PropertySelection">
        <binding name="value" value="selectedSkin"/>
        <binding name="model" value="skinModel"/>
    </component>
.java
public void changeLocale(IRequestCycle cycle){
/* 其他操作*/
if(getSelectedSkin() != null){
if(userService.setUserSkin(userId,getSelectedSkin().getSkinId())){
sysConfig.put(SYSTEM_CSS_URL, getSelectedSkin().getURL());//add by wangbo 鏇存敼鐢ㄦ埛鐨偆
}
}
boolean hasCookie = false;
Cookie[] cookies = cycle.getRequestContext().getRequest().getCookies();
if(cookies != null){
    if("NOTFOUNDED".equals((CookieUtils.getCookieValue(cookies,"LMS_HOME_CSSURL","NOTFOUNDED")))){
    LongLivedCookie newCookie = new LongLivedCookie("LMS_HOME_CSSURL",getSelectedSkin().getURL());
    cycle.getRequestContext().getResponse().addCookie(newCookie);
    }else{
    hasCookie = true;
    LongLivedCookie newCookie = new LongLivedCookie("LMS_HOME_CSSURL",getSelectedSkin().getURL());
    cycle.getRequestContext().getResponse().addCookie(newCookie);
    }
}else{
LongLivedCookie newCookie = new LongLivedCookie("LMS_HOME_CSSURL",getSelectedSkin().getURL());
cycle.getRequestContext().getResponse().addCookie(newCookie);
}
/* =============================*/

}
我得出的结论是这样的:如果这个页面能顺利运行完(即不调用JS函数)可以实现修改cookie, 如果调用js函数跳转页面,则不能实现对cookie的修改
是不是对cookie的修改要到下个页面才生效啊?
baggiogamp 2007-04-16
这人怎么这么少啊!
tapestry 2007-04-16
cookie本来就是在response的时候加到客户本地浏览器里的呀
cycle.getRequestContext().getResponse().addCookie(newCookie);
baggiogamp 2007-04-17
tapestry 写道
cookie本来就是在response的时候加到客户本地浏览器里的呀
cycle.getRequestContext().getResponse().addCookie(newCookie);

我问的是:
    在那个按钮的onclick=function b() (js方法);按钮的lietener 为void c()(java方法)
我点击按钮时,两个方法都被执行了(设置断点看过了)。
function b(){
  window.parent.location = "/app"; //跳转到登陆页面
}
如果把上面这个方法(b)去掉,或者方法体为空,运行的结果都正确(可以对cookie惊醒修改),但加上window.parent.location = "/app"; 怎么就不行了呢?
tapestry 2007-04-17
不知道你为什么这么做,能说说你想实现的功能么。
我认为window.parent.location = "/app"; 重新改变了请求,上一次的请求根本没来的急reponse,个人观点。
baggiogamp 2007-04-18
要实现的功能是这样的:
换肤,把用户皮肤的路径(css文件路径)存储在cookie中。
在换肤功能页面的listener方法中改变cookie中的数据,同时把页面切换到登陆页面让用户重新登陆。因为这个换肤的页面是在一个iframe中的,所以换的只是这个页面的皮肤,没有改变(刷新)iframe外的页面。所以让iframe外的页面跳转到登陆页面。
我现在想到的解决方案是:在listener中跳转到另一个提示成功页面,在那个页面在跳转,这样就没问题了。就是不明白原来的的错在哪。。
tapestry 2007-04-18
Tapestry中对cookie的封装
@InjectObject("infrastructure:cookieSource")
public abstract CookieSource getCookieSource();

getCookieSource().writeCookieValue("name", "value", MAX_COOKIE_AGE);

提示成功页面response出来应该就可以写cookie,然后你可以设定5秒跳转,具体方法google一下,写meta的。
baggiogamp 2007-04-19
呵呵....谢谢拉!
但我原来的那种做法为什么不好用呢?明名跟踪到了:response.addCookie(c)了.这段代码走过就应该改变cookie的value了吧?为什么加那段js就不好用了呢?还是不太懂.. 没道理啊!
Global site tag (gtag.js) - Google Analytics