Httpclient3.1指定tlsv1.2协议访问https

前言

最近因公司某个服务器应用升级以及互联网安全要求,近期将禁用对TLSv1.0、TLSv1.1的访问支持,要求所有访问该服务的客户端项目升级到TLSv1.2,否则到期TLSv1.2生效后,将影响客户端的正常访问,于是安排工作着手对部份老项目进行升级改造。

TLS协议说明

百度百科的描述

安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。

该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。

传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与RFC 6176(2011年3月)。在浏览器、邮箱、即时通信、VoIP、网络传真等应用程序中,广泛支持这个协议。主要的网站,如Google、Facebook等也以这个协议来创建安全连线,发送数据。目前已成为互联网上保密通信的工业标准。

SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。

简单来说,TLS是一种应用于互联网通讯的安全协议,可以在客户端与服务端之间提供安全、信任的通讯模式,是基于HTTP封装的应用层协议;

目前主要流行TLS版本有TLSv1.0,TLSv1.1,TLSv1.2,SSLv3,SSLv2Hello,具体通讯协议需要视服务端设定而定,并且不同JDK版本对协议的使用存在差异;

需要注意的是客户端与服务端通讯,需要使用TLS一致相同的版本才能通讯,否则版本不同,服务端将关闭客户端的连接;

官方解释如下:

由于存在各种版本的 TLS(1.0、1.1、1.2 和可能的未来版本)和 SSL,TLS 协议提供了一种内置机制来协商要使用的特定协议版本。当客户端连接到服务器时,它会宣布它可以支持的最高版本,然后服务器会以实际用于连接的协议版本进行响应。如果服务器选择的版本不受客户端支持或不被客户端接受,则客户端终止协商并关闭连接。例如,如果客户端支持 TLS 1.2,但服务器只支持 TLS 1.0,他们将使用 TLS 1.0 进行通信;但是,如果客户端不支持 TLS 1.0,它会立即关闭连接。

在实践中,有些服务器没有正确实现,不支持协议版本协商。例如,仅支持 TLS 1.0 的服务器可能会简单地拒绝客户端对 TLS 1.2 的请求。即使客户端能够支持 TLS 1.0,也不会建立连接。这是一个服务器错误,通常称为“版本不兼容”。

基本通讯过程:

  • 1.客户端访问服务端先发送支持的TLS版本清单。
  • 2.服务端选择其中一个包含的指定或默认TLS协议版本并在响应中返回所选版本;
  • 3.客户端和服务端使用所选版本继续完成连接设置;

JDK7对TLS版本支持

开始改造前,查询到oracle官方有描述JDK各版本对TLS的支持说明,如下:

参见: https://blogs.oracle.com/java/post/diagnosing-tls-ssl-and-https

下表描述了每个 JDK 版本支持的协议和算法:

JDK 8

(2014 年 3 月至今)

JDK 7

(2011 年 7 月至今)

JDK 6

(2006 年至 2013 年公共更新结束 )

TLS 协议

TLSv1.2(默认)

TLSv1.1

TLSv1

SSLv3

TLSv1.2

TLSv1.1

TLSv1(默认)

SSLv3

TLS v1.1( JDK 6 更新 111 及更高版本)

TLSv1(默认)

SSLv3

JSSE 密码: JDK 8 中的密码 JDK 7 中的密码 JDK 6 中的密码
参考: JDK 8 JSSE JDK 7 JSSE JDK 6 JSSE
Java Cryptography Extension,无限强度(稍后解释) JDK 8 的 JCE JDK 7 的 JCE JDK 6 的 JCE

JDK1.8默认TLS协议版本为TLSv1.2,但JDK1.7默认TLS协议版本为TLSv1,因此需要更改TLS关键默认选项;

由于因历史原因,大部份项目是基于JDK1.7版本进行升级,由于考虑到历史项目直接升级JDK致1.8存在风险:生产环境项目运行稳定情况下,没经过大量测试与验证,以及引入了很多第三方JAR包,直接升级会带来未知问题;因此不考虑升级JDK1.8;

通过查询各类资源,发现最快捷并且无代码侵入的方式,可以通过JDK启动参数-Dhttps.protocols来指定当前环境的TLS协议版本;配置如下:

// -Djavax.net.debug=ssl:handshake 是用来打印协议日志,可以不用加

-Dhttps.protocols=TLSv1.2 -Djavax.net.debug=ssl:handshake

在JDK启动命令中添加

java -Dhttps.protocols=TLSv1.2 -Djavax.net.debug=ssl:handshake com.youApp.Main

JDK启动参数TLSv1.2不生效

通过在JDK启动参数中加-Dhttps.protocols=TLSv1.2指定TLS协议后,测试验证发现并未生效,还是使用的TLSv1,通过查阅文档与资源,得到信息,如下:

https.protocols :控制 Java 客户端使用的协议版本,这些客户端通过使用 HttpsURLConnection 类或通过 URL.openStream() 操作获得 https 连接。对于旧版本,如果您的 Java 7 客户端想要使用 TLS 1.2 作为其默认值,这可以更新默认值。

示例:-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2

也就是说 -Dhttps.protocols 主要用在通过使用 HttpsURLConnection 类或通过 URL.openStream() 操作获得 https 连接时,控制 Java 客户端使用的TLS协议版本;

基于上述线索,对使用的HttpUtils工具类进行源码查看,发现使用的是apache-commons-httpclient-3.1版本,提供http和https访问操作;

通过查看httpclient源码,其是通过HttpConnection类创建连接对象,进行https连接,是org.apache.commons.httpclient包中自行基于socket的封装的实现类;而HttpsURLConnection是JDK中javax.net.ssl包自带实现类,其中有对SSL做进一步的封装处理,因此HttpsURLConnection能够通过JDK启动参数-Dhttps.protocols指定TLSv1.2为网络环境通讯协议;(个人粗略见解,如有错误欢迎指正)

httpclient-3.1版本对TLSv1.2支持

项目中的引入apache-commons-httpclient-3.1版本的pom描述如下:


    commons-httpclient
    commons-httpclient
    3.1

在JDK添加启动参数-Dhttps.protocols=TLSv1.2无效后,只能重新进行分析,官方的最新版本httpclient-4.5.x已经有了SSLConnectionSocketFactory类可以直接扩展指定TLS版本,小量改动就能非常的方便的实现;

但还是考虑到历史项目的代码比较年长,直接升级httpclient版本,会造成引用的新、旧方法产生冲突或需要较多工作量改造完成,因此也放弃直接升级httpclient版本到最新的方案;

通过查询网上大量资料,发现httpclient-3.1指定到TLSv1.2的信息非常少,官方也未找到相关资源可参考;

于是经过不断的尝试与摸索,在我的之前写的一篇关于https基于ssl双向证书的博文中,总算找到实现方式;

参考: https://my.oschina.net/u/437309/blog/4414762

通过创建https连接时指定SSL协议默认版本来控制TLSv1.2;

通过简单改造后,运行项目进行验证,加上JDK命令启动参数-Djavax.net.debug=ssl:handshake打印https访问的协议日志,终于成功看到了客户端通过apache-commons-httpclient-3.1版本jar包指定TLSv1.2协议用https模式访问服务端的日志;

整理后示例如下:

package com.task.demo;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;

public class HttpsTLSv1_2Test {
    public static void main(String[] args) throws Exception {
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, null, null);
        javax.net.ssl.SSLSocketFactory factory = context.getSocketFactory();
        SSLSocket socket = (SSLSocket) factory.createSocket();
        //查看受支持的协议(supported protocols)
        String[] protocols = socket.getSupportedProtocols();
        System.out.println(Arrays.asList(protocols));
        //启用的协议(enabled protocols)
        protocols = socket.getEnabledProtocols();
        System.out.println(Arrays.asList(protocols));

        String url = "https://www.xxxx.com/service/openapi/info.do?id=1234";
        String result = get(url, "UTF-8", 3000, 3000);
        System.out.println("result:" + result);
    }
    
    // 以get方式发送http请求
    private static String get(String url, String encoding, int connectionTimeout, int soTimeout) {
        GetMethod getMethod = new GetMethod(url);
        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
        getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, soTimeout);
        HttpClient httpClient = new HttpClient();
        //指定TLSv1.2协议访问https
        try {
            TrustManager[] trustAllCerts =new TrustManager[1];
            TrustManager tm = new HttpTest.SslManager();
            trustAllCerts[0] = tm;
            SSLContext sc = SSLContext.getInstance("TLSv1.2");
            sc.init(null, trustAllCerts, null);
            SSLContext.setDefault(sc);
        }catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        }catch (KeyManagementException e) {
            e.printStackTrace();
        }
        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
        try {
            httpClient.getParams().setContentCharset(encoding);
            httpClient.executeMethod(getMethod);
            return getMethod.getResponseBodyAsString() ;
        } catch (HttpException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            getMethod.releaseConnection();
        }
    }

    //TrustManager是JSSE 信任管理器的基接口,管理和接受提供的证书,通过JSSE可以很容易地编程实现对HTTPS站点的访问
    //X509TrustManager此接口的实例管理使用哪一个 X509 证书来验证远端的安全套接字
    public static class SslManager implements TrustManager, X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
        }
        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
        }
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }
}

添加JVM启动参数-Djavax.net.debug=ssl:handshake后,打印的https访问的协议日志;

..... 略
Server write key:
0000: 6A 7D C5 54 EA 57 7D F0   3A B2 38 06 F1 7A EE 61  j..
0010: 13 C1 CE CF 4C EE 5E 40   9D EB 9B 38 6E C8 E6 68  ....
... no IV derived for this protocol
main, WRITE: TLSv1.2 Change Cipher Spec, length = 1
*** Finished
verify_data:  { 139, 74, 71, 182, 253, 192, 240, 99, ............ }
***
main, WRITE: TLSv1.2 Handshake, length = 96
main, READ: TLSv1.2 Change Cipher Spec, length = 1
main, READ: TLSv1.2 Handshake, length = 96
*** Finished
verify_data:  { 87, 184, 46, 252, 141, 177, 200, 223, .......... }
***
%% Cached client session: [Session-1, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384]
main, WRITE: TLSv1.2 Application Data, length = 192
main, READ: TLSv1.2 Application Data, length = 1408

result:Apache Tomcat/7.0.82 - ..... 略
Disconnected from the target VM, address: '127.0.0.1:53442', transport: 'socket'

Process finished with exit code 0</code></pre> 
  <p>其中日志中明确打印为main主程WRITE(写)和READ(读)都是TLSv1.2,其中写入字符长度为192,读取字符长度为1408;</p> 
  <pre><code>main, WRITE: TLSv1.2 Application Data, length = 192 
main, READ: TLSv1.2 Application Data, length = 1408</code></pre> 
  <p><strong>参考</strong></p> 
  <p>https://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html (阮一峰:图解SSL/TLS协议)</p> 
  <p>https://blogs.oracle.com/java/post/diagnosing-tls-ssl-and-https (oracle官方关于TLS、SSL和HTTPS)</p> 
  <p>https://chenyongjun.vip/articles/77 (TLS版本不适配问题)</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1706021092910510080"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Java,https,ssl,服务器)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1939910408848601088.htm"
                           title="推荐开源项目:Jupyter 与 Nix 的完美结合" target="_blank">推荐开源项目:Jupyter 与 Nix 的完美结合</a>
                        <span class="text-muted">支然苹</span>

                        <div>推荐开源项目:Jupyter与Nix的完美结合jupyenvDeclarativeandreproducibleJupyterenvironments-poweredbyNix项目地址:https://gitcode.com/gh_mirrors/ju/jupyenv在数据科学与编程领域,JupyterNotebook已经成为不可或缺的工具,以其交互性和易于分享的特点深受开发者和研究人员的喜爱。然</div>
                    </li>
                    <li><a href="/article/1939909777832341504.htm"
                           title="Spring Boot属性配置方式" target="_blank">Spring Boot属性配置方式</a>
                        <span class="text-muted">a_Dragon1</span>
<a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/Boot%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/1.htm">Boot学习记录</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/intellij-idea/1.htm">intellij-idea</a>
                        <div>一、SpringBoot属性配置方式。在编写完成后端程序之前,可以通过yml配置文件键值对的方式修改配置环境,一旦打包完成,再次修改yml配置文件较为麻烦,此时,可以使用以下配置方式:1.命令行参数方式--键=值--server.port=10010在JAR运行命令的后面添加此命令即可。java-jarXXX.jar--server.port=端口号2.操作下的环境变量方式3.外部配置文件方式在J</div>
                    </li>
                    <li><a href="/article/1939906752686387200.htm"
                           title="飞算JavaAI 2.0.0深度测评:自然语言编程如何重构开发生产力?" target="_blank">飞算JavaAI 2.0.0深度测评:自然语言编程如何重构开发生产力?</a>
                        <span class="text-muted">知识产权13937636601</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a>
                        <div>摘要2025年自然语言编程(NLPProgramming)迎来工业化拐点,飞算JavaAI2.0.0以语义理解精度>92%、企业级代码生成通过率>87%的核心能力,正在重构Java开发范式。本文通过电商、金融、工业物联网三大场景实测,揭秘其如何实现需求描述到可部署代码的端到端转化。数据显示:复杂业务模块开发效率提升3-8倍,逻辑缺陷率降低70%,同时提供语义级安全审计、架构腐化预警等独家能力,为传</div>
                    </li>
                    <li><a href="/article/1939905492872654848.htm"
                           title="centos环境变量加载顺序" target="_blank">centos环境变量加载顺序</a>
                        <span class="text-muted">龙卷_</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>在CentOS环境下环境变量(如PATH、JAVA_HOME)均通过配置文件来加载。而登录Shell(LoginShell)与非登录Shell(Non-LoginShell)加载的配置文件不同,具体如下:一、登录Shell(LoginShell)加载的文件触发场景:用户通过SSH登录、终端登录(如tty1~tty6)、su-username或bash-l。加载顺序:先加载系统级配置文件、再加载用户</div>
                    </li>
                    <li><a href="/article/1939904485719601152.htm"
                           title="DOCKER教程" target="_blank">DOCKER教程</a>
                        <span class="text-muted">weixin_34388207</span>
<a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>2019独角兽企业重金招聘Python工程师标准>>>注意事项1.官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/2.系统注意事项-由于现在的docker的局限性,现在只能使用在64位的服务器上边安装教程ubntu安装教程(12.0</div>
                    </li>
                    <li><a href="/article/1939903981069332480.htm"
                           title="docker ubuntu" target="_blank">docker ubuntu</a>
                        <span class="text-muted">weixin_30628801</span>

                        <div>DOCKER教程注意事项1.官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/08/getting-to-docker-1-0/2.系统注意事项-由于现在的docker的局限性,现在只能使用在64位的服务器上边安装教程ubntu安装教程(12.04)由于linux容器的bug,doc</div>
                    </li>
                    <li><a href="/article/1939903854707535872.htm"
                           title="Emgu-WPF 激光雷达研究-绘制雷达图" target="_blank">Emgu-WPF 激光雷达研究-绘制雷达图</a>
                        <span class="text-muted">DuelCode</span>
<a class="tag" taget="_blank" href="/search/WPF/1.htm">WPF</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/Emgu/1.htm">Emgu</a><a class="tag" taget="_blank" href="/search/%E6%BF%80%E5%85%89%E9%9B%B7%E8%BE%BE/1.htm">激光雷达</a><a class="tag" taget="_blank" href="/search/%E9%9B%B7%E8%BE%BE%E5%9B%BE/1.htm">雷达图</a>
                        <div>硬件:HokuyoURG04LX环境:VS2017-win10-64Emgu_3.2.0.2682语言:C#WPF数据解析参考:https://sourceforge.net/p/urgnetwork/wiki/Home/https://github.com/bqhdev/urg04lx_data_decoderhttp://sourceforge.net/projects/urgnetwork/</div>
                    </li>
                    <li><a href="/article/1939902215661613056.htm"
                           title="Cookie:Web 开发中的身份认证与数据存储利器" target="_blank">Cookie:Web 开发中的身份认证与数据存储利器</a>
                        <span class="text-muted">前端小巷子</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%9B%B8%E5%85%B3/1.htm">网络相关</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在Web开发中,Cookie是一个不可或缺的概念。它不仅用于身份认证,还用于存储用户偏好设置、会话信息等。本文将详细介绍Cookie的原理、组成、设置方法以及在实际开发中的应用。一、什么是Cookie?Cookie是一种存储在用户浏览器中的小型文本文件,用于存储用户会话信息。每个Cookie都有一个名称和一个值,通常由服务器在响应中设置,并由浏览器存储在用户的设备上。Cookie的主要用途是跟踪用</div>
                    </li>
                    <li><a href="/article/1939901206642094080.htm"
                           title="CentOS7 yum安装报错“Could not resolve host: mirrorlist.centos.org; Name or service not known“之解决办法(换源)" target="_blank">CentOS7 yum安装报错“Could not resolve host: mirrorlist.centos.org; Name or service not known“之解决办法(换源)</a>
                        <span class="text-muted">仁德者得天下</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>yum安装出现错误如下:yuminstall-ywget&&wget-Oinstall.shhttps://download.bt.cn/install/install_6.0.sh&&shinstall.sh12f2c1d72ImportError:/lib64/libcrypto.so.10:version`OPENSSL_1.0.2'notfound(requiredby/www/serve</div>
                    </li>
                    <li><a href="/article/1939900321186770944.htm"
                           title="服务端渲染SSR:原理、实践与未来趋势" target="_blank">服务端渲染SSR:原理、实践与未来趋势</a>
                        <span class="text-muted">GISer_Jinger</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a>
                        <div>深入解析服务器端渲染(SSR):原理、实践与未来趋势在当今追求极致用户体验的Web开发领域,服务器端渲染(SSR)已成为解决性能与SEO难题的关键技术。本文将带你深入理解SSR的核心机制、应用场景及前沿实践。一、SSR的本质与工作原理SSR(Server-SideRendering)指在服务器端生成完整HTML页面并发送至浏览器的技术。与客户端渲染(CSR)不同,SSR的核心流程如下:请求解析:用</div>
                    </li>
                    <li><a href="/article/1939900322461839360.htm"
                           title="YOLOv11-ultralytics-8.3.67部分代码阅读笔记-predict.py" target="_blank">YOLOv11-ultralytics-8.3.67部分代码阅读笔记-predict.py</a>
                        <span class="text-muted">红色的山茶花</span>
<a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a>
                        <div>predict.pyultralytics\models\yolo\detect\predict.py目录predict.py1.所需的库和模块2.classDetectionPredictor(BasePredictor):1.所需的库和模块#UltralyticsAGPL-3.0License-https://ultralytics.com/licensefromultralytics.eng</div>
                    </li>
                    <li><a href="/article/1939898305832087552.htm"
                           title="CentOS 7 & 8 安装 madam" target="_blank">CentOS 7 & 8 安装 madam</a>
                        <span class="text-muted">黄狗操作员</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>1、脚本安装#!/bin/bash#定义变量MDADM_VERSION="4.2"#替换为最新版本号MDADM_URL="https://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-${MDADM_VERSION}.tar.gz"LOCAL_DIR="/tmp/mdadm_install"REMOTE_USER="root"REMOTE_SERV</div>
                    </li>
                    <li><a href="/article/1939897547770359808.htm"
                           title="Redhat&Centos挂载镜像" target="_blank">Redhat&Centos挂载镜像</a>
                        <span class="text-muted">一位摩羯座DBA</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>一、RedHat8.21、上传镜像将系统镜像上传至服务器的home用户目录下。2、执行挂载mount/home/mcwd/rhel-8.2-x86_64-dvd.iso/mnt3、检查挂载df-h最后一行出现/mnt路径即可mount/dev/loop0/mnt/4、配置设置镜像源local.repo文件在文件中添加如下内容:mkdir/media/cdrom/umount/dev/sr0moun</div>
                    </li>
                    <li><a href="/article/1939892253774376960.htm"
                           title="AWS Cognito项目实战指南:集成用户管理与自定义电子邮件功能" target="_blank">AWS Cognito项目实战指南:集成用户管理与自定义电子邮件功能</a>
                        <span class="text-muted">一一MIO一一</span>

                        <div>本文还有配套的精品资源,点击获取简介:本项目涉及利用AWSCognito服务,创建一个基于云端的用户身份验证和管理应用。通过集成Cognito用户池,项目支持社交登录和自定义用户身份保护,同时涉及通过AWSLambda发送自定义电子邮件通知,增强用户体验。项目采用TypeScript编程语言,提升代码的可维护性和可读性,为开发者提供一个学习AWS无服务器认证解决方案的实践案例。1.AWSCogni</div>
                    </li>
                    <li><a href="/article/1939892127567769600.htm"
                           title="3、 使用Cognito加强应用程序安全性" target="_blank">3、 使用Cognito加强应用程序安全性</a>
                        <span class="text-muted">一一MIO一一</span>
<a class="tag" taget="_blank" href="/search/Amazon/1.htm">Amazon</a><a class="tag" taget="_blank" href="/search/Cognito/1.htm">Cognito</a><a class="tag" taget="_blank" href="/search/%E7%94%A8%E6%88%B7%E6%B1%A0/1.htm">用户池</a><a class="tag" taget="_blank" href="/search/%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81/1.htm">身份验证</a>
                        <div>使用Cognito加强应用程序安全性1.创建AmazonCognito用户池AmazonCognito是亚马逊提供的无服务器用户身份管理服务,它不仅可以用作身份提供者,还可以作为身份代理。在这一节中,我们将详细介绍如何通过控制台创建一个Cognito用户池,并对其基本信息进行设置和管理。准备工作为了创建用户池,你需要一个有效的工作AWS账户。如果你还没有AWS账户,可以先去官网注册一个。操作步骤登</div>
                    </li>
                    <li><a href="/article/1939891748394299392.htm"
                           title="java+vue+SpringBoo智慧旅游系统(程序+数据库+报告+部署教程+答辩指导)" target="_blank">java+vue+SpringBoo智慧旅游系统(程序+数据库+报告+部署教程+答辩指导)</a>
                        <span class="text-muted"></span>

                        <div>源代码+数据库+LW文档(1万字以上)+开题报告+答辩稿ppt+部署教程+代码讲解+代码时间修改工具技术实现开发语言:后端:Java前端:vue框架:springboot数据库:mysql开发工具JDK版本:JDK1.8数据库:mysql数据库工具:Navicat开发软件:idea主要角色及功能介绍本次系统的用例图做出了十分明确的功能划分,在设计时可以有很好的设计思路进行设计和延展。(1)管理员用</div>
                    </li>
                    <li><a href="/article/1939891622141554688.htm"
                           title="高效比较两个list中不同的元素" target="_blank">高效比较两个list中不同的元素</a>
                        <span class="text-muted">tanghuan0827</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/javaapi/1.htm">javaapi</a>
                        <div>第四种方法,将其中一个list转为map,并通过containsKey()方法比较,用在单元测试,读取dbf文件到redis队列,测试redis和dbf的是否相同packagecom.test;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;publicclassTest{publicstaticvoid</div>
                    </li>
                    <li><a href="/article/1939890613868621824.htm"
                           title="uni-app 自定义平台如何进行 static 目录的条件编译" target="_blank">uni-app 自定义平台如何进行 static 目录的条件编译</a>
                        <span class="text-muted">前端梦工厂+</span>
<a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">前端开发</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>一.自定义平台如何进行static目录的条件编译关于如何自定平台,参考之前文章:uni-app玩转条件编译:自定义平台的条件编译实战详解https://blog.csdn.net/qq_24956515/article/details/143951206由于官方不支持创建自定义平台下的static目录,例如以下方式,mp-weixin-custom会被认为是一个普通文件夹,将会在所有平台被打包进去</div>
                    </li>
                    <li><a href="/article/1939889477442924544.htm"
                           title="释放数据处理潜力:13款顶级MCP服务器全面解析" target="_blank">释放数据处理潜力:13款顶级MCP服务器全面解析</a>
                        <span class="text-muted">炼丹上岸</span>
<a class="tag" taget="_blank" href="/search/MCP/1.htm">MCP</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>引言:数据整理师的效率革命作为数据整理师,你是否曾为繁琐的数据清洗、格式转换和跨平台整合耗费大量时间?传统数据处理流程中,手动操作往往成为效率瓶颈——从杂乱的CSV文件到分散在多平台的API数据,每一步都可能陷入"数据泥潭"。而MCP(Multi-ChannelProcessing)服务器的出现,正通过自动化与智能化能力重构这一现状。本文将深入解析13款适用于不同场景的MCP服务器,覆盖从网络数据</div>
                    </li>
                    <li><a href="/article/1939887584872296448.htm"
                           title="csigdiplus.dll ccb_pin_cert.dll CNCF2M50.dll cu4usb.dll CATCafPrint.dll COL32LU.dll ClassLibra" target="_blank">csigdiplus.dll ccb_pin_cert.dll CNCF2M50.dll cu4usb.dll CATCafPrint.dll COL32LU.dll ClassLibra</a>
                        <span class="text-muted">K9DMGY8SCC</span>
<a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a>
                        <div>在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用MicrosoftVisualStudio编写的,所以这类软件的运行需要依赖微软VisualC++运行库,比如像QQ、迅雷、Adobe软件等等,如果没有安装VC++运行库或者安装的版本不完整,就可能会导致这些软件启动时报错,提示缺少库文件。如果我们遇到关于文件在系统使用过程中提示缺少找不到的情况,如果文件是属于运行库文件的</div>
                    </li>
                    <li><a href="/article/1939887457751330816.htm"
                           title="近百万奖金!2024 Web3.0 创新大赛重磅来袭!" target="_blank">近百万奖金!2024 Web3.0 创新大赛重磅来袭!</a>
                        <span class="text-muted">DataFountain数据科学</span>
<a class="tag" taget="_blank" href="/search/web3/1.htm">web3</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%AB%9E%E8%B5%9B/1.htm">数据竞赛</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>10月30日,中国互联网协会与香港Web3.0协会共同组织举办的2024Web3.0创新大赛在上海举行启动会,宣布大赛正式在DataFountain竞赛平台(简称DF平台,http://www.datafountain.cn)启动上线。大赛面向社会各界征集参赛团队,不限年龄、国籍,高校、科研院所、企业人员均可参赛!两大赛区,六大赛道,近百万奖金,你不来吗:https://www.datafount</div>
                    </li>
                    <li><a href="/article/1939885874145718272.htm"
                           title="数据库连接池优化深度解析" target="_blank">数据库连接池优化深度解析</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>在Java企业级应用中,数据库连接池作为数据库访问的核心组件,其性能直接影响系统的整体吞吐量与稳定性。本文从连接池核心参数、性能调优策略、监控与故障诊断及面试高频问题四个维度,结合主流连接池实现(HikariCP、Druid)与工程实践,系统解析数据库连接池的优化方法与最佳实践。一、连接池核心原理与关键参数1.1连接池工作流程1.2关键参数解析(以HikariCP为例)参数作用推荐值maximum</div>
                    </li>
                    <li><a href="/article/1939880654795763712.htm"
                           title="从文心开源谈起,论大模型发展新生态" target="_blank">从文心开源谈起,论大模型发展新生态</a>
                        <span class="text-muted">CSDN资讯</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a>
                        <div>6月30日,百度正式宣布开源ERNIE4.5即文心4.5系列模型,覆盖47B和3B激活参数的MoE(混合专家)模型,以及0.3B参数的稠密模型,并实现了预训练权重+推理代码的完全开源。文心大模型4.5系列开源模型国内下载地址:https://ai.gitcode.com/theme/1939325484087291906百度成为继DeepSeek之后又一重磅国产大模型开源。这不仅是数量的堆叠,更标</div>
                    </li>
                    <li><a href="/article/1939876246498373632.htm"
                           title="【加密】对称加密DES和非对称加密AES、数字签名" target="_blank">【加密】对称加密DES和非对称加密AES、数字签名</a>
                        <span class="text-muted">bdview</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E5%AF%86%E7%A0%81%E5%AD%A6/1.htm">密码学</a><a class="tag" taget="_blank" href="/search/openssl/1.htm">openssl</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>目录对称加密1.1定义1.2优缺点1.3常用对称加密算法非对称加密(AsymmetricCryptography)非对称加密(现代加密算法)2.1定义数字签名非常好的文章:《三分钟了解对称加密和非对称加密是如何工作的》https://zhuanlan.zhihu.com/p/108627377主要加密算法有哪些:https://blog.csdn.net/baidu_22254181/articl</div>
                    </li>
                    <li><a href="/article/1939871460642320384.htm"
                           title="error: error:0308010c:digital envelope routines::unsupported" target="_blank">error: error:0308010c:digital envelope routines::unsupported</a>
                        <span class="text-muted">ZeroOber</span>
<a class="tag" taget="_blank" href="/search/vscode/1.htm">vscode</a>
                        <div>npm运行命令报错:error:error:0308010c:digitalenveloperoutines::unsupportedError:error:0308010C:digitalenveloperoutines::unsupported是Node.js中与加密模块(OpenSSL)相关的常见问题,通常出现在Node.jsv17+版本中引起错误的原因:Node.js从v17.x开始默认使</div>
                    </li>
                    <li><a href="/article/1939871082148327424.htm"
                           title="告别GPU焦虑:如何在纯CPU服务器上,打造高性能Embedding服务?" target="_blank">告别GPU焦虑:如何在纯CPU服务器上,打造高性能Embedding服务?</a>
                        <span class="text-muted">ezl1fe</span>
<a class="tag" taget="_blank" href="/search/embedding/1.htm">embedding</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>Hi,大家好,我是ezl1fe。最近接手一个项目,要求在纯CPU服务器上部署Embedding模型服务。兄弟们都懂,GPU它香啊,但它也贵啊!很多时候,咱只能在有限的资源里想办法。一开始,我们图方便,直接从HuggingFace上拉了当时效果最好的BAAI/bge-m3模型,用transformers库一把梭。结果呢?部署到一台8核16G的服务器上,精度是高,但性能也是真的“感人”,单个请求响应要</div>
                    </li>
                    <li><a href="/article/1939864656390713344.htm"
                           title="你真的懂你的客户吗?——数据埋点和用户画像的重要性" target="_blank">你真的懂你的客户吗?——数据埋点和用户画像的重要性</a>
                        <span class="text-muted">山海上的风</span>
<a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>你真的懂你的客户吗?——数据埋点和用户画像的重要性“用户点击的背后,藏着我们下个月工资的来源”——某不愿透露姓名的Java程序员为什么开发者必须懂用户?当支付按钮的点击率下降3%,可能意味着:产品经理在会议室里焦头烂额运营团队连夜调整促销策略而你的下一个需求优先级,正由这个数据决定一、当技术遇见人性:用户数据的价值在电商平台中,62%的购物车放弃率不是因为技术故障——用户可能在付款环节犹豫价格,或</div>
                    </li>
                    <li><a href="/article/1939860627182907392.htm"
                           title="Java基础(六):数组全面解析" target="_blank">Java基础(六):数组全面解析</a>
                        <span class="text-muted">冬天vs不冷</span>
<a class="tag" taget="_blank" href="/search/java%E5%9F%BA%E7%A1%80/1.htm">java基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>Java基础系列文章Java基础(一):初识Java——发展历程、技术体系与JDK环境搭建Java基础(二):八种基本数据类型详解Java基础(三):逻辑运算符详解Java基础(四):位运算符详解Java基础(五):流程控制全解析——分支(if/switch)和循环(for/while)的深度指南Java基础(六):数组全面解析目录一、数组的概述1、什么是数组?2、数组的特点3、数组分类二、一维数</div>
                    </li>
                    <li><a href="/article/1939859367771828224.htm"
                           title="Java数组详解:从基础到高级应用" target="_blank">Java数组详解:从基础到高级应用</a>
                        <span class="text-muted">需要重新演唱</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>Java数组详解:从基础到高级应用在Java编程中,数组是一种基本且重要的数据结构,用于存储和管理一组相同类型的数据。无论是初学者还是经验丰富的开发者,理解数组的原理、操作和应用场景都是至关重要的。本文将深入探讨Java数组的概念、特性、操作方法以及高级应用,旨在为读者提供一份全面而深入的数组知识指南。一、Java数组基础1.1什么是数组数组(Array)是一种线性数据结构,用于存储一组相同类型的</div>
                    </li>
                    <li><a href="/article/1939857225547837440.htm"
                           title="java数组解析_实例讲解Java数组解构" target="_blank">java数组解析_实例讲解Java数组解构</a>
                        <span class="text-muted">关然</span>
<a class="tag" taget="_blank" href="/search/java%E6%95%B0%E7%BB%84%E8%A7%A3%E6%9E%90/1.htm">java数组解析</a>
                        <div>数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按有序的形式组织起来的一种形式。我们可以把数组看成是用于储存多个相同类型数据的集合,我们在需要用到数组中的一部分数据时,就需要用到数组解构,获得相应的数据。本文我们就一起来学习Java数组解构的相关知识。1.简单解构constnumbers=['a','b','c'];//获取前两项const[n1,n2]=numbers;console.</div>
                    </li>
                                <li><a href="/article/60.htm"
                                       title="Dom" target="_blank">Dom</a>
                                    <span class="text-muted">周华华</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a>
                                    <div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml&q</div>
                                </li>
                                <li><a href="/article/187.htm"
                                       title="【Spark九十六】RDD API之combineByKey" target="_blank">【Spark九十六】RDD API之combineByKey</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a>
                                    <div>1. combineByKey函数的运行机制 
  
RDD提供了很多针对元素类型为(K,V)的API,这些API封装在PairRDDFunctions类中,通过Scala隐式转换使用。这些API实现上是借助于combineByKey实现的。combineByKey函数本身也是RDD开放给Spark开发人员使用的API之一 
  
首先看一下combineByKey的方法说明:</div>
                                </li>
                                <li><a href="/article/314.htm"
                                       title="msyql设置密码报错:ERROR 1372 (HY000): 解决方法详解" target="_blank">msyql设置密码报错:ERROR 1372 (HY000): 解决方法详解</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E7%BD%AE%E5%AF%86%E7%A0%81/1.htm">设置密码</a>
                                    <div>MySql给用户设置权限同时指定访问密码时,会提示如下错误: 
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number; 
  
问题原因:你输入的密码是明文。不允许这么输入。 
  
解决办法:用select password('你想输入的密码');查询出你的密码对应的字符串, 
然后</div>
                                </li>
                                <li><a href="/article/441.htm"
                                       title="路漫漫其修远兮 吾将上下而求索" target="_blank">路漫漫其修远兮 吾将上下而求索</a>
                                    <span class="text-muted">周凡杨</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0+%E6%80%9D%E7%B4%A2/1.htm">学习 思索</a>
                                    <div>王国维在他的《人间词话》中曾经概括了为学的三种境界古今之成大事业、大学问者,罔不经过三种之境界。“昨夜西风凋碧树。独上高楼,望尽天涯路。”此第一境界也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境界也。“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”此第三境界也。学习技术,这也是你必须经历的三种境界。第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。这里,注</div>
                                </li>
                                <li><a href="/article/568.htm"
                                       title="Hadoop(二)对话单的操作" target="_blank">Hadoop(二)对话单的操作</a>
                                    <span class="text-muted">朱辉辉33</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a>
                                    <div>Debug: 
 
1、 
 
A = LOAD '/user/hue/task.txt' USING PigStorage(' ') 
AS (col1,col2,col3); 
DUMP A; 
 
//输出结果前几行示例: 
(>ggsnPDPRecord(21),,) 
(-->recordType(0),,) 
(-->networkInitiation(1),,) 
</div>
                                </li>
                                <li><a href="/article/695.htm"
                                       title="web报表工具FineReport常用函数的用法总结(日期和时间函数)" target="_blank">web报表工具FineReport常用函数的用法总结(日期和时间函数)</a>
                                    <span class="text-muted">老A不折腾</span>
<a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E5%B7%A5%E5%85%B7/1.htm">报表工具</a><a class="tag" taget="_blank" href="/search/web%E5%BC%80%E5%8F%91/1.htm">web开发</a>
                                    <div>web报表工具FineReport常用函数的用法总结(日期和时间函数) 
  
说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd。而且必须用英文环境下双引号(" ")引用。 
  
DATE 
DATE(year,month,day):返回一个表示某一特定日期的系列数。 
Year:代表年,可为一到四位数。 
Month:代表月份。</div>
                                </li>
                                <li><a href="/article/822.htm"
                                       title="c++ 宏定义中的##操作符" target="_blank">c++ 宏定义中的##操作符</a>
                                    <span class="text-muted">墙头上一根草</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a>
                                    <div>#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {       &nbs</div>
                                </li>
                                <li><a href="/article/949.htm"
                                       title="分析Spring源代码之,DI的实现" target="_blank">分析Spring源代码之,DI的实现</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/DI/1.htm">DI</a><a class="tag" taget="_blank" href="/search/%E7%8E%B0/1.htm">现</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E4%BB%A3%E7%A0%81/1.htm">源代码</a>
                                    <div>(转) 
   
分析Spring源代码之,DI的实现  
2012/1/3 by tony 
                接着上次的讲,以下这个sample    
[java]  
view plain 
copy 
print 
</div>
                                </li>
                                <li><a href="/article/1076.htm"
                                       title="for循环的进化" target="_blank">for循环的进化</a>
                                    <span class="text-muted">alxw4616</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>// for循环的进化
// 菜鸟
for (var i = 0; i < Things.length ; i++) {
	// Things[i]
}

// 老鸟
for (var i = 0, len = Things.length; i < len; i++) {
	// Things[i]
}

// 大师
for (var i = Things.le</div>
                                </li>
                                <li><a href="/article/1203.htm"
                                       title="网络编程Socket和ServerSocket简单的使用" target="_blank">网络编程Socket和ServerSocket简单的使用</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80/1.htm">网络编程基础</a><a class="tag" taget="_blank" href="/search/IP%E5%9C%B0%E5%9D%80%E7%AB%AF%E5%8F%A3/1.htm">IP地址端口</a>
                                    <div>  
网络编程;TCP/IP协议 
  
网络:实现计算机之间的信息共享,数据资源的交换 
  
协议:数据交换需要遵守的一种协议,按照约定的数据格式等写出去 
  
端口:用于计算机之间的通信 
     每运行一个程序,系统会分配一个编号给该程序,作为和外界交换数据的唯一标识 
0~65535 
  
查看被使用的</div>
                                </li>
                                <li><a href="/article/1330.htm"
                                       title="JDK1.5 生产消费者" target="_blank">JDK1.5 生产消费者</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E4%BA%A7%E6%B6%88%E8%B4%B9%E8%80%85/1.htm">生产消费者</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a>
                                    <div>ArrayBlockingQueue: 
       一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。 
ArrayBlockingQueue的常用方法: 
</div>
                                </li>
                                <li><a href="/article/1457.htm"
                                       title="JAVA版身份证获取性别、出生日期及年龄" target="_blank">JAVA版身份证获取性别、出生日期及年龄</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E5%88%AB/1.htm">性别</a><a class="tag" taget="_blank" href="/search/%E5%87%BA%E7%94%9F%E6%97%A5%E6%9C%9F/1.htm">出生日期</a><a class="tag" taget="_blank" href="/search/%E5%B9%B4%E9%BE%84/1.htm">年龄</a>
                                    <div>        工作中需要根据身份证获取性别、出生日期及年龄,且要还要支持15位长度的身份证号码,网上搜索了一下,经过测试好像多少存在点问题,干脆自已写一个。 
CertificateNo.java 
package com.bijian.study;

import java.util.Calendar;
import </div>
                                </li>
                                <li><a href="/article/1584.htm"
                                       title="【Java范型六】范型与枚举" target="_blank">【Java范型六】范型与枚举</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>首先,枚举类型的定义不能带有类型参数,所以,不能把枚举类型定义为范型枚举类,例如下面的枚举类定义是有编译错的 
  
public enum EnumGenerics<T> { //编译错,提示枚举不能带有范型参数
    OK, ERROR;
    public <T> T get(T type) {
        return null;
    </div>
                                </li>
                                <li><a href="/article/1711.htm"
                                       title="【Nginx五】Nginx常用日志格式含义" target="_blank">【Nginx五】Nginx常用日志格式含义</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a>
                                    <div>1. log_format 
1.1 log_format指令用于指定日志的格式,格式: 
  
log_format name(格式名称) type(格式样式) 
  
1.2 如下是一个常用的Nginx日志格式: 
  
log_format      main    '[$time_local]|$request_time|$status|$body_bytes</div>
                                </li>
                                <li><a href="/article/1838.htm"
                                       title="Lua 语言 15 分钟快速入门" target="_blank">Lua 语言 15 分钟快速入门</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/lua+%E5%9F%BA%E7%A1%80/1.htm">lua 基础</a>
                                    <div>-
- 
单行注释   
-
-
[[   
    
[多行注释]   
-
-
]]       
-
-
-
-
-
-
-
-
-
-   
- 
1. 
变量 & 控制流   
-
-
-
-
-
-
-
-
-
-   
num 
= 
23 
-
- 
数字都是双精度   
str 
= 
'aspythonstring' 
</div>
                                </li>
                                <li><a href="/article/1965.htm"
                                       title="java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 )" target="_blank">java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 )</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>the idea is from: 
http://blog.csdn.net/zhanxinhang/article/details/6731134 
 


public class MaxSubMatrix {

	/**see http://blog.csdn.net/zhanxinhang/article/details/6731134
	 * Q35
求一个矩阵中最大的二维</div>
                                </li>
                                <li><a href="/article/2092.htm"
                                       title="mongoDB文档型数据库特点" target="_blank">mongoDB文档型数据库特点</a>
                                    <span class="text-muted">开窍的石头</span>
<a class="tag" taget="_blank" href="/search/mongoDB%E6%96%87%E6%A1%A3%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%89%B9%E7%82%B9/1.htm">mongoDB文档型数据库特点</a>
                                    <div>MongoDD: 文档型数据库存储的是Bson文档-->json的二进制 
 
特点:内部是执行引擎是js解释器,把文档转成Bson结构,在查询时转换成js对象。 
 
mongoDB传统型数据库对比 
   传统类型数据库:结构化数据,定好了表结构后每一个内容符合表结构的。也就是说每一行每一列的数据都是一样的 
   文档型数据库:不用定好数据结构,</div>
                                </li>
                                <li><a href="/article/2219.htm"
                                       title="[毕业季节]欢迎广大毕业生加入JAVA程序员的行列" target="_blank">[毕业季节]欢迎广大毕业生加入JAVA程序员的行列</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div> 
    一年一度的毕业季来临了。。。。。。。。 
 
     正在投简历的学弟学妹们。。。如果觉得学校推荐的单位和公司不适合自己的兴趣和专业,可以考虑来我们软件行业,做一名职业程序员。。。 
 
     软件行业的开发工具中,对初学者最友好的就是JAVA语言了,网络上不仅仅有大量的</div>
                                </li>
                                <li><a href="/article/2346.htm"
                                       title="PHP操作Excel – PHPExcel 基本用法详解" target="_blank">PHP操作Excel – PHPExcel 基本用法详解</a>
                                    <span class="text-muted">cuiyadll</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a>
                                    <div>导出excel属性设置//Include classrequire_once('Classes/PHPExcel.php');require_once('Classes/PHPExcel/Writer/Excel2007.php');$objPHPExcel = new PHPExcel();//Set properties 设置文件属性$objPHPExcel->getProperties</div>
                                </li>
                                <li><a href="/article/2473.htm"
                                       title="IBM Webshpere MQ Client User Issue (MCAUSER)" target="_blank">IBM Webshpere MQ Client User Issue (MCAUSER)</a>
                                    <span class="text-muted">darrenzhu</span>
<a class="tag" taget="_blank" href="/search/IBM/1.htm">IBM</a><a class="tag" taget="_blank" href="/search/jms/1.htm">jms</a><a class="tag" taget="_blank" href="/search/user/1.htm">user</a><a class="tag" taget="_blank" href="/search/MQ/1.htm">MQ</a><a class="tag" taget="_blank" href="/search/MCAUSER/1.htm">MCAUSER</a>
                                    <div>IBM MQ JMS Client去连接远端MQ Server的时候,需要提供User和Password吗? 
答案是根据情况而定,取决于所定义的Channel里面的属性Message channel agent user identifier (MCAUSER)的设置。 
 
 
http://stackoverflow.com/questions/20209429/how-mca-user-i</div>
                                </li>
                                <li><a href="/article/2600.htm"
                                       title="网线的接法" target="_blank">网线的接法</a>
                                    <span class="text-muted">dcj3sjt126com</span>

                                    <div>一、PC连HUB (直连线)A端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 二、PC连PC (交叉线)A端:(568A): 白绿,绿,白橙,蓝,白蓝,橙,白棕,棕; B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 三、HUB连HUB&nb</div>
                                </li>
                                <li><a href="/article/2727.htm"
                                       title="Vimium插件让键盘党像操作Vim一样操作Chrome" target="_blank">Vimium插件让键盘党像操作Vim一样操作Chrome</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a>
                                    <div>什么是键盘党? 
 
 键盘党是指尽可能将所有电脑操作用键盘来完成,而不去动鼠标的人。鼠标应该说是新手们的最爱,很直观,指哪点哪,很听话!不过常常使用电脑的人,如果一直使用鼠标的话,手会发酸,因为操作鼠标的时候,手臂不是在一个自然的状态,臂肌会处于绷紧状态。而使用键盘则双手是放松状态,只有手指在动。而且尽量少的从鼠标移动到键盘来回操作,也省不少事。 
 在chrome里安装 vimium 插件 
</div>
                                </li>
                                <li><a href="/article/2854.htm"
                                       title="MongoDB查询(2)——数组查询[六]" target="_blank">MongoDB查询(2)——数组查询[六]</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/MongoDB%E6%9F%A5%E8%AF%A2%E6%95%B0%E7%BB%84/1.htm">MongoDB查询数组</a>
                                    <div>MongoDB查询数组 
转载请出自出处:http://eksliang.iteye.com/blog/2177292 一、概述 
 MongoDB查询数组与查询标量值是一样的,例如,有一个水果列表,如下所示: 
> db.food.find()
{ "_id" : "001", "fruits" : [ "苹</div>
                                </li>
                                <li><a href="/article/2981.htm"
                                       title="cordova读写文件(1)" target="_blank">cordova读写文件(1)</a>
                                    <span class="text-muted">gundumw100</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Cordova/1.htm">Cordova</a>
                                    <div>使用cordova可以很方便的在手机sdcard中读写文件。 
 
首先需要安装cordova插件:file 
命令为: 
 
cordova plugin add org.apache.cordova.file 
 
然后就可以读写文件了,这里我先是写入一个文件,具体的JS代码为: 
 


var datas=null;//datas need write
var directory=&</div>
                                </li>
                                <li><a href="/article/3108.htm"
                                       title="HTML5 FormData 进行文件jquery ajax 上传 到又拍云" target="_blank">HTML5 FormData 进行文件jquery ajax 上传 到又拍云</a>
                                    <span class="text-muted">ileson</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/FormData/1.htm">FormData</a>
                                    <div>html5 新东西:FormData  可以提交二进制数据。 
 
 
页面test.html 
 

<!DOCTYPE>
<html>
<head>
<title> formdata file jquery ajax upload</title>
</head>

<body>
<</div>
                                </li>
                                <li><a href="/article/3235.htm"
                                       title="swift appearanceWhenContainedIn:(version1.2 xcode6.4)" target="_blank">swift appearanceWhenContainedIn:(version1.2 xcode6.4)</a>
                                    <span class="text-muted">啸笑天</span>
<a class="tag" taget="_blank" href="/search/version/1.htm">version</a>
                                    <div>  
swift1.2中没有oc中对应的方法: 
+ (instancetype)appearanceWhenContainedIn:(Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION; 
 解决方法: 
在swift项目中新建oc类如下: 
#import &</div>
                                </li>
                                <li><a href="/article/3362.htm"
                                       title="java实现SMTP邮件服务器" target="_blank">java实现SMTP邮件服务器</a>
                                    <span class="text-muted">macroli</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a>
                                    <div>电子邮件传递可以由多种协议来实现。目前,在Internet 网上最流行的三种电子邮件协议是SMTP、POP3 和 IMAP,下面分别简单介绍。 
  ◆ SMTP 协议 
  简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一个运行在TCP/IP之上的协议,用它发送和接收电子邮件。SMTP 服务器在默认端口25上监听。SMTP客户使用一组简单的、基于文本的</div>
                                </li>
                                <li><a href="/article/3489.htm"
                                       title="mongodb group by having where 查询sql" target="_blank">mongodb group by having where 查询sql</a>
                                    <span class="text-muted">qiaolevip</span>
<a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/mongo/1.htm">mongo</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a>
                                    <div>SELECT cust_id,
       SUM(price) as total
FROM orders
WHERE status = 'A'
GROUP BY cust_id
HAVING total > 250

db.orders.aggregate( [
   { $match: { status: 'A' } },
   {
     $group: {
</div>
                                </li>
                                <li><a href="/article/3616.htm"
                                       title="Struts2 Pojo(六)" target="_blank">Struts2 Pojo(六)</a>
                                    <span class="text-muted">Luob.</span>
<a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/strust2/1.htm">strust2</a>
                                    <div>注意:附件中有完整案例 
1.采用POJO对象的方法进行赋值和传值 
2.web配置 
 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee&q</div>
                                </li>
                                <li><a href="/article/3743.htm"
                                       title="struts2步骤" target="_blank">struts2步骤</a>
                                    <span class="text-muted">wuai</span>
<a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a>
                                    <div>1、添加jar包 
2、在web.xml中配置过滤器 
 <filter> 
       <filter-name>struts2</filter-name> 
       <filter-class>org.apache.st</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>