跳转至内容

WebObjects/Web 应用程序/开发/示例/登录

来自维基教科书,开放书籍,开放世界

简单登录

[编辑 | 编辑源代码]

这是一个关于如何在必要时将请求重定向到“登录”页面的示例。

 public void appendToResponse(WOResponse aResponse, WOContext aContext)
 {
   String	aPageName = LoginPage.pageWithContext( aContext );
 
   if ( ( aPageName != null ) && ( this.name().equals( aPageName ) == false ) )
   {
     WOComponent	aComponent = this.pageWithName( aPageName );
 
     this.currentSession().setPage( aPageName );
     aContext._setPageComponent( aComponent );
     aContext._setCurrentComponent( aComponent );
     aComponent.appendToResponse( aResponse, aContext);
 
     return;
   }
 
   this.currentSession().setPage( this.name() );
   super.appendToResponse( aResponse, aContext);
 }

WOContext._setPageComponent() 和 WOContext._setCurrentComponent() 是未公开的方法,但需要用于更新 WOContext 中的当前页面和组件信息。

LoginPage 类(未显示)将决定是否需要登录。

避免登录时的会话超时

[编辑 | 编辑源代码]

一个好的登录不应该在没有用户登录时超时。如果您的应用程序在页面生成中使用了会话,这可能是一个问题。

幸运的是,苹果为我们提供了一种正确的方法:“DirectAction”。您应该将您的登录页面实现为一个 DirectAction,并非常小心地不要创建“延迟”会话,否则您的工作将付诸东流。WO 在您调用某些方法时会创建会话,因此您必须小心。使用 this.context().hasSession() 来检查一切是否正常。登录成功后,您通过在组件中调用 this.session() 来创建会话,并将用户存储在其中;您就可以开始操作了。

在注销时,您会销毁会话并返回 direct action 页面,这样用户就会看到一个新的登录屏幕,而不是空白屏幕。注销时生成登录页面的最简单方法是返回一个重定向页面(302)到应用程序的主 URL,对于用户来说是透明的,并且完全按照您的需要执行。

您可以在此之后找到代码示例。我将其放在 Application 中,当我想注销时,只需使用 context 调用 handleLogout。

 private WOResponse responseForPageWithName(String aPageName, WOContext aContext) {
   if ( aPageName != null ) {
       WOResponse	aResponse = new WOResponse();
       String adaptorPrefix = aContext.request().adaptorPrefix();
       String applicationName = aContext.request().applicationName();
       String anURL = adaptorPrefix + "/" + applicationName + ".woa";
       aResponse.setHeader(anURL, "Location");
       aResponse.setHeader("text/html", "content-type");
       aResponse.setHeader("0","content-length");
       aResponse.setStatus(302);
       return aResponse;
   }
   return null;
 }
 
 public WOResponse handleLogout(WOContext aContext) {
   WOResponse aResponse = this.responseForPageWithName("Login", aContext);
   if ( ! aContext.session().isTerminating() ) {
       ((Session)aContext.session()).setUser(null);
       aContext.session().terminate();
   }
   return aResponse;
 }
华夏公益教科书