play框架知识
来源:互联网 发布:用淘宝助理上传宝贝 编辑:程序博客网 时间:2024/05/13 08:05
拦截器(Interceptions)
一个controller可以定义多个拦截器方法。拦截器作用于一个controller及其所有子类的所有action方法上。对于定义一些所有action共用的操作时,使用拦截器非常有用,比如:检查用户是否已经登录(有没有访问权),截入request范围内的数据,等等。
这些方法必须为static,但不一定是public。你必须给它们增加合适的注解以表明它们是拦截器。
@Before
如果方法上有@Before注解,则它将在该controller中的每一个action被调用前被执行。
所以可以进行一下安全检查:
- public class Admin extends Application {
- @Before static void checkAuthentification() {
- if(session.get(“user”) == null) login();
- }
- public static void index() {
- List users = User.findAll();
- render(users);
- }
- …
- }
如果你想给某些方法开绿灯,可按下面的方法排除一些action:
- public class Admin extends Application {
- @Before(unless=“login”) //对login()方法不做拦截检查
- static void checkAuthentification() {
- if(session.get(“user”) == null) login();
- }
- public static void index() {
- List users = User.findAll();
- render(users);
- }
- …
- }
或者仅对于某些方法调用该拦截器,可使用“only”:
- public class Admin extends Application {
- @Before(only={“login”,“logout”}) //只对拦截退出方法做拦截检查
- static void doSomething()
- {
- …
- }
- …
- }
@After, @Before 和 @Finally这三个注解,都提供了unless 和only 参数。
@After
使用@After注解的方法,将在该Controller中的每一个action之后被调用。
- public class Admin extends Application {
- @After static void log(){
- Logger.info(“Action executed ...”);
- }
- public static void index() {
- List users = User.findAll();
- render(users);
- }
- … }
@Catch
使用了@Catch注解的方法,将会在某个抛出了它所指定的异常时,被调用。异常类型将被传入到@Catch方法的参数中。
- public class Admin extends Application {
- @Catch(IllegalStateException.class)
- public static void logIllegalState(Throwable throwable) {
- Logger.error(“Illegal state %s…”, throwable);
- }
- public static void index() { List users = User.findAll();
- if (users.size() == 0) {
- throw new IllegalStateException(“Invalid database - 0 users”);
- }
- render(users);
- }
- }
与Java的异常处理一样,我们可以使用一个超类来捕获更多的异常类型。如果我们有多个catch方法,可以通过指定其 priority 来定义它们的执行顺序(priority为1的最先执行)。
- public class Admin extends Application {
- @Catch(value = Throwable.class, priority = 1)
- public static void logThrowable(Throwable throwable) {
- // Custom error logging… Logger.error(“EXCEPTION %s”, throwable);
- }
- @Catch(value = IllegalStateException.class, priority = 2)
- public static void logIllegalState(Throwable throwable) {
- Logger.error(“Illegal state %s…”, throwable);
- }
- public static void index() {
- List users = User.findAll();
- if(users.size() == 0) {
- throw new IllegalStateException(“Invalid database - 0 users”);
- }
- render(users); }
- }
@Finally
使用@Finally注解的方法,总是在该Controller中每一个action执行完之后再执行。不论action执行成功或者失败,它都将会被执行。跟Java中finally的意思相同。
- public class Admin extends Application {
- @Finally static void log() {
- Logger.info(“Response contains : ” + response.out);
- }
- public static void index() {
- List users = User.findAll(); render(users);
- }
- …
- }
如果@Finally方法有一个Throwable类型的参数,则异常对象会被传入(如果有的话):
- public class Admin extends Application {
- @Finally static void log(Throwable e) {
- if( e == null ){
- Logger.info(“action call was successful”);
- }
- else
- {
- Logger.info(“action call failed”, e);
- }
- }
- public static void index() {
- List users = User.findAll(); render(users);
- }
- …
- }
Controller继承
如果一个Controller类是另一个的子类,则父类中定义的拦截器同样对子类有效。
通过@With注解,加入更多的拦截器
因为Java中没有多重继承,所以通过Controller继承来共用拦截器很难。但是通过@With注解,我们可以把一些拦截器定义在一个完全不同的类中,然后在当前Controller中使用它们。
举例:
- public class Secure extends Controller {
- @Before static void checkAuthenticated() {
- if(!session.containsKey(“user”)) {
- unAuthorized();
- }
- }
- }
把它加到另一个Controller中:
- @With(Secure.class)
- public class Admin extends Application {
- … }
Session和Flash scopes
如果你打算在多个HTTP请求之间共用数据,可以把它们保存在Session或Flash域中。保存在Session中的数据,对于整个user session都可用,而保存在flash域中的数据,则仅仅在下一个请求可用。
有一点非常重要,需要理解的是,在play中,Session和Flash数据并没有保存在服务器端,而是通过Cookie被加入到每一个HTTP请求中。所以能保存的数据量非常小(不超过4KB),并且只能保存字符串。
当然,cookies都使用了一个密钥进行了加密,所以客户端无法修改cookie数据(否则该数据将无效)。Play的session不是用来当作数据缓存。如果我们需要缓存与session相关的某些数据,可以使用Play内置的缓存机制,并使用session.getId()作为key来保存。
举例:
- public static void index() {
- List messages = Cache.get(session.getId() + "-messages", List.class);
- if(messages == null) {
- // Cache miss
- messages = Message.findByUser(session.get("user"));
- Cache.set(session.getId() + "-messages", messages, "30mn");
- }
- render(messages);
- }
当我们关闭浏览器时,session数据将过期,除非我们通过 application.session.maxAge 进行了配置。
缓存使用了与传统Servlet HTTP session不同的定义,所以我们不能假设这些数据只是在cache中。这将强迫我们处理cache中没有数据的情况,并强迫我们的程序是完全无状态的。
5,页面字符串的截取并隐藏函数
1.asterisk()截取字符串,只保留第一个,其他以*代替
2.substring(0,8) 截取字符串.
/*Logger.info("Request Url:"+request.url);
Logger.info("Request Action:"+request.action);*/
- play框架知识
- play框架中的JPA知识总结与查询语句
- play!框架
- PLAY框架
- play框架
- Play 框架简介
- play 框架 环境搭建
- Play框架基础入门
- play框架,内存外溢
- play框架,即学即用
- Play 框架初识
- Play 框架开发入门
- Play框架:验证码
- Play框架学习
- 打包play框架程序代码
- 关于play框架
- Play框架搭建
- play基本框架
- xFire迭代获取对象中的值
- 用Base64对JAVA对象进行转码
- 机器学习推荐资料
- hive、hbase整合
- php求出两数之间所有偶数之和
- play框架知识
- SRAM读写实验--读书笔记
- hadoop之oozie配置
- ecshop二次开发--优惠活动
- 组播
- 数据结构与算法分析(一) —— 深入理解递归算法的调用过程
- js实现a标签超链接提交form表单的方法
- 什么是真正的实时操作系统
- Unix时间戳与正常北京时间转换