- 浏览: 212862 次
- 来自: ...
文章分类
最新评论
-
nbh219:
插件只有这几行代码吗jQuery.fn.dataTableEx ...
在Datatables中加入错误提示功能 -
radio123:
好用,谢了!就是有一点问题,如果DataGird 有分页栏,会 ...
JQuery Easy UI —— 如何让DataGrid自适应页面宽度 -
loafer:
这种方式是将工程发布为war还是ear?因为以前也这样写过,但 ...
Weblogic 10.3.6 解决Jar包冲突,hibernate等。 -
springdata:
spring data jpa相关代码demo下载:http: ...
Spring Data JPA 使用感受 -
coolboy09:
楼主,能否给个完整的例子?在下在用jqplot绘图时,在添加了 ...
jqPlot 实现动态显示数据,防止内存溢出的实现。
最近在研究如何将Membase NoSQL应用到Play! 框架中,需求主要是为了将一些用户状态,比如登录状态、页面操作状态等缓存起来。
众所周知,Play!是一个无状态的框架,意思就是Play!没有Session!但是使用过Play!的朋友一定知道Play!的Control里面是有一个session的,别急,这个session实际上并不是我们真正意义上的浏览器session,而是cookie哦!要理解这点,需要我们打开Play!的源码:
上面的代码很明显的看出,Play!的session操作实际上就是对cookie的操作。
但是对于我来说很不幸的事情并不是这点,而是play!的session是一个静态类!并且还是Scope里面的一个子类,这意味着我无法很轻易的替换它,除非修改这个类的源码。
这样我非常还念基于接口的编程,如果session是一个接口,而不是一个静态类,那么我就可以实现一个基于session接口的实现类,用于替换这个session类,这样的话,我就能将对membase的操作封装在session中,可以做到很灵活的扩展。
也许从中我们可以看出,play!在强调敏捷性的同时,失去了一定的灵活性,又或者,我对play!的了解还不够深入吧。
众所周知,Play!是一个无状态的框架,意思就是Play!没有Session!但是使用过Play!的朋友一定知道Play!的Control里面是有一个session的,别急,这个session实际上并不是我们真正意义上的浏览器session,而是cookie哦!要理解这点,需要我们打开Play!的源码:
/** * Session scope */ public static class Session { ...... static Session restore() { try { Session session = new Session(); Http.Cookie cookie = Http.Request.current().cookies.get(COOKIE_PREFIX + "_SESSION"); if (cookie != null && Play.started && cookie.value != null && !cookie.value.trim().equals("")) { String value = cookie.value; String sign = value.substring(0, value.indexOf("-")); String data = value.substring(value.indexOf("-") + 1); if (sign.equals(Crypto.sign(data, Play.secretKey.getBytes()))) { String sessionData = URLDecoder.decode(data, "utf-8"); Matcher matcher = sessionParser.matcher(sessionData); while (matcher.find()) { session.put(matcher.group(1), matcher.group(2)); } } if (COOKIE_EXPIRE != null) { // Verify that the session contains a timestamp, and that it's not expired if (!session.contains(TS_KEY)) { session = new Session(); } else { if (Long.parseLong(session.get(TS_KEY)) < System.currentTimeMillis()) { // Session expired session = new Session(); } } session.put(TS_KEY, System.currentTimeMillis() + (Time.parseDuration(COOKIE_EXPIRE) * 1000)); } else { // Just restored. Nothing changed. No cookie-expire. session.changed = false; } } else { // no previous cookie to restore; but we may have to set the timestamp in the new cookie if (COOKIE_EXPIRE != null) { session.put(TS_KEY, System.currentTimeMillis() + (Time.parseDuration(COOKIE_EXPIRE) * 1000)); } } return session; } catch (Exception e) { throw new UnexpectedException("Corrupted HTTP session from " + Http.Request.current().remoteAddress, e); } } Map<String, String> data = new HashMap<String, String>(); // ThreadLocal access boolean changed = false; public static ThreadLocal<Session> current = new ThreadLocal<Session>(); public static Session current() { return current.get(); } ...... void save() { if (Http.Response.current() == null) { // Some request like WebSocket don't have any response return; } if(!changed && SESSION_SEND_ONLY_IF_CHANGED && COOKIE_EXPIRE == null) { // Nothing changed and no cookie-expire, consequently send nothing back. return; } if (isEmpty()) { // The session is empty: delete the cookie if(Http.Request.current().cookies.containsKey(COOKIE_PREFIX + "_SESSION") || !SESSION_SEND_ONLY_IF_CHANGED) { Http.Response.current().setCookie(COOKIE_PREFIX + "_SESSION", "", null, "/", 0, COOKIE_SECURE, SESSION_HTTPONLY); } return; } try { StringBuilder session = new StringBuilder(); for (String key : data.keySet()) { session.append("\u0000"); session.append(key); session.append(":"); session.append(data.get(key)); session.append("\u0000"); } String sessionData = URLEncoder.encode(session.toString(), "utf-8"); String sign = Crypto.sign(sessionData, Play.secretKey.getBytes()); if (COOKIE_EXPIRE == null) { Http.Response.current().setCookie(COOKIE_PREFIX + "_SESSION", sign + "-" + sessionData, null, "/", null, COOKIE_SECURE, SESSION_HTTPONLY); } else { Http.Response.current().setCookie(COOKIE_PREFIX + "_SESSION", sign + "-" + sessionData, null, "/", Time.parseDuration(COOKIE_EXPIRE), COOKIE_SECURE, SESSION_HTTPONLY); } } catch (Exception e) { throw new UnexpectedException("Session serializationProblem", e); } } ...... }
上面的代码很明显的看出,Play!的session操作实际上就是对cookie的操作。
但是对于我来说很不幸的事情并不是这点,而是play!的session是一个静态类!并且还是Scope里面的一个子类,这意味着我无法很轻易的替换它,除非修改这个类的源码。
这样我非常还念基于接口的编程,如果session是一个接口,而不是一个静态类,那么我就可以实现一个基于session接口的实现类,用于替换这个session类,这样的话,我就能将对membase的操作封装在session中,可以做到很灵活的扩展。
也许从中我们可以看出,play!在强调敏捷性的同时,失去了一定的灵活性,又或者,我对play!的了解还不够深入吧。
发表评论
-
Java网络爬虫经验分享
2018-04-20 09:50 746最近三年很少写博客,虽然一直从事IT行业,但更多的是管理工作, ... -
亲测国外很快的Maven镜像
2016-11-23 14:29 4933亲测速度非常理想,并且不会像阿里的镜像很多包下载不下来。在自己 ... -
再谈Java获取classepath路径问题
2016-08-09 14:04 0网上很多文章介绍如何获取Java的classpath路径,这里 ... -
禁用HTML超链接URL的双击
2015-05-26 10:30 1043有时候我们希望控制用户在点击URL超链接的时候,只允许点击一次 ... -
Java中判断文件是否是图片文件
2014-08-17 23:20 18199使用Image读取文件时,如果是非图像文件,则会返回null。 ... -
Weblogic 10.3.6 解决Jar包冲突,hibernate等。
2014-07-06 16:30 7392Weblogic的jar包冲突困扰了我一段时间,一般使用的是如 ... -
javascript 动态显示家庭人物结构关系图
2014-01-07 23:53 7092<!DOCTYPE html PUBLIC &quo ... -
Jquery EasyUI中级篇
2013-12-23 16:08 2324JQuery EasyUI是一个很不错的Javascript开 ... -
JavaScript中,快速实现一个对象的复制!
2013-03-01 15:28 10361、第一种方式,通过JSON转换。 function cl ... -
Java路径问题解决方案汇集
2013-02-17 13:54 1503最近查看了网上很多关于路径问题资料大概总结了一下: Java ... -
EasyUI中,DataGrid的错误处理方式。
2013-02-06 17:06 0话说,JQuery EasyUI是一个非常优秀的JQuery框 ... -
再议JQuery中Ajax内存溢出问题。
2013-01-29 12:05 5816发现有人挺感兴趣Javascript中的内存溢出,本人经验发现 ... -
最近好新闻不断
2012-12-14 08:36 976Spring Framework 3.2 GA 发布 ... -
对jqplot的CategoryAxisRenderer插件进行扩展,底部Tick在鼠标在上时浮动显示名称。
2012-11-30 09:04 3411在前一篇文章中介绍了如何让jqplot的柱形图tick下标出现 ... -
zTree 如何自动选中节点
2012-11-20 13:40 6212下列代码可以使用在弹出树或者动态选中树的节点时使用: ... -
对jqplot的CategoryAxisRenderer插件进行扩展,让文字出现省略号
2012-10-19 15:45 2895喜欢用jqplot的朋友一定碰到图形下标文字很长,会出现相互之 ... -
在Datatables中加入错误提示功能
2012-10-08 17:32 15291经常用Datatables的童鞋一定碰到过当采用服务端请求的时 ... -
jqplot 实用技巧——重绘
2012-09-18 08:46 4342技巧一: 当浏览器窗体大小改变时: $('#resizab ... -
jqPlot 实现动态显示数据,防止内存溢出的实现。
2012-09-12 16:06 6528jqPlot是一个十分强大、 ... -
让你的Play framework 1.2 支持Ajax!
2012-08-16 15:14 3292相信正在使用Play Framework 1.2的朋友一定会碰 ...
相关推荐
The Learning Play! Framework 2 has been created for web developers that are building web applications. The core idea is to focus on the ...
这是本人学习play时自己整理的笔记,是对官方文档的简单汉化,对应的是1.x版本
学习Play!框架的好资料,英文版的,分享一下
play手册 play框架手册 play框架 play文档
japid源码,轻松学习japid,从这里开始,你的人生已经不同
play框架 2.1 api
play framework api,play! framework api,play api
对play!的CRUD 进行改造,改代码还会持续重构,并不完善。 1.将create,show,delete,list都改成@Util方法,可以类似 public static void show(String id){ MyCRUD.show(id); } 的方式调用。更通用。 2.增加@...
Play框架中文文档.pdf
play框架 ajax
PLAY框架入门级学习手册,有兴趣了解JAVA PLAY框架的可以看下
play框架的搭建步骤,是我自己学习的总结
11.在play框架里使用Ajax - 94 - 通过jsAction标签使用jQuery - 95 - 12. Internationalization国际化支持 - 96 - 仅使用 UTF-8! - 96 - 国际化你的信息 - 96 - 通过应用程序定义支持的语言 - 96 - 依照你的区域定义...
play框架是Java一站式web开发框架,附件是学习手册一份,帮助开发者快速上手该框架。
play框架jar包,java开发人员使用play框架开发项目时的必备jar包
Java程序员GuillaumeBort在JVM上创造了一个全新的框架Play framework。Play拥有ROR或Django那样的灵巧,又不失Java的稳定,更有JVM这一强大的运行平台。魔鬼身材,天使脸蛋。让我们来玩玩Play吧。
play框架基于CRDU的一个简单demo。附数据库文件。使用的是MySQL数据库。
Play框架手册