如果你调用下面这个javascript方法:
dwr.engine.setNotifyServerOnPageUnload(true);当页面被卸载(比如强制刷新页面,卸载再加载)时,将对ScriptSessionManager发出一个远程的DWR调用,通知它让ScriptSession失效。DWR通过这个默认的同步调用,可以很好地让ScriptSession失效。关闭浏览器时,此同步调用可能会导致延迟。如果不喜欢,你可以传递第二个参数给dwr.engine.setNotifyServerOnPageUnload:
dwr.engine.setNotifyServerOnPageUnload(true, true);第二个可选参数告诉DWR调用异步卸载器。
Container container = ServerContextFactory.get().getContainer(); ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);
public class TestScriptSessionFilter implements ScriptSessionFilter{ private String attributeName; public TestScriptSessionFilter(String attributeName){ this.attributeName = attributeName; } public boolean match(ScriptSession session){ Object check = session.getAttribute(attributeName); return (check != null && check.equals(Boolean.TRUE)); } }5.2 在ScriptSession上设置一个属性
//在使用Filter之前的某个时间添加一个属性到ScriptSession中 ScriptSession scriptSession = WebContextFactory.get().getScriptSession(); String attributeName = "attr"; scriptSession.setAttribute(attributeName, true);注:这必须是从DWR发起的一个线程(WebContextFactory需要它)。
5.3 在你的反向AJAX线程中使用ScriptSessionFilter
ScriptSessionFilter filter = new TestScriptSessionFilter(attributeName); Browser.withPageFiltered(page, filter, new Runnable(){ public void run(){ //调用DWR的Util类中的setValue方法,用页面上某个元素的ID作为第一个参数的值,第二个参数就是要设置给这个元素的值 Util.setValue("divID", "value of div"); } });或者调用一个命名函数:
ScriptSessionFilter filter = new TestScriptSessionFilter(attributeName); Browser.withPageFiltered(page, filter, new Runnable(){ public void run(){ // 调用你页面上的一个命名函数(js方法)。注:用ScriptsSessions.addFunctionCall // 发起这个函数调用的ScriptSessions要匹配TestScriptSessionFilter ScriptSessions.addFunctionCall("yourJavaScriptFunctionName", arg1, arg2, etc.); } });重要的是要注意几个Browser方法需要一个WebContext,请求必须来自DWR线程。目前这几个方法需要它:withCurrentPageFiltered,withCurrentPage和getTargetSessions.所有其它方法都能在非DWR线程里安全调用。
6. ScriptSession(在ScriptSession中设置区分属性)
区分用户在同一页上最常见的方式之一,是在ScriptSession上设置属性与在一个反向Ajax线程上获取它们。目前在ScriptSession上有两个最好的设置属性的方法:
6.1 调用一个远程的DWR方法
public void remoteMethod() { String value = "someValue"; // this may come from the HttpSession for example ScriptSession scriptSession = WebContextFactory.get().getScriptSession(); scriptSession.setAttribute("key", value); }6.2 使用ScriptSessions创建和销毁时,将通知ScriptSessionListener。有关详细信息,请参见ScriptSessionListener。
public void sessionCreated(ScriptSessionEvent ev) { HttpSession session = WebContextFactory.get().getSession(); String userId = (String) session.getAttribute("userId"); ev.getSession().setAttribute("userId", userId); }一旦ScriptSession已填充属性,反向Ajax线程可以使用Browser API(推荐)与ScriptSessionFilter来针对指定ScriptSession或从ScriptSession来检索属性来区分用户。
Container container = ServerContextFactory.get().getContainer(); ScriptSessionManager manager = container.getBean(ScriptSessionManager.class); ScriptSessionListener listener = new ScriptSessionListener() { public void sessionCreated(ScriptSessionEvent ev) { HttpSession session = WebContextFactory.get().getSession(); String userId = (String) session.getAttribute("userId"); ev.getSession().setAttribute("userId", userId); } public void sessionDestroyed(ScriptSessionEvent ev) { } }; manager.addScriptSessionListener(listener);这里要注意的是,必须在DWR已初始化后添加ScriptSessionListeners。通常有两种方法做到这一点: