zoukankan      html  css  js  c++  java
  • Vertx session 使用须知

    要使用vertx的session,必须把sessionHandler设为router的第一个匹配的route,否则将报错。比如下面的代码将引起报错:

    public class LeanS1 extends AbstractVerticle {
    @Override
    public void start() throws Exception {
    Router router = Router.router(vertx);
    router.route("/test").handler(this::test3);
    router.route().handler(CookieHandler.create());
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
    //......
    }
    在运行的时候,浏览器输入:localhost:8080/test ,就会报错:

    严重: Unexpected exception in route
    java.lang.NullPointerException
    at io.robin0909.ann.init.LeanS1.test3(LeanS1.java:47)
    at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:219)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:120)
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:120)
    at io.vertx.ext.web.impl.RouterImpl.accept(RouterImpl.java:79)
    
    .............
    at java.lang.Thread.run(Unknown Source)
    当把sessionHandler设为router的第一个匹配的route时,运行正常,正确代码如下:
    
    public void start() throws Exception {
    Router router = Router.router(vertx);    
    router.route().handler(CookieHandler.create());
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
    router.route("/test").handler(this::test3);
    //.....
    
     


    对于router.route().handler(...) 所指定的通用路径处理函数,无论指定了多少个通用路径函数,都会在访问时被顺序执行一遍。
    但是对于router.route("/test").handler(...) 所指定的专用路径处理函数,如果指定了多个,那么不会自动全部执行,
    只执行第一个。只有遇到routingContext.next();指令的时候才会继续执行下一个处理函数


    这点可以通过代码测试。

    比如:

    public void start() throws Exception {
    Router router = Router.router(vertx);    
    router.route().handler(CookieHandler.create());
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
    router.route("/test").handler(this::test3);
    router.route("/test").handler(this::test4);
    router.route("/test").handler(this::test5);    


    //.....
    对于上述代码,当在浏览器输入localhost:8080/test的时候, test3的结尾如果没有next指令,test4,test5就不会被执行。

    vertx 服务在部分安卓手机上页面跳转的时候,常常丢失session,后来发现是Cookie的Path问题导致出错,所以,可以在verticle文件中加入如下代码:

    //to make session work correctly on Huawei & Mi phone, set Cookie Path to root '/' 
    Set<Cookie> ccList=routingContext.cookies();
    for(Cookie ck:ccList){
    ck.setPath("/"); 
    }
  • 相关阅读:
    单网卡ADSL共享上网的设置
    单网卡ADSL共享上网的设置
    求阶乘的函数
    用递归算法求两个数的最大公约数
    编程求组合
    汉诺塔游戏
    求两个数的最小公倍数
    快排的非递归算法
    字符串匹配之通配符问题一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
    sizeof和strlen
  • 原文地址:https://www.cnblogs.com/endv/p/14226738.html
Copyright © 2011-2022 走看看