2019独角兽企业重金招聘Python工程师标准>>>

SSO之CAS单点登录详细搭建 :
环境说明:
同一个机器上环境如下:
操作系统:windows7 64位
JDK版本:1.7.0_80
web容器版本:apache-tomcat-7.0.70 64位
服务端:cas-3.5.2.1.zip
服务端现在地址:https://github.com/apereo/cas/archive/v4.2.3.zip
客户端:cas-client-3.3.3-release.zip
客户端下载地址:http://developer.jasig.org/cas-clients/
eclipse版本:eclipse-jee-luna-SR2-win32-x86_64.zip

1、将cas-3.5.2.1  cas-client-3.3.3 标准maven工程导入eclipse 打包编译;

2、修改本机 C:\Windows\System32\drivers\etc\hosts (CAS单点登录系统是基于JAVA安全证书的 https 访问,要使用CAS单点登录必须要配置域名, cas是不能通过ip访问的.)
  附件-->记事本管理员权限编辑hosts文件,加入如下三行代码后保存。
127.0.0.1 server.flyer.com
127.0.0.1 client1.flyer.com
127.0.0.1 client2.flyer.com

解释:
server.flyer.com    =>>  对应部署cas server的tomcat,这个虚拟域名还用于服务端证书生成
client1.flyer.com   =>>  对应部署client1客户端应用的tomcat
client2.flyer.com   =>>  对应部署client2客户端应用的tomcat

3、安全证书配置

3.1、管理员模式打开cmd命令窗口,生成证书,在cmd窗口输入以下命令:
C:\Users\Administrator>keytool -genkey -alias ssoflyer -keyalg RSA -keysize 1024 -keypass flyer2016 -validity 365 -keystore D:\app\flyer.keystore -storepass flyer2016
说明:-alias自定义的别名;
      -keypass指定证书密钥库的密码;
      -storepass和前面keypass密码相同,否则下面tomcat配置https会访问失败;
      -keystore指定证书的位置,例如:D:\app\目录,密钥库名称可以自定义,例如:flyer.keystore
特别注意:您的名字与姓氏是什么?该项一定要使用网站的域名,例如: server.flyer.com ,Cas Client使用httpclient访问cas server的时候,会严格的检查证书。
示例如下:
C:\Users\Administrator>keytool -genkey -alias ssoflyer -keyalg RSA -keysize 1024 -keypass flyer2016 -validity 365 -keystore D:\app\flyer.keystore -storepass flyer2016
您的名字与姓氏是什么?
  [Unknown]:  server.flyer.com
您的组织单位名称是什么?
  [Unknown]:  HCZX_hczx
您的组织名称是什么?
  [Unknown]:  kaifabumen
您所在的城市或区域名称是什么?
  [Unknown]:  longgangbantian
您所在的州或省份名称是什么?
  [Unknown]:  guangdong
该单位的两字母国家代码是什么
  [Unknown]:  0755
CN=server.flyer.com, OU=HCZX_hczx, O=kaifabumen, L=longgangbantian, ST=guangdong, C=0755 正确吗?
  [否]:  y

3.2、导出证书:
在cmd窗口继续输入以下命令,导出证书:
C:\Users\Administrator>keytool -export -alias ssoflyer -keystore D:\app\flyer.keystore -file D:\app\ssoflyer.crt -storepass flyer2016

说明:-alias后面的名称要与生成证书的命令里面的alias的名称一致;
      –keystore后面指定证书存放的位置,上面定义的D:\app\目录;
      证书名称要与【生成证书】对应的命令里的keystore名称一致.这里是flyer.keystore;
      -file后面才crt路径,指定在D:\app\目录;
      –storepass的证书密码要与上面输入的密码一致.

3.3、客户端导入证书

在cmd窗口输入命令:
添加 keypair   JDK
keytool -importcert -alias ssoflyer -file D:\app\ssoflyer.crt  -keystore %JAVA_HOME%\jre\lib\security\cacerts  -storepass changeit -noprompt
查看 keypair: JDK
keytool -list -alias ssoflyer -keystore %JAVA_HOME%\jre\lib\security\cacerts -storepass changeit
删除 keypair: JDK
keytool -delete -keystore %JAVA_HOME%\jre\lib\security\cacerts -alias ssoflyer -storepass changeit

添加 keypair:  JRE
keytool -importcert -alias ssoflyer -file D:\app\ssoflyer.crt  -keystore D:\app\Java\jre1.7.0_80\lib\security\cacerts  -storepass changeit -noprompt
查看 keypair:  JRE
keytool -list -alias ssoflyer -keystore D:\app\Java\jre1.7.0_80\lib\security\cacerts -storepass changeit
删除 keypair:  JRE
keytool -delete -keystore D:\app\Java\jre1.7.0_80\lib\security\cacerts -alias ssoflyer -storepass changeit

说明:-file指定证书的位置,上一步导出证书的位置,即D:\app\ssoflyer.crt;
      实际测试过程中,最好jdk jre的security中都把证书导入;
      这里-storepass的密码必须要输入changeit,不能输入上面指定的密码 flyer2016 ,否则导入客户端证书会有问题。

4、部署CAS-Server相关的Tomcat
apache-tomcat-7.0.70-server配置HTTPS 编辑D:\app\apache-tomcat-7.0.70-server\conf\server.xml,找到下面片段:

注释:
  <!--APR library loader. Documentation at /docs/apr.html
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
   -->

<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />
-->
拷贝一份,修改成:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
   keystoreFile="D:/app/flyer.keystore" keystorePass="flyer2016"
   clientAuth="false" sslProtocol="TLS" />

其中,keystoreFile就是创建证书的路径,keystorePass就是创建证书的密码.

启动tomcat 验证https是否配置成功,浏览器访问,在地址栏输入
https://server.flyer.com:8443/  出现tomcat欢迎页,表明tomcat的https配置OK.
点击【我已充分了解可能的风险】,点击出现的【添加例外】—【确认安全例外】!

部署CAS-Server,将打包编译好的cas.war,把改文件copy到D:\app\apache-tomcat-7.0.70-server\webapps\webapps 目录下。
启动tomcat,在浏览器地址栏输入:https://server.flyer.com:8443/cas ,出现CAS服务端的登录验证首页,表示配置OK.

用mysql来进行用户名密码验证,具体配置如下:

用户名和密码肯定需要和数据库进行交互验证的,如何配置呢?

【说明】:我本地使用的是mysql数据库。
1、修改工程cas-server-webapp 中的 deployerConfigContext.xml文件

<bean
                    class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">
                    <property name="dataSource" ref="casDataSource"></property>
                    <property name="tableUsers" value="cas_login"></property>
                    <property name="fieldUser" value="user_name"></property>
                    <property name="fieldPassword" value="passwords"></property>
                    <property name="passwordEncoder" ref="MD5PasswordEncoder"></property>
                </bean>

<bean id="MD5PasswordEncoder"
        class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
        <constructor-arg index="0">
            <value>MD5</value>
        </constructor-arg>
    </bean>

<!-- 定义数据源 -->
    <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="jdbc:mysql://localhost:3306/appstore?useUnicode=true&amp;characterEncoding=utf8" />
        <property name="username" value="root" />
        <property name="password" value="root123456" />
        <property name="minEvictableIdleTimeMillis" value="-1" />
        <property name="validationQuery" value="select 1 from dual" />
    </bean>

<bean id="attributeRepository"
        class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
        <constructor-arg index="0" ref="casDataSource" />
        <constructor-arg index="1"
            value="select user_name username from cas_login where user_name=?" />
        <property name="queryAttributeMapping">
            <map>
                <entry key="username" value="user_name" />
            </map>
        </property>
        <property name="resultAttributeMapping">
            <map>
                <entry key="username" value="user_name" />
            </map>
        </property>
    </bean>

5、部署CAS客户端相关的Tomcat

首先,客户端应用是要和CAS服务端进行交互的,所以这里需要jar文件,放在客户端应用的lib目录下。分别是:

apache-tomcat-7.0.70-client1\webapps\castest\WEB-INF\lib
cas-client-core-3.3.3.jar
commons-logging-1.1.1.jar
log4j-1.2.15.jar
slf4j-api-1.7.1.jar
slf4j-log4j12-1.7.1.jar

创建一个jsp
apache-tomcat-7.0.70-client1\webapps\castest\index.jsp

配置D:\app\apache-tomcat-7.0.70-client1客户端1:

修改tomcat的启动端口:
编辑D:\app\apache-tomcat-7.0.70-client1\conf\server.xml文件,找到如下2处内容:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改为:
<Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改为:
<Connector port="8021" protocol="AJP/1.3" redirectPort="8443" />

<Server port="8005" shutdown="SHUTDOWN">
修改为:
<Server port="8006" shutdown="SHUTDOWN">

启动这个tomcat,即运行D:\app\apache-tomcat-7.0.70-client1\bin\startup.bat。

浏览器输入 http://client1.flyer.com:8088/castest/  显示到刚编辑的jsp标识配置正常。

编辑D:\app\apache-tomcat-7.0.70-client1\webapps\castest\WEB-INF\web.xml,在最下面加入如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

<description>Servlet and JSP Examples.</description>
    <display-name>Servlet and JSP Examples</display-name>

<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!-- 该过滤器负责用户的认证工作,必须启用它 -->
    <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>https://server.flyer.com:8443/cas/login</param-value>
        </init-param>
        <init-param>
        <!--这里的客户端server是服务端的IP-->
            <param-name>serverName</param-name>
            <param-value>http://client1.flyer.com:8088</param-value>
        </init-param>
    </filter>
    <filter-mapping> 
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!--
        2.ValidationFilter
        该过滤器负责对请求参数Ticket进行验证(ticket参数是负责子系统与CAS进行验证交互的凭证)
        casServerUrlPrefix:CAS服务访问地址
        serverName:当前应用所在的主机名
    -->
    <filter> 
        <filter-name>CAS Validation Filter</filter-name>
        <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://server.flyer.com:8443/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://client1.flyer.com:8088</param-value>
        </init-param>
    </filter>
    <filter-mapping> 
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!--
        3.HttpServletRequestWrapperFilter
        这个是HttpServletRequest的包裹类,让他支持getUserPrincipal,getRemoteUser方法来取得用户信息
    -->
    <filter> 
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>
    <filter-mapping> 
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!--
        4.AssertionThreadLocalFilter
        这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息
        Assertion assertion = AssertionHolder.getAssertion();
    -->
    <filter> 
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping> 
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

配置完成后,启动CAS服务端tomcat,再启动该客户端1的tomcat,在浏览器访问:
http://client1.flyer.com:8088/castest
看看是否跳转到了CAS认证界面,回车之后

认证观察会发现浏览器的地址栏中(我用的是火狐浏览器),URL信息是这样的:

https://server.flyer.com:8443/cas/login?service=http%3A%2F%2Fclient1.flyer.com%3A8088%2Fcastest%2F

由于你没有登录CAS认证系统,CAS认证系统拦截到你访问的客户端应用,首先进入到认证系统登录界面,同时URL后面加上你想访问的地址信息,当你登录成功后,CAS服务会转向到你刚刚访问的地址,也就是:

http://client1.flyer.com:8088/castest/

6、配置第二台tomcat,参见上步的server.xml修改
修改编辑D:\app\apache-tomcat-7.0.70-client2\webapps\castest\WEB-INF\web.xml文件,加入的内容就是上面在第一个客户端的web.xml内容一致:

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

<description>Servlet and JSP Examples.</description>
    <display-name>Servlet and JSP Examples</display-name>

<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!-- 该过滤器负责用户的认证工作,必须启用它 -->
    <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>https://server.flyer.com:8443/cas/login</param-value>
        </init-param>
        <init-param>
        <!--这里的客户端server是服务端的IP-->
            <param-name>serverName</param-name>
            <param-value>http://client2.flyer.com:8088</param-value>
        </init-param>
    </filter>
    <filter-mapping> 
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!--
        2.ValidationFilter
        该过滤器负责对请求参数Ticket进行验证(ticket参数是负责子系统与CAS进行验证交互的凭证)
        casServerUrlPrefix:CAS服务访问地址
        serverName:当前应用所在的主机名
    -->
    <filter> 
        <filter-name>CAS Validation Filter</filter-name>
        <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://server.flyer.com:8443/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://client2.flyer.com:8088</param-value>
        </init-param>
    </filter>
    <filter-mapping> 
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!--
        3.HttpServletRequestWrapperFilter
        这个是HttpServletRequest的包裹类,让他支持getUserPrincipal,getRemoteUser方法来取得用户信息
    -->
    <filter> 
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>
    <filter-mapping> 
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<!--
        4.AssertionThreadLocalFilter
        这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息
        Assertion assertion = AssertionHolder.getAssertion();
    -->
    <filter> 
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping> 
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

<welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

至此,2个客户端也已经配置完毕,启动配置好的三个tomcat分别为:CAS服务端tomcat、2个客户端tomcat

下面截图,根据上面所示进行测试,看看是否与上面说的流程一致:
首先,打开火狐浏览器,地址栏输入:

http://client2.flyer.com:8089/castest2

转载于:https://my.oschina.net/yxzterry/blog/746189

SSO之CAS单点登录详细搭建相关推荐

  1. CAS单点登录详细流程

    一.CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS ...

  2. CAS单点登录原理简单介绍

    1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...

  3. CAS单点登录(五)——Service配置及管理

    在上一节我们讲述了CAS中关于自定义认证登录策略,对CAS中关于自定义登录配置的方案,校验策略有了一定的了解,如果忘记了可以去复习一下------CAS单点登录(四)--自定义认证登录策略.这节本来该 ...

  4. CAS 单点登录使用详解

    ============================================================================== 开发环境 :MyEclipse6.5+to ...

  5. cas单点登录学习笔记 .

    CAS 单点登录使用详解 ============================================================================== 开发环境 :My ...

  6. 爆破专栏丨Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  7. java培训爆破专栏之Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  8. web工程中集成cas单点登录

    背景 cas的服务端已经搭建成功,现在需要在web项目中集成cas client.我们项目使用spring 1.在pom中配置 <!--cas单点登录 --><dependency& ...

  9. CAS 单点登录/登出 系统

    前言: 在我们的实际开发中,更多的是采用分布式系统.那么问题来了,对于分布式系统的登录问题,我们如何解决呢? 如果说我们在每一个系统中都要进行一次登录,那么用户体验度也就差的没法用了.以京东商城为例, ...

最新文章

  1. 存储过程-数据位置调换demo
  2. [BZOJ4448][SCOI2015]情报传递[dfs序+树状数组]
  3. linu下未编译的mysql安装包
  4. 路径中 “./“、“../“、“/“ 代表的意思
  5. jQuery 输入框 在光标位置插入内容, 并选中
  6. 网络html代码是什么问题,html代码问题
  7. python坦克大战_Life is short,you need Python——Python实现坦克大战(一)
  8. html有3d效果的网页,HTML5如何在网页中实现3D效果?
  9. 20145106java实验四
  10. Hadoop MapReduce InputFormat基础
  11. 基于jquery的插件turn.js学习笔记
  12. Scientific Linux 6.4安装详程
  13. js Maximum call stack size exceeded
  14. maven 从入门到实战
  15. 算法题04:分治法:求第K小元素(线性时间选择算法)
  16. CreateThread()和_beginthread()有什么不同?
  17. Linux 内核 颜色,Linux操作系统内核版的表示方法是( )
  18. java类加载器不同导致SPI 报错 not a subtype
  19. 关于离开,请诸位保重自己
  20. flutter_engine 交叉编译【自定义编译器(最新)】

热门文章

  1. boost::convert模块实现lexical_cast的测试程序
  2. ITK:在不复制内存的情况下为每个像素添加常量
  3. ITK:图像区域相交
  4. OpenCV cv :: UMat与DirectX11曲面的互操作性的实例(附完整代码)
  5. C++ edit distances最小编辑距离(附完整源码)
  6. C语言存储类、作用域、声明周期、链接属性
  7. C语言指针与强制类型转换
  8. java recv failed,jmeter压测报错Unrecognized Windows Sockets error: 0: recv failed
  9. mysql show timestamp_mysql中 datatime与timestamp的区别说明
  10. 「Self-driving: Perception」多传感器融合之Camera、Lidar 雷达融合