小编Jes*_*lle的帖子

针对具有Web视图的本机移动应用程序的SSO方法?

因此,原生移动应用程序(Android和iOS)的标准SSO方法似乎是通过AppAuth库的OAUth2 + OpenID Connect.

这一切都很好 - 实际上似乎接近优雅.

但是,如果同一个应用程序包含需要使用相同SSO访问资源的嵌入式Web视图组件(在与所有资源需要身份验证访问的本机代码相同的Web应用程序中的同一服务器上),该怎么办?

对于初学者来说,OAuth2访问令牌(一旦获得)不会自动传播到Web应用程序中的超链接请求,对吧?那么,网页应用程序页面本身是否必须使用JavaScript进行重做以进行此类传播?移动应用程序可以重写请求来解决此问题,但是:

  1. 至少在Android上这只适用于GET请求(对吧?)
  2. 更重要的是,这假设Web应用程序不需要在普通的浏览器客户端中运行

OAuth2不是正确的方法吗?如果是这样,那似乎是一种耻辱 - 因为AppAuth似乎对本机应用程序方面非常好.它只是将基本的Web视图浏览混合到真正混乱的图片中.

或者只有一些事实上的标准JavaScript库可以与Angular等混合使用(然后需要使用Angular等)?

android single-sign-on ios oauth-2.0 appauth

11
推荐指数
1
解决办法
2123
查看次数

带有调用者工作窃取的自定义池的Java parallelStream()?

通常当使用Java 8的parallelStream()时,结果是通过默认的公共fork-join池(即ForkJoinPool.commonPool())执行.

然而,如果一个人的工作远离CPU限制,例如可能在很多时候都在等待IO,那么这显然是不可取的.在这种情况下,人们会想要使用一个单独的池,根据其他标准确定大小(例如,任务可能实际使用CPU的时间有多少).

有没有明显得到parallelStream()使用不同池的方式,但作为一个详细的方式在这里.

不幸的是,这种方法需要从fork-join池线程调用并行流上的终端操作.这样做的缺点是,如果目标分支连接池完全忙于现有工作,整个执行将等待它,而什么都不做.因此,池可能成为比单线程执行更糟糕的瓶颈.相反,当以"正常"方式使用parallelStream()时,使用ForkJoinPool.common.externalHelpComplete()或ForkJoinPool.common.tryExternalUnpush()来让池外的调用线程帮助处理.

有谁知道的方式获得parallelStream()使用非默认的fork-join池,并有从的fork-join池帮助外的调用线程在这项工作中的处理(但fork-不休息加入游泳池的工作)?

java fork-join java-8 forkjoinpool java-stream

9
推荐指数
1
解决办法
685
查看次数

Android WebView:拦截重定向请求?

有什么方法可以拦截Android WebView中的重定向请求?shouldInterceptRequest(WebView,WebResourceRequest)似乎没有被调用!

我想通过以下方式自动捕获所有Web视图请求中的令牌到期:

  1. 从服务器发出重定向而不是401
  2. 在需要登录的地方使用shouldOverrideUrlLoading()调用AppAuth
  3. 在无需登录的情况下,使用shouldInterceptRequest通过刷新的令牌弹回原始URL

第2项工作正常,但第3项却失败了,因为似乎没有调用shouldInterceptRequest进行重定向,这确实是错误的-尤其是因为这没有记录,并且WebResourceRequest API会使人相信,甚至可以检查是否请求是重定向。

我会很乐意响应401而不是使用重定向-但我看不到有使用更新的令牌“就地”重试该请求的方法,除非该请求恰好是顶级页面请求。

我想我可以尝试老“页面”重定向,而不是302的,看看是否能工作的更好,但即使它是真正的黑客攻击。

(请注意,这显然不同于Android WebView,它是如何在应用程序中处理重定向而不是打开浏览器的问题 -因为我已经拥有一个Webview,并且正在尝试拦截和操纵重定向请求。)

redirect android webview webviewclient

6
推荐指数
1
解决办法
1593
查看次数

Android:Cursor.getColumnIndex() 在行循环上不变吗?

看起来android.database.Cursor.getColumnIndex(String)在行循环上应该是不变的。

但我看到大量代码在执行以下操作:

try (Cursor cursor = database.query(...)) {
  while (cursor.moveToNext()) {
    String aString = cursor.getString(cursor.getColumnIndex(aColumnName));
    // ... other loop code and more repeated use of getColumnIndex()
  }
}
Run Code Online (Sandbox Code Playgroud)

这看起来很愚蠢而且浪费,除非 的结果getColumnIndex()确实会随着对cursor.moveToNext()-- 的调用而变化,并且这个调用应该被提升到循环之外,如下所示:

try (Cursor cursor = database.query(...)) {
  int aStringIdx = cursor.getColumnIndex(aColumnName);
  while (cursor.moveToNext()) {
    String aString = cursor.getString(aStringIdx);
    // ... other loop code
  }
}
Run Code Online (Sandbox Code Playgroud)

或者在最坏的情况下(假设getColumnIndex()要求您位于有效的数据行上):

try (Cursor cursor = database.query(...)) {
  if (cursor.moveToFirst()) {
    int aStringIdx = cursor.getColumnIndex(aColumnName);
    do {
      String …
Run Code Online (Sandbox Code Playgroud)

sqlite android android-cursor

5
推荐指数
1
解决办法
1031
查看次数