精华内容
下载资源
问答
  • DHCP option 60 和 option 61

    万次阅读 2017-09-12 14:17:30
    option 60 和 option 61 是2个常见的 DHCP optionoption 60 (Class Id)可以防止非法客户端获取合法ip client 向 DHCP Server 发送 DHCP Discovery 请求,请求中附带 option 60 属性来标示供应商类别标识符。 DHCP ...

    option 60 和 option 61 是2个常见的 DHCP option

    option 60 (Class Id)

    可以防止非法客户端获取合法ip

    • client 向 DHCP Server 发送 DHCP Discovery 请求,请求中附带 option 60 属性来标示供应商类别标识符。
    • DHCP Server 检查 option 60 属性,判断发送请求的 Client 是否符合获取IP地址的条件,若符合条件则回复 DHCP Offer报文来分配IP地址,否则DHCP Server忽略请求。DHCP Server 也可以关闭 option60 检查选项,如果关闭该选项, 则无论option60是否匹配,DHCP Server都会响应Client的请求。
    • DHCP Server回复DHCP Offer报文时附带option43属性来下发client的IP地址或域名。
    • DHCP Server在回复Client请求时,不附带option60属性。

    DHCP option 60 准确的来说,不是用来做验证的,而是,用来划分不同的域,根据 option 60 的内容可以分给不同的的域IP地址。
    Code Len Vendor class Identifier
    +—–+—–+—–+—–+—
    | 60 | n | i1 | i2 | …
    +—–+—–+—–+—–+—

    option 61 (Client Id)

       DHCP客户端使用此option来指定其唯一标识符。DHCP服务器使用这个值对它数据库的地 址绑定进行索引。这个option的值对于管理域中的所有客户端都是唯一的。
    
       上面这句话说的就是服务器凭option 61来做唯一区分客户端的。
    
        一开始,还认为服务器是根据硬件地址来做客户端唯一区分的,经过测试,原来是靠option 61做的唯一区分。当没有给option 61 填充数据,这会默认使用硬件地址来填充option 61。而当可option 61 填入合适的数据的时候,硬件地址是什么已经不重要了。
    

    Code Len Type Client-Identifier
    +—–+—–+—–+—–+—–+—
    | 61 | n | t1 | i1 | i2 | …
    +—–+—–+—–+—–+—–+—

    t1: 是类型,
        0x01代表后面是硬件地址,
        0xff表示IAID,
        0x0002表示后面是DUID
    

    DUID
    DUID(DHCP Unique Identifier,DHCP唯一标识符)是唯一标识一台
    DHCPv6设备(包括客户端、中继和服务器)的标识符,用于DHCPv6设备之间的相互验证。我们设备采用RFC 3315规定的DUID-EN(DUID Vendor-assigned unique ID based on Enterprise
    Number,基于企业编号的DUID)作为DHCPv6设备的标识。DUID组成如下
     DUID type:DUID类型。取值为 0x0002;
     Identifier:标识号。 格式图如下:

    这里写图片描述

    展开全文
  • OPTION 125

    万次阅读 2017-09-06 10:35:50
    DHCP option 125(Vendor-ldentifying Vendor Options):官方定义:option 125是对标准DHCP协议一个补充标准,作用就是让客户端对DHCP服务器也进行认证,防止DHCP服务器伪造。个人总结: option 125 是client ...
    • DHCP option 125(Vendor-ldentifying Vendor Options):

      官方定义:option 125是对标准DHCP协议一个补充标准,作用就是让客户端对DHCP服务器也进行认证,防止DHCP服务器伪造。

      个人总结:
      option 125 是client 用来验证server 的,client 不需要发送option 125,而是server在分配IP地址等信息时,将验证信息封装在option 125,然后添加到offer 包和ACK包里面。client 在收到offer包之后先判断“option data 1”与之前存放的信息是否相同,相同则给这个server发送request包,不同则丢弃。

    • server option 125 配置方法:

        dhcp server 的option 125的设置格式是
        dhcp-option-force=125,x1:x2:x3:x4 + 
                    :datalen + 
                    :subopt1_num:subopt1_len:s1_1:s1_2:s1_3:s1_4...:s1_n + 
                    :subopt2_num:subopt2_len:s2_1:s2_2:...:s2_n + 
                    :....
        x1:x2:x3:x4 供应商的ID;
        datalen     后面数据的总长度;
        suboptx_num 企业自定义的子option x;
        suboptx_len 子option x 的数据的长度;
        s1x_1...    option x 的数据;
    示例:
    
    dhcp-option-force=125,00:00:00:e9:08:01:06:30:30:31:38:45:37
    
    dhcp-option-force=125,00:00:0d:e9:16:01:06:30:30:31:38:45:37:02:0c:30:30:31:38:45:37:33:38:30:30:41:42  
    展开全文
  • Netty设置option警告Unknown channel option

    万次阅读 热门讨论 2019-05-30 14:34:54
    在设置netty服务端的option时,设置了如下参数。 server.group(boss,worker)//设置时间循环对象,前者用来处理accept事件,后者用于处理已经建立的连接的io //Server是NioServerSocketChannel 客户端是...

    本文使用环境版本是
    netty 4.1.36.Final
    jdk 1.8

    经查,问题的关键点事childOption和option的问题,找了几个答案如下:

    option主要是设置的ServerChannel的一些选项,而childOption主要是设置的ServerChannel的子Channel的选项。 如果是Bootstrap的话,只会有option而没有childOption,所以设置的是客户端Channel的选项。

    option主要是针对boss线程组,child主要是针对worker线程组

    The parameters that we set using ServerBootStrap.option apply to the ChannelConfig of a newly created ServerChannel, i.e., the server socket which listens for and accepts the client connections.
    These options will be set on the Server Channel when bind() or connect() method is called. This channel is one per server.
    And the ServerBootStrap.childOption applies to to a channel’s channelConfig which gets created once the serverChannel accepts a client connection.
    This channel is per client (or per client socket).
    So ServerBootStrap.option parameters apply to the server socket (Server channel) that is listening for connections and ServerBootStrap.
    childOption parameters apply to the socket that gets created once the connection is accepted by the server socket.
    The same can be extended to attr vs childAttr and handler vs childHandler methods in the ServerBootstrap class.
    How could I know which option should be an option and which should be a childOption ?Which ChannelOptions are supported depends on the channel type we are using.
    You can refer to the API docs for the ChannelConfig that you’re using.
    netty.io/4.0/api/io/netty/channel/ChannelConfig.html
    and its sub classes. You should find Available Options section for each ChannelConfig.

    在设置netty服务端的option时,设置了如下参数。

    server.group(boss,worker)//设置时间循环对象,前者用来处理accept事件,后者用于处理已经建立的连接的io
                    //Server是NioServerSocketChannel 客户端是NioSocketChannel绑定了jdk NIO创建的ServerSocketChannel对象,
                    //用它来建立新accept的连接
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG,1024)//
                    // 第2次握手服务端向客户端发送请求确认,同时把此连接放入队列A中,
                    // 然后客户端接受到服务端返回的请求后,再次向服务端发送请求,表示准备完毕,此时服务端收到请求,把这个连接从队列A移动到队列B中,
                    // 此时A+B的总数,不能超过SO_BACKLOG的数值,满了之后无法建立新的TCP连接,2次握手后和3次握手后的总数
                    // 当服务端从队列B中按照FIFO的原则获取到连接并且建立连接[ServerSocket.accept()]后,B中对应的连接会被移除,这样A+B的数值就会变小
                    //此参数对于程序的连接数没影响,会影响正在准备建立连接的握手。
                    .option(ChannelOption.SO_KEEPALIVE,true)
                    //启用心跳,双方TCP套接字建立连接后(即都进入ESTABLISHED状态),
                    // 并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活,TCP会自动发送一个活动探测数据报文
                    .option(ChannelOption.TCP_NODELAY,true)
                    //TCP协议中,TCP总是希望每次发送的数据足够大,避免网络中充满了小数据块。
                    // Nagle算法就是为了尽可能的发送大数据快。
                    // TCP_NODELAY就是控制是否启用Nagle算法。
                    // 如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true关闭Nagle算法;
                    // 如果要减少发送次数减少网络交互,就设置为false等累积一定大小后再发送。默认为false。
                    .option(ChannelOption.SO_REUSEADDR,true)//是否允许重复绑定端口,重复启动,会把端口从上一个使用者上抢过来
                    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS,30000)//连接超时30000毫秒
                    .option(ChannelOption.SO_TIMEOUT,5000)//输入流的read方法被阻塞时,接受数据的等待超时时间5000毫秒,抛出SocketException
                    //child是在客户端连接connect之后处理的handler,不带child的是在客户端初始化时需要进行处理的
                    .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)//缓冲池
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            ChannelPipeline pipeline = socketChannel.pipeline();
                            pipeline.addLast("decoder",new DotDecodeHandler());
                        }
                    });
    

    在启动的时候除了警告如下

    五月 30, 2019 10:38:41 上午 io.netty.bootstrap.AbstractBootstrap setChannelOption
    警告: Unknown channel option 'SO_KEEPALIVE' for channel '[id: 0x3372ab6d]'
    五月 30, 2019 10:38:41 上午 io.netty.bootstrap.AbstractBootstrap setChannelOption
    警告: Unknown channel option 'TCP_NODELAY' for channel '[id: 0x3372ab6d]'
    五月 30, 2019 10:38:41 上午 io.netty.bootstrap.AbstractBootstrap setChannelOption
    警告: Unknown channel option 'SO_TIMEOUT' for channel '[id: 0x3372ab6d]'
    

    经过跟踪调试发现点在于NETTY版本问题。
    在setOption的时候,首先会判断JDK版本,然后根据1.7为分界线,去set。
    在从NioOption中查找key-value对,如果没有找到,就会去JDK的Option中去查找,如果仍然没找到,那么就会报出警告。如下:

    io.netty.bootstrap. AbstractBootstrap

        private static void setChannelOption(Channel channel, ChannelOption<?> option, Object value, InternalLogger logger) {
            try {
                if (!channel.config().setOption(option, value)) {
                    logger.warn("Unknown channel option '{}' for channel '{}'", option, channel);
                }
            } catch (Throwable var5) {
                logger.warn("Failed to set channel option '{}' with value '{}' for channel '{}'", new Object[]{option, value, channel, var5});
            }
    
        }
    
    

    io.netty.channel.socket.nio. NioServerSocketChannel

            public <T> boolean setOption(ChannelOption<T> option, T value) {
            //此处根据jdk版本去执行不同的set方法
                return PlatformDependent.javaVersion() >= 7 && option instanceof NioChannelOption ? NioChannelOption.setOption(this.jdkChannel(), (NioChannelOption)option, value) : super.setOption(option, value);
            }
    

    io.netty.channel.socket. DefaultServerSocketChannelConfig

        public <T> boolean setOption(ChannelOption<T> option, T value) {
            this.validate(option, value);
            if (option == ChannelOption.SO_RCVBUF) {
                this.setReceiveBufferSize((Integer)value);
            } else if (option == ChannelOption.SO_REUSEADDR) {
                this.setReuseAddress((Boolean)value);
            } else {
                if (option != ChannelOption.SO_BACKLOG) {
                    return super.setOption(option, value); //如果没有找到,去父类找
                }
    
                this.setBacklog((Integer)value);
            }
    
            return true;
        }
    
    

    io.netty.channel. DefaultChannelConfig

    public <T> boolean setOption(ChannelOption<T> option, T value) {
            this.validate(option, value);
            //在此处没有找到我设置的SO_KEEPALIVE/TCP_NODELAY/SO_TIMEOUT
            if (option == ChannelOption.CONNECT_TIMEOUT_MILLIS) {
                this.setConnectTimeoutMillis((Integer)value);
            } else if (option == ChannelOption.MAX_MESSAGES_PER_READ) {
                this.setMaxMessagesPerRead((Integer)value);
            } else if (option == ChannelOption.WRITE_SPIN_COUNT) {
                this.setWriteSpinCount((Integer)value);
            } else if (option == ChannelOption.ALLOCATOR) {
                this.setAllocator((ByteBufAllocator)value);
            } else if (option == ChannelOption.RCVBUF_ALLOCATOR) {
                this.setRecvByteBufAllocator((RecvByteBufAllocator)value);
            } else if (option == ChannelOption.AUTO_READ) {
                this.setAutoRead((Boolean)value);
            } else if (option == ChannelOption.AUTO_CLOSE) {
                this.setAutoClose((Boolean)value);
            } else if (option == ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK) {
                this.setWriteBufferHighWaterMark((Integer)value);
            } else if (option == ChannelOption.WRITE_BUFFER_LOW_WATER_MARK) {
                this.setWriteBufferLowWaterMark((Integer)value);
            } else if (option == ChannelOption.WRITE_BUFFER_WATER_MARK) {
                this.setWriteBufferWaterMark((WriteBufferWaterMark)value);
            } else if (option == ChannelOption.MESSAGE_SIZE_ESTIMATOR) {
                this.setMessageSizeEstimator((MessageSizeEstimator)value);
            } else {
                if (option != ChannelOption.SINGLE_EVENTEXECUTOR_PER_GROUP) {
                	//如果都没有找到则返回false,层层抛出,在log处打印出警告
                    return false;
                }
    
                this.setPinEventExecutorPerGroup((Boolean)value);
            }
    
            return true;
        }
    

    然后我使用低版本的netty(小于等于 4.1.7.Final ),不会报出警告,而且在处理setOption的时候有不同:

    io.netty.bootstrap. AbstractBootstrap

        final ChannelFuture initAndRegister() {
            Channel channel = null;
    
            try {
                channel = this.channelFactory.newChannel();
                //此处初始化channel
                this.init(channel);
            } catch (Throwable var3) {
                if (channel != null) {
                    channel.unsafe().closeForcibly();
                }
    
                return (new DefaultChannelPromise(channel, GlobalEventExecutor.INSTANCE)).setFailure(var3);
            }
    
            ChannelFuture regFuture = this.config().group().register(channel);
            if (regFuture.cause() != null) {
                if (channel.isRegistered()) {
                    channel.close();
                } else {
                    channel.unsafe().closeForcibly();
                }
            }
    
            return regFuture;
        }
    
    

    io.netty.bootstrap. ServerBootstrap

        void init(Channel channel) throws Exception {
            Map<ChannelOption<?>, Object> options = this.options0();
            synchronized(options) {
            	//开始设置option
                channel.config().setOptions(options);
            }
    
            Map<AttributeKey<?>, Object> attrs = this.attrs0();
            synchronized(attrs) {
                Iterator i$ = attrs.entrySet().iterator();
    
                while(true) {
                    if (!i$.hasNext()) {
                        break;
                    }
    
                    Entry<AttributeKey<?>, Object> e = (Entry)i$.next();
                    AttributeKey<Object> key = (AttributeKey)e.getKey();
                    channel.attr(key).set(e.getValue());
                }
            }
    
            ChannelPipeline p = channel.pipeline();
            final EventLoopGroup currentChildGroup = this.childGroup;
            final ChannelHandler currentChildHandler = this.childHandler;
            final Entry[] currentChildOptions;
            synchronized(this.childOptions) {
                currentChildOptions = (Entry[])this.childOptions.entrySet().toArray(newOptionArray(this.childOptions.size()));
            }
    
            final Entry[] currentChildAttrs;
            synchronized(this.childAttrs) {
                currentChildAttrs = (Entry[])this.childAttrs.entrySet().toArray(newAttrArray(this.childAttrs.size()));
            }
    
            p.addLast(new ChannelHandler[]{new ChannelInitializer<Channel>() {
                public void initChannel(Channel ch) throws Exception {
                    final ChannelPipeline pipeline = ch.pipeline();
                    ChannelHandler handler = ServerBootstrap.this.config.handler();
                    if (handler != null) {
                        pipeline.addLast(new ChannelHandler[]{handler});
                    }
    
                    ch.eventLoop().execute(new Runnable() {
                        public void run() {
                            pipeline.addLast(new ChannelHandler[]{new ServerBootstrap.ServerBootstrapAcceptor(currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs)});
                        }
                    });
                }
            }});
        }
    
    

    io.netty.channel. DefaultChannelConfig

        public boolean setOptions(Map<ChannelOption<?>, ?> options) {
            if (options == null) {
                throw new NullPointerException("options");
            } else {
                boolean setAllOptions = true;
                Iterator i$ = options.entrySet().iterator();
    
                while(i$.hasNext()) {
                    Entry<ChannelOption<?>, ?> e = (Entry)i$.next();
                    //此处循环set,如果this.setOption返回false,那么setAllOptions就是false,接下来我们进入this.setOption
                    if (!this.setOption((ChannelOption)e.getKey(), e.getValue())) {
                        setAllOptions = false;
                    }
                }
    
                return setAllOptions;
            }
        }
    
    

    io.netty.channel.socket. DefaultServerSocketChannelConfig

        public <T> boolean setOption(ChannelOption<T> option, T value) {
            this.validate(option, value);
            if (option == ChannelOption.SO_RCVBUF) {
                this.setReceiveBufferSize((Integer)value);
            } else if (option == ChannelOption.SO_REUSEADDR) {
                this.setReuseAddress((Boolean)value);
            } else {
                if (option != ChannelOption.SO_BACKLOG) {
               		//此处找到不到SO_KEEPALIVE等参数后,会向上从父类中查询
                    return super.setOption(option, value);
                }
    
                this.setBacklog((Integer)value);
            }
    
            return true;
        }
    
    

    io.netty.channel. DefaultChannelConfig
    发现也没有SO_KEEPALIVE选项,返回false
    但是在返回后,没有地方记录这个false,而且也没有地方打印log

        public <T> boolean setOption(ChannelOption<T> option, T value) {
            this.validate(option, value);
            if (option == ChannelOption.CONNECT_TIMEOUT_MILLIS) {
                this.setConnectTimeoutMillis((Integer)value);
            } else if (option == ChannelOption.MAX_MESSAGES_PER_READ) {
                this.setMaxMessagesPerRead((Integer)value);
            } else if (option == ChannelOption.WRITE_SPIN_COUNT) {
                this.setWriteSpinCount((Integer)value);
            } else if (option == ChannelOption.ALLOCATOR) {
                this.setAllocator((ByteBufAllocator)value);
            } else if (option == ChannelOption.RCVBUF_ALLOCATOR) {
                this.setRecvByteBufAllocator((RecvByteBufAllocator)value);
            } else if (option == ChannelOption.AUTO_READ) {
                this.setAutoRead((Boolean)value);
            } else if (option == ChannelOption.AUTO_CLOSE) {
                this.setAutoClose((Boolean)value);
            } else if (option == ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK) {
                this.setWriteBufferHighWaterMark((Integer)value);
            } else if (option == ChannelOption.WRITE_BUFFER_LOW_WATER_MARK) {
                this.setWriteBufferLowWaterMark((Integer)value);
            } else if (option == ChannelOption.WRITE_BUFFER_WATER_MARK) {
                this.setWriteBufferWaterMark((WriteBufferWaterMark)value);
            } else if (option == ChannelOption.MESSAGE_SIZE_ESTIMATOR) {
                this.setMessageSizeEstimator((MessageSizeEstimator)value);
            } else {
                if (option != ChannelOption.SINGLE_EVENTEXECUTOR_PER_GROUP) {
                    return false;
                }
    
                this.setPinEventExecutorPerGroup((Boolean)value);
            }
    
            return true;
        }
    
    
    展开全文
  • option 43和option 60

    千次阅读 2017-03-20 15:06:02
    1. Option 60报文结构 option 60格式如下图所示:    Code Len Vendor class Identifier  +-----+-----+-----+-----+---  | 60 | n | i1 | i2 | ...  +-----+-----+-----+-----+---  Code:表示供应商...
    1. Option 60报文结构
    option 60格式如下图所示:
     
       Code   Len   Vendor class Identifier
       +-----+-----+-----+-----+---
       |  60 |   n  |  i1  |  i2 | ...
       +-----+-----+-----+-----+---
        Code:表示供应商类别标识符(Vendor Class Identifier –VCI)选项,RFC 2132 定义为60
    Len:为Vendor class Identifier所填内容的字节数(不包括Code和Len所占的长度),最小值为1
    Vendor class Identifier:用户自定义的Vendor class Identifier内容(根据供应商类型和DHCP客户端配置来自定义)。
    客户端发送厂商类型和配置,这个信息是n个8位编码,由dhcp服务端解析,厂商可能会为客户端选择定义特殊的厂商类标识符信息,以便表达特殊的配置或者其他关于客户端的信息。比如:这个标识符可能编码了客户端的硬件配置。客户端发送过来的服务器不能解析的类规范信息必须被忽略(尽管可能会有报告),服务器响应厂商规范信息到客户端应该仅仅通过Option 43来完成。
     
    1、支持OPTION60(Authentication for DHCP Messages)
    功能描述:
    OPTION 60功能用来完成基于标准DHCP协议,以在客户端输入用户名和密码的方式进行的地址鉴权。在机顶盒中只保留应用层帐号和密码,应用层帐号为8位数字,在OPTION60使用接入层帐号,帐号为“ad”+应用层帐号+“@iptv”,密码和应用层密码一致,目前密码暂定为固定值123465。 应用层用户名和密码一旦输入之后,应储存在硬件之中。当PPPOE与DHCP接入模式相切换时如果之前已经输入过应用层用户名与密码,则要求无需再次输入,直接过渡至新的接入方式。


    2、支持OPTION 125(Vendor-ldentifying Vendor Options)
    功能描述: 
    OPTION 125功能是对标准DHCP协议一个补充标准,该功能的标准定义在RFC 3925中。DHCP服务器在完成验证将客户端的IP地址等信息封装成DHCP OFFER包的时候,将OPTION 125信息封装DHCP OFFER包中再发送给客户端。 客户端收到OFFER包以后,首先查看该OFFER包所带的OPTION 125的“Option-data 1”字段中所填写的特征值,并与预先存储的信息进行比对。比对结果为相同则使用此OFFER,如果比对结果不同或OFFER包中不带OPTION 125,则将此OFFER丢弃。
     
    2.   DHCP Option 43
    FIT AP和AC不在同一网段,FIT AP要注册到AC上,DHCP服务器在给FIT AP分配IP地址的时候,会在DHCP报文里加上option 43属性,这个内容就是AC的IP地址。


    但是,RFC 2132中没有统一规定这个属性的内容,各个厂商可以根据需要定义选项的内容,如Option 43属性。通过配置DHCP自定义选项,可以为DHCP客户端提供厂商指定的信息。
    DHCP Option 43字段是完整的TLV的格式,Type占1字节,值为43,Length占1字节,值为Value字段的长度,如下面所示:
       Code   Len   Vendor-specific information
       +-----+-----+-----+-----+---
       |  43 |  n  |  i1 |  i2 | ...
       +-----+-----+-----+-----+---
    Code:表示供应商类别标识符(Vendor Specific Information)选项,RFC 2132 定义为43
    Len:为Vendor Specific Information所填内容的字节数(不包括Code和Len所占的长度),最小值为1
    Vendor-specific information: 用户自定义的Vendor Specific Information内容,用来在DHCP客户端和服务器之间进行交换。如果Vendor Specific Information内容包含一个以上的子选项,则子选项要以TLV的格式填写。
     
    option 43子选项格式如下面所示:
     
    Code   Len   Data item     Code   Len   Data item    Code
    +----+----+----+----+----+----+----+----+----+----+----+
    | T1  |  n |  d1 |  d2| ...| T2 |  n  | D1 |  D2 |...|...|
    +----+----+----+----+----+----+----+----+----+----+----+
     
    Code:表示option 43子选项,可以使用 0到 255来定义
    Len:为option 43子选项所填内容的字节数(不包括Code和Len所占的长度),最小值为1
    Data item: option 43的子选项所填写的内容
     
    目前Value字段包含两种类型的IE,也是TLV的结构,见下表:
    表 2‑1  无线管理信息传输机制
    IE Type(1字节)
    IE Length(1字节)
    IE Value(长度由IE Length决定)
    0x01
    4
    网络序的IPv4地址
    0x02
    可变长度
    Domain Name (没有终结符’\0’)
    一个DHCP Option 43字段可以包含多个IE,目前最大数目为4。
    展开全文
  • 获取option方法

    万次阅读 2019-07-19 15:33:42
    获取select中option被选中的文本值,是这样写的: $("#s").text(); //获取所有option的文本值 实际上应该这样: $("#s option:selected").text(); //获取选中的option的文本值 获取select中option的被选中的...
  • 根据form表单提交的值,默认将select下拉框的option值选中: <label>是否推荐:</label> <select class="input-text" name="is_recommend"> <option value="0" <?php if($is_recommend==...
  • element-UI 下拉框el-select组件el-option的v-for问题 我的代码: &lt;template&gt; &lt;div id="htmlWrap"&gt; &lt;!--header--&gt; &lt;div class="bg545C64"...
  • Option Explicit

    千次阅读 2012-01-30 20:58:39
    Option Explicit { On | Off } 各部分说明: On 可选。启用 Option Explicit 检查。如果在 Option Explicit 语句后没有指定 On 或 Off,则默认为 On。 Off 可选。禁用 Option Explicit 检查。   Option Explicit...
  • 这几个函数都是向wordpress 的表中增加数值的 ...比如说add_option('ddle_sort','cata')就是添加一个记录,其中option_name为ddle_sort,option_value 为cata 添加后,你可以用get_option('ddle_s
  • JS动态添加option和删除option

    千次阅读 2018-09-29 21:05:00
    转载:JS动态添加option和删除option 1.动态创建select 1 2 3 4 5 function createSelect(){  var mySelect = document.createElement("select");  mySelect...
  • 这里以默认选中当前月为例: ... <select name="MONAT" id="MONAT">...option value="1">1</option> <option value="2">2</option> <option value="3">3</option> ...
  • Scala之Option

    万次阅读 2016-05-01 16:15:57
    机场等飞机,继续学习Scala~~Option是一个很有意思的类,首先,这个类并不一个真正的集合类,因为它并没有有继承Traversable或Iterable。但是,它确实具有Iterable的所有操作,这意味着你完全可以把Option当成一个...
  • Option类型

    千次阅读 2015-11-19 16:29:36
    Scala语言中包含一个标准类型Option类型,代表可选值,Option类型的值可以有两个可能的值,一个为some(x) 其中x为有效值,另外一个为None对象,代表空值。 Option类型的值通常作为Scala集合类型(List,Map等)...
  • 使用GRANT赋予用户权限的时候通常有ADMIN OPTION和GRANT OPTION这两个OPTION。下面使用简单的实验来体会下这两种授权的用途。 一、ADMIN OPTION参数 实验: 1. 创建测试用户user_a和user_b: 2. ...
  • 为什么在settings里写,替换不了echarts中option里的值(现在的情况是可以替换title中的text的值,但是不能替换掉其他属性中的值),想问下怎么做可以替换掉option中的任一个属性中的值。 例如: var ...
  • option选中取值

    2019-04-04 14:35:30
    <select id="word" "selectWord()">...option>>----请选择----</option> <option name="apply[content]" value="技术资料">技术资料</option> <option name="apply[conte...
  • with check option和with grant option

    千次阅读 热门讨论 2016-11-06 14:20:42
    ·with check option 表示对视图进行update、insert、delete操作时,只要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式) SQL语言用CREATE VIEW 命令创建视图,其一般格式如下。 ...
  • with grant option与with admin option区别

    千次阅读 2016-11-10 22:55:57
    相同点: - 两个都可以既可以赋予user 权限时...GRANT CREATE SESSION TO emi WITH ADMIN OPTION; GRANT CREATE SESSION TO role WITH ADMIN OPTION; GRANT role1 to role2 WITH ADMIN OPTION; GRANT select ON cus
  • namespace Coldairarrow.Util { /// <... /// 前端SelectOption /// </summary> public class SelectOption { public string value { get; set; } public string text { get; set; } } }
  • option添加selected属性则下拉框便显示的该option。 思路: 1.拿到所有的option 2.遍历option的value并与后台拿到的值进行比较(相同则显示该option) 代码实现: var numbers = $("#menuEditIsme...
  • 介绍下jquery获得option的值和对option的操作,下面有不错的示例分析及示例代码。  jQuery获取Select元素,并选择的Text和Value:  复制代码代码如下: $("#select_id").change(function(){//code...}); //为...
  • javac编译选项-Option

    万次阅读 2018-10-23 14:17:22
    关于这个option所对应的类就是Option.接下来我们就来看一下这个类 解析 Option类是一个枚举,代表javac的选项.处理命令行选项的特定选项是通过按顺序搜索此枚举的成员来标识的,找到第一个匹配的. 其中,Option又分为...
  • 获取select框的option

    万次阅读 2020-10-22 14:01:42
    option value="0">请选择主菜名</option> <option value="1">白菜</option> <option value="2">萝卜</option> </select> $("#aaa").find("opti
  • DHCP option 52, Option Overload

    千次阅读 2013-05-14 14:36:16
    在RFC2132中对OPTION 52的定义如下: 9.3. Option Overload  This option is used to indicate that the DHCP 'sname' or 'file'  fields are being overloaded by using them to carry DHCP options. A ...
  • js 判断数组中存在select option的值,则选中option
  • 问题如图所示:动态渲染后对select 中的option 多次进行选择,option selected多个这会导致显示出错解决方案:每次动态渲染时清空 option selected属性$(".four-select option").removeAttr("...
  • jquery根据option的text定位选中option

    千次阅读 2018-01-25 11:10:51
    开始写的类似于这种: [javascript] view ...$('#test option[text="b"]').attr("selected",true);  或 [javascript] view plain copy $('#test').find('
  • jQuery获取option方法

    千次阅读 2019-07-02 09:48:44
    /获取第一个option的值 $(’#test option:first’).val(); //最后一个option的值 $(’#test option:last’).val(); //获取第二个option的值 $(’#test option:eq(1)’).val(); //获取选中的值 $(’#test’).val(); $...
  • CMake option选项开关

    千次阅读 2019-09-13 19:05:10
    CMake option 使用场景 : 编译脚本传递参数 -> CMake脚本接收option -> 源代码宏 编译脚本传入参数 传入一个cmake option TEST_DEBUG #!/bin/sh cmake -DTEST_DEBUG=ON . c...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 372,852
精华内容 149,140
关键字:

option