play框架使用起来(18)

Posted zyhlal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了play框架使用起来(18)相关的知识,希望对你有一定的参考价值。

1、集成OpenID

OpenID是身份识别系统,具有开放,非集中等特点。我们只需要记录OpenID授权用户的使用信息,不必保持用户的特定状态,就可以在程序中很容易地识别新用户。


补充:

OpenID是去中心化的网上身份认证系统。对于支持OpenID的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(identity provider, IdP)的网站上注册。OpenID是去中心化的,任何网站都可以使用OpenID来作为用户登录的一种方式,任何网站也都可以作为OpenID身份提供者。OpenID既解决了问题而又不需要依赖于中心性的网站来确认数字身份。


      下面实例将演示在Play应用中如何使用OpenID认证,以下是OpenID认证过程:

  • 针对每个用户请求,先检查用户是否已经连接OpenID。
  • 如果用户没有连接OpenID,跳转至用户可以提交OpenID的页面。
  • 将用户提交的OpenID重定向到OpenID提供商。
  • 返回后,得到验证通过的OpenID用户信息,并将它保存在HTTP Session中。


      Play中的OpenID功能由play.libs.OpenID辅助类提供,基于OpenID4Java实现。我们在控制器中定义authenticate()方法,处理用户提交的OpenID。该方法先进行用户OpenID的检查,如果已经连接,则将用户信息保存在HTTP Session中,并显示欢迎页面。如果用户是第一次提交OpenID,则将提交的OpenID重定向到OpenID提供商:

@Before(unless="login", "authenticate")
static void checkAuthenticated()
   
if(!session.contains("user"))
        login
();
   


 
public static void index()
    render
("Hello %s!", session.get("user"));

     
public static void login()
    render
();

   
public static void authenticate(String user)
   
if(OpenID.isAuthenticationResponse())
       
UserInfo verifiedUser = OpenID.getVerifiedID();
       
if(verifiedUser == null)
            flash
.error("Oops. Authentication has failed");
            login
();
       

        session
.put("user", verifiedUser.id);
        index
();
   
else
       
if(!OpenID.id(user).verify()) // will redirect the user
            flash
.error("Cannot verify your OpenID");
            login
();
       

   

      创建Login.html模板,添加用户提交OpenID的表单:

#if flash.error
<h1>$flash.error</h1>
#/if
 
<form action="@Application.authenticate()" method="POST">
   
<label for="user">Whats your OpenID?</label>
   
<input type="text" name="user" id="user" />
   
<input type="submit" value="login..." />
</form>

      最后定义路由:

GET   /                     Application.index
GET  
/login                Application.login
*     /authenticate         Application.authenticate

2、Ajax请求

2.1 集成jQuery#

      Play默认集成了jQuery库,并将其存放于应用的public/javascripts目录。框架对jQuery进行了封装,提供#jsAction /标签简化了请求异步调用控制器中的Action方法,因此我们可以通过jQuery非常方便地处理Ajax请求。

      本节将以简单的Ajax应用为例,介绍在Play框架中如何使用jQuery提供的Ajax支持。


2.2 使用#jsAction /#

      Play提供的#jsAction /标签会返回一个JavaScript函数,该JavaScript函数由基于Action方法的URL连接和自由变量组成。它并不会自动执行Ajax请求,而需要我们先手动对返回的URL进行配置。

      下面介绍Play应用的Ajax实例。首先在控制器Hotels中定义Action方法list,用于处理浏览器异步提交的请求。list方法定义完成后为其配制路由规则:

GET     /hotels/list        Hotels.list

      我们在客户端中可以通过以下方式导入路由:

<script type="text/javascript">
   
var listAction = #jsAction @list(':search', ':size', ':page') /
   $
('#result').load(
       listAction
(search: 'x', size: '10', page: '1'),
       
function()
           $
('#content').css('visibility', 'visible')
       

   
)
</script>

      在这个例子中,我们向Hotels控制器中的list方法发送请求,请求中包含search,size和page三个参数。之后将请求保存在listAction变量中,使用load函数通过jQuery处理该请求(这里处理的是HTTP GET请求)。以下就是所发送请求的具体URL:

GET /hotels/list?search=x&size=10&page=1

      以这种方式发送请求会返回HTML数据。当然,我们也可以在控制器中使用适当的渲染方法,返回其他格式的数据,比如renderJSON, renderXML或者直接使用XML的模版等。在客户端接收到JSON或者XML数据后,可以通过jQuery进行格式转换。如果读者还想了解更多细节问题,可以查阅jQuery相关内容。

      如果读者需要使用POST请求,只需要将jQuery方法进行转换即可:

$.post(listAction(), function(data) 
  $
('#result').html(data);
);


2.3 使用#jsRoute /#

      Play提供的#jsRoute /标签,可以帮助开发者更好地管理路由。#jsRoute /标签的使用方法很简单,并且与#jsAction /类似,但是不同的地方为#jsRoute /标签返回的是一个对象。该对象包含基于服务端Action的URL,以及相应的HTTP方法(GET、POST等),具体范例如下所示。

<script type="text/javascript">
   
var updateUserRoute = #jsRoute @Users.update(':id') /
    $
.ajax(
      url
: updateUserRoute.url(id: userId),
      type
: updateUserRoute.method,
      data
: 'user.name=Guillaume'
   
);
</script>

      使用#jsRoute /标签所带来的好处是显而易见的,开发者只需要修改routes路由文件,就可以统一地改变HTTP方法,而不再需要一个一个查看和修改模板文件了。


3、管理数据库升级

开发人员使用关系数据库时,通常需要跟踪和管理数据库结构的升级和变化。当出现以下几种情况时,我们需要使用更成熟的方式跟踪和管理数据库结构的变化:

  • 在团队开发中,每个成员都需要知道数据库结构的任何变化。
  • 当成品部署到服务器上后,需要采用安全稳定的方式去升级数据库结构。
  • 当开发人员在不同的机器上工作时,需要保持数据库同步。


注意:

如果采用JPA进行操作,Hibernate会自动处理数据库结构的升级。如果读者经常需要手动管理数据库结构,并进行一些精细的调整,版本控制就变得必不可少了。


3.1 升级脚本#

      Play通过编写升级脚本来跟踪数据库结构的变化。这些脚本采用标准的SQL语句作为语法规则,存放在应用程序的db/evolutions目录下。脚本使用统一的命名规则:编写的第一个脚本命名为1.sql,第二个脚本为2.sql,并以此类推。每个脚本都包含两个部分:

  • Ups部分用于描述需要改变的地方。
  • Downs部分用于描述如何还原。


      以下是数据库升级脚本的例子,起到引导作用:

# Users schema
 
# --- !Ups
 
CREATE TABLE
User (
    id bigint
(20) NOT NULL AUTO_INCREMENT,
    email varchar
(255) NOT NULL,
    password varchar
(255) NOT NULL,
    fullname varchar
(255) NOT NULL,
    isAdmin
boolean NOT NULL,
    PRIMARY KEY
(id)
);
 
# --- !Downs
 
DROP TABLE
User;

play框架使用起来(17)

play框架使用起来(17)

play框架使用起来(11)

play框架使用起来

play框架使用起来(15)

play框架使用起来(15)