【问题标题】:Common code for all actions and views in Play Framework projectPlay Framework 项目中所有操作和视图的通用代码
【发布时间】:2016-11-27 09:42:55
【问题描述】:

我想在我的 Web 项目的每个页面上显示当前经过身份验证的用户。 我使用@Security.Authenticated 注释来限制用户访问。 我有一个授权逻辑(方法),它使用user_id 会话值从数据库中检索当前用户数据。

所以,有几个问题需要解决:

  1. 我应该将getCurrentUser() 方法放在哪里以便在所有控制器的所有操作之前执行它?
  2. 如何使currentUser 值在所有视图中可用?
  3. 如何跳过某些操作的身份验证?

我现在所拥有的只是为了一项行动。我不想为其他操作重复此代码?我需要它为整个项目工作:

  • 在所有操作之前执行getCurrentUser()以获得currentUser值;
  • 使currentUser 值在视图中可用

控制器:

@Security.Authenticated(Secured.class)
public class UsersController extends Controller {

    public Result index() {
        return ok(index.render(getCurrentUser()));
    }

    private User getCurrentUser() {
        return User.find.byId(Long.parseLong(request().username()));
    }
}

查看(index.scala.html):

@(currentUser: User)

<p>Hello, @currentUser.name</p>

我要将此视图代码放入所有视图共享的main.scala.html 文件中。

【问题讨论】:

  • 有过滤器作为中间件,你也许可以使用这些。

标签: playframework playframework-2.5


【解决方案1】:

对于您问题的第 1 部分: 使用 Play HTTP 过滤器,您可以拦截每个 http 请求。您可能不想阅读this

对于您问题的第 2 部分:这实际上取决于您希望通过将“currentUser”保留在内存中来获得什么。你想在内存中保留一个 POJO 吗?或者只是用户的字符串表示(可能是 JSON)?还有多久?

如果你想要一个 POJO,你可能想要使用 Http.Context.args。这允许您将 Map 存储到内存中。但是,这仅是有效的 PER 请求。这是JavaDoc

还有其他机制可以使字符串在内存中保留更长时间。您可以使用以下网址中的 Flash 或 Session Scope:www.playframework.com/documentation/2.5.x/JavaSessionFlash。

Flash 作用域将字符串保存在内存中,直到会话的 NEXT 请求。会话范围与会话一样长(有时可能比您预期的要长),因为会话没有技术超时。如果有帮助,这些字符串可能是 JSON。

还有另一种方法可以将 POJO 存储得比 http 请求更长。它是 Play 缓存 API。您可以在此处阅读更多相关信息:www.playframework.com/documentation/2.5.x/JavaCache。

您也可以实现自己的自定义缓存。

最后,您还可以使用 API 端点来检索 USER。这可能很昂贵,但这取决于。您也可以将此方法与某种缓存结合使用。

需要考虑的一些问题:

  1. 我需要记住的最小表示形式是多少?
  2. 我需要保留此内存的最短时间是多少?
  3. 我想要什么形式的代表?细绳? JSON? POJO?
  4. 谁需要访问此表示?客户?服务器?

附:我的代表很低,所以我一次不能发布超过 2 个链接。这就是为什么一些“链接”以文本形式发布的原因。

【讨论】:

  • 谢谢。我会试试这个。我需要currentUser 来坚持每个请求,它必须是 POJO。我需要从控制器和视图中访问它。
  • 我没有创建过滤器,因为我已经有了一个 @Security.Authenticated。我将我的逻辑移到那里并将currentUser 存储在Http.Context.args 中。感谢您的帮助@dwayne-predictable-data!
  • @chumakoff 你介意分享一个如何做到这一点的例子吗?
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2014-06-12
  • 1970-01-01
相关资源
最近更新 更多