我看到ReactiveX(RxJava)有一个运算符timeout
,它将应用于订阅流中的每个项目.但我只想检查超时的第一个响应,而不关心以下响应的超时.如何使用RxJava的运算符优雅地实现此要求?
这是我实现这种登录/注册逻辑的计划(授权代码流程).(第三方仅提供OAuth2 API)
首先,SPA前端将向第三方发送GET请求
GET https://www.example.com/oauth2
client_id=dummyclient
redirect_uri=https://mysite/callback
response_type=code
scope=openid
Run Code Online (Sandbox Code Playgroud)
然后,如果用户同意将他/她的openid提供给mysite,那么fronend将获得301 HTTP响应.
---> 301 https://mysite/callback?code=dummycode
Run Code Online (Sandbox Code Playgroud)
然后浏览器将页面重定向到mysite/callback
它,它将重新加载SPA并在URL中公开可由SPA捕获的代码,然后它将代码发送到真正的后端回调.
GET https://mysite/api/real-callback?code=dummycode
Run Code Online (Sandbox Code Playgroud)
当后端获取代码时,它会将代码发送给第三方进行交换access_token
.当后端获取时access_token
,它将触发API请求以获取用户的openid,然后决定是让用户登录还是注册为新用户.最后它将回馈给我们的SPA前端HTTP响应它包含access_token
在我的OAuth2系统或401未授权的响应.
所以我的问题是如何证明真正的回调是由我自己的客户调用的(因为如果一些攻击者嵌入了我的前端,client_id
那么他可以伪造OAuth2请求并对用户进行网络钓鱼同意.之后攻击者将获得一个有效的代码然后他将代码发送回我真正的回调.最后,他将access_token
在我的系统中获得用户.)如何在没有最终用户提供密码等附加信息的情况下使用OAuth2进行身份验证.
当我尝试使用最新的Android构建工具(gradle-experimental:0.6.0-alpha3)和数据绑定框架时,我遇到了一些麻烦.当我尝试刷新所有gradle项目时,它会导致错误.
第一:Error:Exception thrown while executing model rule: BaseComponentModelPlugin.Rules#createBinaryTasks > create(dataBindingExportBuildInfoAllDebug)
model {
...
android.dataBinding {
enabled = true
}
...
}
Run Code Online (Sandbox Code Playgroud)
第二:Error:Cause: com.android.build.gradle.managed.AndroidConfig$Impl
model {
android {
...
dataBinding {
enabled = true
}
}
...
}
Run Code Online (Sandbox Code Playgroud) mFoo = foo;
mBar = bar;
// convert to
this.foo = foo;
this.bar = bar;
Run Code Online (Sandbox Code Playgroud)
如何使用正则表达式来处理这种替换?请帮忙.这是我在Android Studio中使用的方法(IntelliJ IDEA)Edit -> Find -> Replace in Path
Text to find: m([A-Z])([A-Za-z0-9]+) = L$1$2
Replace with: this\.L$1$2 = L$1$2
Run Code Online (Sandbox Code Playgroud)
更新
L
上面是一个错字.应该\L
根据JetBrains的文件
我现在正在使用javax.websocket.*
API,但我不知道如何Endpoint
在Internet上搜索后使用一些构造函数参数初始化.
ServerContainer container = WebSocketServerContainerInitializer.configureContext(context); //jetty
container.addEndpoint(MyWebSocketEndpoint.class);
Run Code Online (Sandbox Code Playgroud)
我想在初始化时传递一些参数MyWebSocketEndpoint
然后我可以使用参数,比方说clientQueue
,在我的onOpen
方法中做类似的事情:
clientQueue.add(new Client(session));
Run Code Online (Sandbox Code Playgroud) 我正在使用 Spock 测试框架。我有很多测试的结构与此类似:
def "test"() {
when:
doSomething()
then:
1 * mock.method1(...)
2 * mock.method2(...)
}
Run Code Online (Sandbox Code Playgroud)
我想将“then”块的代码移动到辅助方法中:
def assertMockMethodsInvocations() {
1 * mock.method1(...)
2 * mock.method2(...)
}
Run Code Online (Sandbox Code Playgroud)
然后调用这个辅助方法来消除我的规范中的代码重复,如下所示:
def "test"() {
when:
doSomething()
then:
assertMockMethodsInvocations()
}
Run Code Online (Sandbox Code Playgroud)
但是,在放入n * mock.method(...)
辅助方法时,我无法匹配方法调用。以下示例演示:
// groovy code
class NoInvocationsDemo extends Specification {
def DummyService service
def "test"() {
service = Mock()
when:
service.say("hello")
service.say("world")
then:
assertService()
}
private assertService() {
1 * service.say("hello")
1 * service.say("world")
true
}
}
// java code
public …
Run Code Online (Sandbox Code Playgroud) 我引用了博客文章Contextual Logging with Reactor Context和MDC,但我不知道如何在WebFilter中访问Reactor上下文。
@Component
public class RequestIdFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
List<String> myHeader = exchange.getRequest().getHeaders().get("X-My-Header");
if (myHeader != null && !myHeader.isEmpty()) {
MDC.put("myHeader", myHeader.get(0));
}
return chain.filter(exchange);
}
}
Run Code Online (Sandbox Code Playgroud) 这些 Keep-Alive-Timer 线程在左侧有白色标签,下面没有描述白色标签的含义。我想知道这些 Keep-Alive-Timer 线程是如何创建的以及为什么。
实际上,我正在使用Timer
在我的程序中检查心跳消息。每当心跳到来时,我都会安排一个新的TimerTask
,延迟 6 秒。如果没有心跳,TimerTask
则触发并发送警报。
我jackson-datatype-jsr310
用来支持 Java 8 时间数据类型。
我创建了一个这样的 ObjectMapper:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
objectMapper.registerModule(new JavaTimeModule());
Foo foo = new Foo();
LocalDateTime t = LocalDateTime.now();
foo.setT1(Date.from(t.toInstant(ZoneOffset.UTC)));
foo.setT2(Timestamp.valueOf(t));
foo.setT3(t);
System.out.println(objectMapper.writeValueAsString(foo));
Run Code Online (Sandbox Code Playgroud)
并解析了一个 LocalDateTime 然后我[2016,12,21,15,53,57,178]
没有1482306837178
这是我的测试模型类 Foo
public class Foo {
private Date t1;
private Timestamp t2;
private LocalDateTime t3;
// Getters & Setters
}
Run Code Online (Sandbox Code Playgroud)
我看到问题Jackson Java 8 DateTime serialization和问题所有者得到一个序列化的字符串,如1421261297.356000000
. 我不知道如何得到它。我正在使用 jackson 2.8.5 与datatype-jsr310
.