精华内容
下载资源
问答
  • 除此之外我的还有一个问题就是我的image.properties文件中语句中是不能加引号的,难受@_@ image.localDir=“c:/images” image.httpUrl=“http://image.jt.com” 原因是windows下的文件名格式和java的格式不正确...

    今天遇到
    @java.io.IOException: java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\tomcat.3424444179474822115.80\work\Tomcat\localhost\ROOT"c:\images"\2019\12\05\7252660b-df45-40b9-bfbc-2c7789baae26.jpg (文件名、目录名或卷标语法不正确。)

    除此之外我的还有一个问题就是我的image.properties文件中语句中是不能加引号的,难受@_@
    image.localDir=“c:/images”
    image.httpUrl=“http://image.jt.com”

    原因是windows下的文件名格式和java的格式不正确,
    例如:
    在Windows下的路径为: C:\images\abc.jpg
    而java可以读取的格式为: C:/images/abc.jpg

    所以需要先将Windows中的文件路径转换为java中可识别的路径.作如下处理:

    String str="D:\\tfs\\235396.jpg";
    String location=str.replace("\\\\", "/");
    String[] strings=storageClient.upload_file(location, "jpg", null);
    

    Windows 中文件夹命名规则是:
    ① 文件名或文件夹名可以由1~256个西文字符或128个汉字(包括空格)组成,不能多于256个字符。
    ② 文件名可以有扩展名,也可以没有。有些情况下系统会为文件自动添加扩展名。一般情况下,文件名与扩展名中间用符号“.”分隔。
    ③ 文件名和文件夹名可以由字母、数字、汉字或~、!、@、#、$、%、^、&、( )、_、-、{}、’等组合而成。
    ④ 可以有空格,可以有多于一个的圆点。
    ⑤ 文件名或文件夹名中不能出现以下字符:\、/、:、*、?、"、<、>、| 。
    ⑥ 不区分英文字母大小写。

    原文链接:https://blog.csdn.net/fengkungui/article/details/67637437

    展开全文
  • HTTP网页URL链接的语法格式最详细的分析与介绍

    万次阅读 多人点赞 2018-09-27 16:00:30
    锚部分也不是一个URL必须的部分,其右面的字符就是该位置的标识符(一般情况下,锚链接会用到) 例子:下面的URL中,代表网页si.html的print位置,浏览器读取这个URL后,会自动将print位置滚动至可视区域,需要用户...

    HTTP简介

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

    HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

    HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

     

    主要特点

    1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
    5、支持B/S及C/S模式。

    HTTP之URL

    HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

    URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:

    http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

    从上面的URL可以看出,一个完整的URL包括以下几部分:

    https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=2881901409,2722577397&fm=173&s=8821CF109CE8440114F181DE0300D0B1&w=640&h=200&img.JPG
    1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

    例子:file 资源是本地计算机上的文件。格式file:///,注意后边应是三个斜杠。

    ftp 通过 FTP访问资源。格式 FTP://

    gopher 通过 Gopher 协议访问该资源。

    http 通过 HTTP 访问该资源。 格式 HTTP://

    https 通过安全的 HTTPS 访问该资源。 格式 HTTPS://

    mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto:

    MMS 通过 支持MMS(流媒体)协议的播放该资源。(代表软件:Windows Media Player)格式 MMS://

    ed2k 通过 支持ed2k(专用下载链接)协议的P2P软件访问该资源。(代表软件:电驴) 格式 ed2k://

    Flashget 通过 支持Flashget:(专用下载链接)协议的P2P软件访问该资源。(代表软件:快车) 格式 Flashget://

    thunder 通过 支持thunder(专用下载链接)协议的P2P软件访问该资源。(代表软件:迅雷) 格式 thunder://

    news 通过 NNTP 访问该资源。

    2.域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用,有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)

    2.1用户名和密码:很多服务器都要求输入用户名和密码才会允许用户访问数据,如FTP服务器。

    例子:ftp://joe:joepasswd@ftp.prep.edu/pub/name

    joe是用户名、joepasswd是密码

    3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

    例子:很多HTTP的默认端口号是80。比如,130.32.12.34:800,这里的IP地址是主机名,端口是800

    4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。

    例子:本例中的虚拟目录是“/news/”

    5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。

    例子:本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名index.htm

    6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分,其右面的字符就是该位置的标识符(一般情况下,锚链接会用到)

    例子:下面的URL中,代表网页si.html的print位置,浏览器读取这个URL后,会自动将print位置滚动至可视区域,不需要用户自己翻到该位置

    http://www.cheng.cn/si.html#print

    7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

    例子:很多资源,比如数据库服务、搜索引擎,都可以通过提问题或进行查询来缩小请求资源的范围。或者为了向应用程序提供它们所需要的输入参数,以便正确地与服务器进行交互。

    http://www.cheng.cn/si.html?name=csh&age=24

    查询组件有两个名/值对:name=csh和age=24

    URI和URL的区别

    URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。

    Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
    URI一般由三部组成:
    ①访问资源的命名机制
    ②存放资源的主机名
    ③资源自身的名称,由路径表示,着重强调于资源。

    URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

    URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
    采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
    ①协议(或称为服务方式)
    ②存有该资源的主机IP地址(有时也包括端口号)
    ③主机资源的具体地址。如目录和文件名等

    URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com

    https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=485324680,1052470267&fm=173&s=8ED4C51271ABC4EE16ECB4DA020080B1&w=640&h=604&img.JPEG

    URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。

    在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
    在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。
    相反的是,URL类可以打开一个到达资源的流。

    HTTP之请求消息Request

    客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

    请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

    https://upload-images.jianshu.io/upload_images/2964446-fdfb1a8fce8de946.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

    Http请求消息结构.png

    • 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。

    Get请求例子,使用Charles抓取的request:

    GET /562f25980001b1b106000338.jpg HTTP/1.1

    Host    img.mukewang.com

    User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36

    Accept    image/webp,image/*,*/*;q=0.8

    Referer    http://www.imooc.com/

    Accept-Encoding    gzip, deflate, sdch

    Accept-Language    zh-CN,zh;q=0.8

    第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.

    GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

    第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

    从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

    第三部分:空行,请求头部后面的空行是必须的

    即使第四部分的请求数据为空,也必须有空行。

    第四部分:请求数据也叫主体,可以添加任意的其他数据。

    这个例子的请求数据为空。

    POST请求例子,使用Charles抓取的request:

    POST / HTTP1.1

    Host:www.wrox.com

    User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)

    Content-Type:application/x-www-form-urlencoded

    Content-Length:40

    Connection: Keep-Alive

     

    name=Professional%20Ajax&publisher=Wiley

    第一部分:请求行,第一行明了是post请求,以及http1.1版本。
    第二部分:请求头部,第二行至第六行。
    第三部分:空行,第七行的空行。
    第四部分:请求数据,第八行。

    HTTP之响应消息Response

    一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

    HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

    https://upload-images.jianshu.io/upload_images/2964446-1c4cab46f270d8ee.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

    http响应消息格式.jpg

    例子

    HTTP/1.1 200 OK

    Date: Fri, 22 May 2009 06:07:21 GMT

    Content-Type: text/html; charset=UTF-8

     

    <html>

          <head></head>

          <body>

                <!--body goes here-->

          </body>

    </html>

    第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

    第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

    第二部分:消息报头,用来说明客户端要使用的一些附加信息

    第二行和第三行为消息报头,
    Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

    第三部分:空行,消息报头后面的空行是必须的

    第四部分:响应正文,服务器返回给客户端的文本信息。

    空行后面的html部分为响应正文。

    HTTP之状态码

    状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

    1xx:指示信息--表示请求已接收,继续处理

    2xx:成功--表示请求已被成功接收、理解、接受

    3xx:重定向--要完成请求必须进行更进一步的操作

    4xx:客户端错误--请求有语法错误或请求无法实现

    5xx:服务器端错误--服务器未能实现合法的请求

    常见状态码:

    200 OK                        //客户端请求成功

    400 Bad Request               //客户端请求有语法错误,不能被服务器所理解

    401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

    403 Forbidden                 //服务器收到请求,但是拒绝提供服务

    404 Not Found                 //请求资源不存在,eg:输入了错误的URL

    500 Internal Server Error     //服务器发生不可预期的错误

    503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    更多状态码http://www.runoob.com/http/http-status-codes.html

    HTTP请求方法

    根据HTTP标准,HTTP请求可以使用多种请求方法。
    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

    GET     请求指定的页面信息,并返回实体主体。

    HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

    POST     向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

    PUT     从客户端向服务器传送的数据取代指定的文档的内容。

    DELETE      请求服务器删除指定的页面。

    CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

    OPTIONS     允许客户端查看服务器的性能。

    TRACE     回显服务器收到的请求,主要用于测试或诊断。

    HTTP工作原理

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

    以下是 HTTP 请求/响应的步骤:

    1、客户端连接到Web服务器

    一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn

    2、发送HTTP请求

    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

    3、服务器接受请求并返回HTTP响应

    Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

    4、释放连接TCP连接

    若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

    5、客户端浏览器解析HTML内容

    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

    例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

    1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

    2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

    3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

    4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

    5、释放 TCP连接;

    6、浏览器将该 html 文本并显示内容;   

    GET和POST请求的区别

    GET请求

    GET /books/?sex=man&name=Professional HTTP/1.1

    Host: www.wrox.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Connection: Keep-Alive

    注意最后一行是空行

    POST请求

    POST / HTTP/1.1

    Host: www.wrox.com

    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

    Gecko/20050225 Firefox/1.0.1

    Content-Type: application/x-www-form-urlencoded

    Content-Length: 40

    Connection: Keep-Alive

     

    name=Professional%20Ajax&publisher=Wiley

    1、GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

    POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据

    因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

    2、传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

    而在实际开发中存在的限制主要有:

    GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。

    因此对于GET提交时,传输数据就会受到URL长度的 限制。

    POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

    3、安全性

    POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击

    4、Http get,post,soap协议都是在http上运行的

    (1)get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的
    查询字符串的长度受到web浏览器和web服务器的限制(如IE最多支持2048个字符),不适合传输大型数据集同时,它很不安全

    (2)post:请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form- urlencoded。post设计用来支持web窗体上的用户字段,其参数也是作为key/value对传输。
    但是:它不支持复杂数据类型,因为post没有定义传输数据结构的语义和规则。

    (3)soap:是http post的一个专用版本,遵循一种特殊的xml消息格式
    Content-type设置为: text/xml 任何数据都可以xml化。

    Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

    我们看看GET和POST的区别

      1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
      2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
      3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
      4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

     

     

    展开全文
  • 实际上,apache的url重写功能也可以直接在httpd.conf文件进行设置,这里就具体讲了,网上相关的教程也很多。 Apache的RewriteRule规则详细介绍: R [=code](force redirect) 强制外部重定向 (rkyW z ...
    介绍和配置:


    以数据库后台驱动的动态内容的网站,经常会遇到这些的问题:
    • 当在浏览器的地址栏输入一个无效的参数时,会出现数据库的错误提示,这是一个安全的隐患
    • 搜索引擎无法收录你的所有网页
    • 网页的链接地址是一系列的参数,对浏览用户和搜索引擎都不易理解


    这些问题都可以通过Apache服务器的一个基本的模块mod_rewrite来解决,默认的安装的Apache就会装有这个模块。要启用这个模块,打开 httpd.conf文件,察看下面的两行是否被屏蔽,第一行是载入mod_rewrite模块,第二行是启用这个模块。

    LoadModule rewrite_module modules/mod_rewrite.so
    AddModule mod_rewrite.c

    mod_rewrite这个模块是如何工作的呢?

    mod_rewrite截获符合特定条件的URL,并按照设定的规则将它们改写成需要的URL。

    比如,可以将 http://www.mysite.com/product.php?pid=123312 这样的URL改写成
    http://www.mysite.com/product-123312.html 这样的静态URL,或者是更具体的 http://www.mysite.com/product/thinkpad-t42.html

    重写的规则

    重写的规则的表达式:

    RewriteRule 模式 替换 [选项]

    RewriteRule 是一个简单的命令告诉mod_rewrite这个模块如何去重写,关键的地方在于可以在模式和替换中使用正则表达式来匹配相应的字符,正则表达式的广泛的灵活性能将动态的URL转换成各式各样的符合要求的静态URL。看看这个重写规则:

    RewriteRule /products/([0-9]+)
    /fancy/products.php?id=$1

    当你在浏览器地址栏输入 http://www.mysite.com/product/123 时,这个地址被重写为 http://www.mysite.com/fancy/product.php?id=123

    这样,访问者就无法知道你的程序真正放在那个目录,程序的真正名字是什么,这也提高了网站的安全系数;这样的URL也去掉了?=这些字符,易于搜索引擎的机器人爬行你的网站。

    通过正则表达式,可以写出更复杂的重写规则:

    RewriteRule ^/products$ /content.php
    RewriteRule ^/products/([0-9]+)$ /content.php?id=$1
    RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$)

    重写规则的选项有

    • ‘forbidden’ 或 ‘f’ - 403 禁止
    • ‘gone’ 或 ‘g’ - 410 gone
    • ‘nocase’ 或 ‘NC’ - 大小写敏感
    • ‘next’/N’ - 回到第一条规则
    • ’skip=N’ 或 ‘S=N’ - 跳过下面的N条规则

    流程控制

    mod_rewrite是按照从上到下的顺序执行重写的规则,如果URL匹配了第一条规则,则按照第一条规则进行重写,如果不匹配,就执行第二条规则,直到最后。通过流程控制,可以定义在不同情况下采用不同的重写规则。格式是:

    RewriteCond 测试条件 Condition

    这些测试条件有:

    • HTTP变量: HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT
    • 连结和请求的变量: REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE
    • 服务器内部变量: DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE
    • 系统变量: TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME
    • mod_rewrite特殊值: API_VERSION, THE_REQUEST, REQUEST_URI,

    例如,利用mod_rewrite可以禁止从其他的网站链接到你的图片:

    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://localhost/.*$ [OR,NC]
    RewriteCond %{HTTP_REFERER} !^http://mysite.com/.*$ [OR,NC]
    RewriteCond %{HTTP_REFERER} !^http://www.mysite.com/.*$ [OR,NC]
    RewriteRule .*/.(gif|GIF|jpg|JPG)$ http://mysite/images/bad.gif [L,R]






    配置apache mod_rewrite最简单的方法


    在网上找了很多篇关于配置apache mod_rewrite的文章,发觉这篇最有用,大家需要的可参考一下。

    1,通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设置。
    如果没有开启“mod_rewrite”,则打开目录 您的apache安装目录“/apache/conf/” 下的 httpd.conf 文件,通过Ctrl+F查找到“LoadModule rewrite_module”,将前面的”#”号删除即可。如果没有查找到,则到“LoadModule” 区域,在最后一行加入“LoadModule rewrite_module modules/mod_rewrite.so”(必选独占一行),然后重启apache服务器即可。

    2, 让apache服务器支持”.htaccess”
    如何让自己的本地APACHE服务器支持”.htaccess”呢?其实只要简单修改一下apache的httpd.conf设置就可以让APACHE支 持.htaccess了。打开httpd.conf文件(在那里? APACHE目录的CONF目录里面),用文本编辑器打开后,查找
    <Directory />
    Options FollowSymLinks
    AllowOverride None
    </Directory>
    改为
    <Directory />
    Options FollowSymLinks
    AllowOverride All
    </Directory>
    就可以了

    3,建立 “.htaccess” 文件
    如果是在windows平台下,刚开始还真不知道怎么建立”.htaccess”文件,因为这个文件实际上没有文件名,仅仅只有扩展名,通过普通方式是无法建立这个文件的,别着急,马上告诉你三种方法:
    三种方法都是先建立一个htaccess.txt的文本文件(当然,这个文本文件的名字你可以随便取),然后有三种方式给这个文件重命名:(1)用记事本 打开,点击文件–另存为,在文件名窗口输入”.htaccess”,注意是整个绿色部分,也就是包含英文引号,然后点击保存就行了。(2)进入cmd命令 窗口,通过cd切换当刚建立htaccess.txt文件的文件夹,然后输入命令:rename htaccess.txt .htaccess ,然后点击键盘Enter键即可。(3)通过ftp连接htaccess.txt所在文件夹,通过ftp软件重命名。
    那么我们须要建立几个“.htaccess” 文件,里面又输入什么内容呢?基本的原则是这样,根目录必须有一个,用于重定向(URl重写)所有的请求都会转到到index.php(交给前端控制 器);”./application”文件夹下须要一个,用于拒绝所有针对该文件夹内容的直接访问(比如 http://localhost/application/models/User.php),这样做是因为所有访问请求必选通过前端控制器来分配访 问,其次为了安全;“./library”文件夹下的“.htaccess”同前;”./public”文件夹下必选建一个,因为这个文件夹的文件全部是 供前端直接访问的,因此须要撤销URl重写。以下是4个“./htaccess”文件的内容:
    ./.htaccess
    RewriteEngine on
    RewriteRule !/.(js|ico|gif|jpg|png|css)$ index.php
    ./application/.htaccess
    deny from all
    ./library/.htaccess
    deny from all
    ./public
    RewriteEngine off
    实际上,apache的url重写功能也可以直接在httpd.conf文件中进行设置,这里就不具体讲了,网上相关的教程也很多。







    Apache的RewriteRule规则详细介绍:


    R[=code](force redirect) 强制外部重定向 (rkyW z
    强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。 gN24M 3{C
    F(force URL to be forbidden)禁用URL,返回403HTTP状态码。 m> 4ahue$
    G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。 Np'2 }6P
    P(force proxy) 强制使用代理转发。 ) Ps b>'X
    L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。 ua 5 O Gx
    N(next round) 重新从第一条规则开始运行重写过程。 S,<EEt XQ
    C(chained with next rule) 与下一条规则关联 @+ 9 < O0
    如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。 Zs}5Smjl;%
    T=MIME-type(force MIME type) 强制MIME类型 ~=KJ zOS,S
    NS (used only if no internal sub-request) 只用于不是内部子请求 /[6j)HIS
    NC(no case) 不区分大小写 ^2$ l J
    QSA(query string append) 追加请求字符串 zH>hx5,k'X
    NE(no URI escaping of output) 不在输出转义特殊字符 /~ B D m
    例如:RewriteRule /foo/(.*) /bar?arg=P1/%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed +3a?` Z
    PT(pass through to next handler) 传递给下一个处理 %0 #XPc("
    例如: :5/Uh/ sX
    RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理 x A u/
    Alias /def /ghi XyM G.r-,
    S=num(skip next rule(s)) 跳过num条规则 A~Xq,BxCV
    E=VAR:VAL(set environment variable) 设置环境变量

    rewrite时服务器变量: `: O/dN>ON
    HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT },5'z {3E
    connection & request: REMOTE_ADDR, QUERY_STRING PY3 ps2^K.
    server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL r}u %#G+K,
    system stuff: TIME_YEAR, TIME_MON, TIME_DAY

    Rewrite规则表达式的说明: #Fu>|2 F|
    . 匹配任何单字符 wFlv i =n/
    [chars] 匹配字符串:chars [o c~iDx%W
    [^chars] 不匹配字符串:chars Lc<eRVNd,
    text1|text2 可选择的字符串:text1或text2 { OT:3SS7
    ? 匹配0到1个字符 A%Z)w z{
    * 匹配0到多个字符 v4 *rPG v
    + 匹配1到多个字符 " o c $
    ^ 字符串开始标志 SKXBrD=-
    $ 字符串结束标志 &LQ%
    /n 转义符标志

    反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9) =_=*O EgO]
    反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)

    RewriteCond标志符 @J v# f r
    'nocase|NC'(no case)忽略大小 ZCi Y,;c
    'ornext|OR' (or next condition)逻辑或,可以同时匹配多个RewriteCond条件

    RewriteRule适用的标志符 hLuJ WjCV
    'redirect|R [=code]' (force redirect)强迫重写为基于http开头的外部转向(注意URL的变化) 如:[R=301,L] uC[d%v`
    'forbidden|F' (force URL to be forbidden)重写为禁止访问 2F T-}w 0;
    'proxy|P' (force proxy)重写为通过代理访问的http路径 F(0Z ] # +
    'last|L' (last rule)最后的重写规则标志,如果匹配,不再执行以后的规则 ?%;B`2 nDR
    'next|N' (next round)循环同一个规则,直到不能满足匹配 ,4yG(O $ )
    'chain|C' (chained with next rule)如果匹配该规则,则继续下面的有Chain标志的规则。 p_gA/ . v=
    'type|T=MIME-type' (force MIME type)指定MIME类型 1^tSn #j
    'nosubreq|NS' (used only if no internal sub-request)如果是内部子请求则跳过 LhZZ c`|7t
    'nocase|NC' (no case)忽略大小 b.@ H1 L
    'qsappend|QSA' (query string append)附加查询字符串 *b: u * `@
    'noescape|NE' (no URI escaping of output)禁止URL中的字符自动转义成%[0-9]+的形式。 ~ t"n%SgY
    'passthrough|PT' (pass through to next handler)将重写结果运用于mod_alias IL2 e6 b
    'skip|S=num' (skip next rule(s))跳过下面几个规则 loR,X W7 z
    'env|E=VAR:VAL' (set environment variable)添加环境变量

    实际操作

    例子: "IOC[ #&G
    RewriteEngine on !?S5IG LOj
    RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR] _R N/7/
    RewriteCond %{HTTP_USER_AGENT} ^Opera [NC] !&' # a
    RewriteRule ^.* - [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

    例子: *U( 1iv0 n
    RewriteEngine On QWU5-p9e 8
    RewriteBase /test Q3 K ;kS
    RewriteCond %{REQUEST_FILENAME}.php -f rU/-Wq` B
    RewriteRule ([^/]+)$ /test/$1.php ?7r mw y/
    #for example: /test/admin => /test/admin.php I v 80,hW
    RewriteRule ([^/]+)/.html$ /test/$1.php [L] aufcd57
    #for example: /test/admin.html => /test/admin.php

    限制目录只能显示图片 yKX: Z4I/
    < IfModule mod_rewrite.c> + #i ,87
    RewriteEngine on L @ ^ !(
    RewriteCond %{REQUEST_FILENAME} !^.*/.(gif|jpg|jpeg|png|swf)$ mtHi9).,y|
    RewriteRule .*$ - [F,L] [ 3bwbfHhi
    < /IfModule>






    Apache模块 mod_rewrite 全面中文解释文档:http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_rewrite.html





     
    展开全文
  • 灵云语法识别

    千次阅读 2016-08-16 13:23:54
    源码GitHub在线语法识别SDK下载灵云SDK下载SDK集成下载SDK以后,将jar和so导入工程权限 <uses-per

    源码

    GitHub

    在线语法识别

    SDK下载

    灵云SDK下载

    SDK集成

    下载SDK以后,将jar和so导入工程

    权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    封装

    灵云配置类

    package kong.qingwei.kqwhcidemo;
    
    /**
     * Created by kqw on 2016/8/12.
     * 灵云配置信息
     */
    public final class ConfigUtil {
    
        /**
         * 灵云APP_KEY
         */
        public static final String APP_KEY = "3d5d5466";
    
        /**
         * 开发者密钥
         */
        public static final String DEVELOPER_KEY = "eca643ff7b3c758745d7cf516e808d34";
    
        /**
         * 灵云云服务的接口地址
         */
        public static final String CLOUD_URL = "test.api.hcicloud.com:8888";
    
        /**
         * 需要运行的灵云能力
         */
        // 离线语音合成
        public static final String CAP_KEY_TTS_LOCAL = "tts.local.synth";
        // 云端语音合成
        public static final String CAP_KEY_TTS_CLOUD = "tts.cloud.wangjing";
    
        // 云端语义识别
        public static final String CAP_KEY_NUL_CLOUD = "nlu.cloud";
    
        // 云端自由说
        public static final String CAP_KEY_ASR_CLOUD_FREETALK = "asr.cloud.freetalk";
        // 离线自由说
        public static final String CAP_KEY_ASR_LOCAL_FREETALK = "asr.local.freetalk";
        // 云端语音识别+语义
        public static final String CAP_KEY_ASR_CLOUD_DIALOG = "asr.cloud.dialog";
        // 离线命令词
        public static final String CAP_KEY_ASR_LOCAL_GRAMMAR = "asr.local.grammar.v4";
        // 在线命令词
        public static final String CAP_KEY_ASR_CLOUD_GRAMMAR = "asr.cloud.grammar";
    }

    初始化灵云语音能力的工具类

    package kong.qingwei.kqwhcidemo;
    
    import android.app.Activity;
    import android.os.Environment;
    import android.util.Log;
    import android.widget.Toast;
    
    import com.sinovoice.hcicloudsdk.api.HciCloudSys;
    import com.sinovoice.hcicloudsdk.common.AuthExpireTime;
    import com.sinovoice.hcicloudsdk.common.HciErrorCode;
    import com.sinovoice.hcicloudsdk.common.InitParam;
    
    import java.io.File;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    /**
     * Created by kqw on 2016/8/12.
     * 初始化灵云语音
     */
    public class HciUtil {
    
        private static final String TAG = "HciUtil";
        private Activity mActivity;
        private final String mConfigStr;
    
        public HciUtil(Activity activity) {
            mActivity = activity;
    
            // 加载信息,返回InitParam, 获得配置参数的字符串
            InitParam initParam = getInitParam();
            mConfigStr = initParam.getStringConfig();
        }
    
        public boolean initHci() {
            // 初始化
            int errCode = HciCloudSys.hciInit(mConfigStr, mActivity);
            if (errCode != HciErrorCode.HCI_ERR_NONE && errCode != HciErrorCode.HCI_ERR_SYS_ALREADY_INIT) {
                Toast.makeText(mActivity, "hciInit error: " + HciCloudSys.hciGetErrorInfo(errCode), Toast.LENGTH_SHORT).show();
                return false;
            }
    
            // 获取授权/更新授权文件 :
            errCode = checkAuthAndUpdateAuth();
            if (errCode != HciErrorCode.HCI_ERR_NONE) {
                // 由于系统已经初始化成功,在结束前需要调用方法hciRelease()进行系统的反初始化
                Toast.makeText(mActivity, "CheckAuthAndUpdateAuth error: " + HciCloudSys.hciGetErrorInfo(errCode), Toast.LENGTH_SHORT).show();
                HciCloudSys.hciRelease();
                return false;
            }
            return true;
        }
    
        /**
         * 释放
         */
        public void hciRelease(){
            HciCloudSys.hciRelease();
        }
    
        /**
         * 加载初始化信息
         *
         * @return 系统初始化参数
         */
        private InitParam getInitParam() {
            String authDirPath = mActivity.getFilesDir().getAbsolutePath();
            // 前置条件:无
            InitParam initparam = new InitParam();
            // 授权文件所在路径,此项必填
            initparam.addParam(InitParam.AuthParam.PARAM_KEY_AUTH_PATH, authDirPath);
            // 是否自动访问云授权,详见 获取授权/更新授权文件处注释
            initparam.addParam(InitParam.AuthParam.PARAM_KEY_AUTO_CLOUD_AUTH, "no");
            // 灵云云服务的接口地址,此项必填
            initparam.addParam(InitParam.AuthParam.PARAM_KEY_CLOUD_URL, ConfigUtil.CLOUD_URL);
            // 开发者Key,此项必填,由捷通华声提供
            initparam.addParam(InitParam.AuthParam.PARAM_KEY_DEVELOPER_KEY, ConfigUtil.DEVELOPER_KEY);
            // 应用Key,此项必填,由捷通华声提供
            initparam.addParam(InitParam.AuthParam.PARAM_KEY_APP_KEY, ConfigUtil.APP_KEY);
            // 配置日志参数
            String sdcardState = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(sdcardState)) {
                String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
                String packageName = mActivity.getPackageName();
                String logPath = sdPath + File.separator + "sinovoice" + File.separator + packageName + File.separator + "log" + File.separator;
                // 日志文件地址
                File fileDir = new File(logPath);
                if (!fileDir.exists()) {
                    fileDir.mkdirs();
                }
                // 日志的路径,可选,如果不传或者为空则不生成日志
                initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_PATH, logPath);
                // 日志数目,默认保留多少个日志文件,超过则覆盖最旧的日志
                initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_COUNT, "5");
                // 日志大小,默认一个日志文件写多大,单位为K
                initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_SIZE, "1024");
                // 日志等级,0=无,1=错误,2=警告,3=信息,4=细节,5=调试,SDK将输出小于等于logLevel的日志信息
                initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_LEVEL, "5");
            }
            return initparam;
        }
    
        /**
         * 获取授权
         *
         * @return 授权结果
         */
        private int checkAuthAndUpdateAuth() {
            // 获取系统授权到期时间
            int initResult;
            AuthExpireTime objExpireTime = new AuthExpireTime();
            initResult = HciCloudSys.hciGetAuthExpireTime(objExpireTime);
            if (initResult == HciErrorCode.HCI_ERR_NONE) {
                // 显示授权日期,如用户不需要关注该值,此处代码可忽略
                Date date = new Date(objExpireTime.getExpireTime() * 1000);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
                Log.i(TAG, "expire time: " + sdf.format(date));
                if (objExpireTime.getExpireTime() * 1000 > System.currentTimeMillis()) {
                    // 已经成功获取了授权,并且距离授权到期有充足的时间(>7天)
                    Log.i(TAG, "checkAuth success");
                    return initResult;
                }
            }
            // 获取过期时间失败或者已经过期
            initResult = HciCloudSys.hciCheckAuth();
            if (initResult == HciErrorCode.HCI_ERR_NONE) {
                Log.i(TAG, "checkAuth success");
                return initResult;
            } else {
                Log.e(TAG, "checkAuth failed: " + initResult);
                return initResult;
            }
        }
    }

    语法识别的类

    和之前的语音识别一样,只不过配置了语法

    在原来的基础上添加了initGrammar方法

    package kong.qingwei.kqwhcidemo;
    
    import android.app.Activity;
    import android.util.Log;
    
    import com.sinovoice.hcicloudsdk.android.asr.recorder.ASRRecorder;
    import com.sinovoice.hcicloudsdk.common.asr.AsrConfig;
    import com.sinovoice.hcicloudsdk.common.asr.AsrGrammarId;
    import com.sinovoice.hcicloudsdk.common.asr.AsrInitParam;
    import com.sinovoice.hcicloudsdk.common.asr.AsrRecogResult;
    import com.sinovoice.hcicloudsdk.recorder.ASRCommonRecorder;
    import com.sinovoice.hcicloudsdk.recorder.ASRRecorderListener;
    import com.sinovoice.hcicloudsdk.recorder.RecorderEvent;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    
    /**
     * Created by kqw on 2016/8/15.
     * 语音识别类
     */
    public class AsrUtil {
    
        private static final String TAG = "AsrUtil";
        private Activity mActivity;
        private ASRRecorder mAsrRecorder;
        private AsrConfig asrConfig;
        private OnAsrRecogListener mOnAsrRecogListener;
        private String mGrammar = null;
        private String mCapKey = ConfigUtil.CAP_KEY_ASR_CLOUD_GRAMMAR;
    
        public AsrUtil(Activity activity) {
            mActivity = activity;
            initAsr();
            initGrammar(mCapKey);
        }
    
        /**
         * 初始化语音识别
         */
        private void initAsr() {
            Log.i(TAG, "initAsr: ");
            // 初始化录音机
            mAsrRecorder = new ASRRecorder();
    
            // 配置初始化参数
            AsrInitParam asrInitParam = new AsrInitParam();
            String dataPath = mActivity.getFilesDir().getPath().replace("files", "lib");
            asrInitParam.addParam(AsrInitParam.PARAM_KEY_INIT_CAP_KEYS, mCapKey);
            asrInitParam.addParam(AsrInitParam.PARAM_KEY_DATA_PATH, dataPath);
            asrInitParam.addParam(AsrInitParam.PARAM_KEY_FILE_FLAG, AsrInitParam.VALUE_OF_PARAM_FILE_FLAG_ANDROID_SO);
            Log.v(TAG, "init parameters:" + asrInitParam.getStringConfig());
    
            // 设置初始化参数
            mAsrRecorder.init(asrInitParam.getStringConfig(), new ASRResultProcess());
    
            // 配置识别参数
            asrConfig = new AsrConfig();
            // PARAM_KEY_CAP_KEY 设置使用的能力
            asrConfig.addParam(AsrConfig.SessionConfig.PARAM_KEY_CAP_KEY, mCapKey);
            // PARAM_KEY_AUDIO_FORMAT 音频格式根据不同的能力使用不用的音频格式
            asrConfig.addParam(AsrConfig.AudioConfig.PARAM_KEY_AUDIO_FORMAT, AsrConfig.AudioConfig.VALUE_OF_PARAM_AUDIO_FORMAT_PCM_16K16BIT);
            // PARAM_KEY_ENCODE 音频编码压缩格式,使用OPUS可以有效减小数据流量
            asrConfig.addParam(AsrConfig.AudioConfig.PARAM_KEY_ENCODE, AsrConfig.AudioConfig.VALUE_OF_PARAM_ENCODE_SPEEX);
            // 其他配置,此处可以全部选取缺省值
    
            asrConfig.addParam("intention", "weather");
        }
    
        /**
         * 初始化语法
         *
         * @param capKey CapKey
         */
        public void initGrammar(String capKey) {
            // 语法相关的配置,若使用自由说能力可以不必配置该项
            if (capKey.contains("local.grammar")) {
                mGrammar = loadGrammar("stock_10001.gram");
                // 加载本地语法获取语法ID
                AsrGrammarId id = new AsrGrammarId();
                ASRCommonRecorder.loadGrammar("capkey=" + capKey + ",grammarType=jsgf", mGrammar, id);
                Log.d(TAG, "grammarid=" + id);
                // PARAM_KEY_GRAMMAR_TYPE 语法类型,使用自由说能力时,忽略以下此参数
                asrConfig.addParam(AsrConfig.GrammarConfig.PARAM_KEY_GRAMMAR_TYPE, AsrConfig.GrammarConfig.VALUE_OF_PARAM_GRAMMAR_TYPE_ID);
                asrConfig.addParam(AsrConfig.GrammarConfig.PARAM_KEY_GRAMMAR_ID, "" + id.getGrammarId());
            } else if (capKey.contains("cloud.grammar")) {
                mGrammar = loadGrammar("stock_10001.gram");
                // PARAM_KEY_GRAMMAR_TYPE 语法类型,使用自由说能力时,忽略以下此参数
                asrConfig.addParam(AsrConfig.GrammarConfig.PARAM_KEY_GRAMMAR_TYPE, AsrConfig.GrammarConfig.VALUE_OF_PARAM_GRAMMAR_TYPE_JSGF);
            }
        }
    
        /**
         * 开始语音识别
         */
        public void start(OnAsrRecogListener listener) {
            mOnAsrRecogListener = listener;
            if (mAsrRecorder.getRecorderState() == ASRRecorder.RECORDER_STATE_IDLE) {
                asrConfig.addParam(AsrConfig.SessionConfig.PARAM_KEY_REALTIME, "no");
                mAsrRecorder.start(asrConfig.getStringConfig(), mGrammar);
            } else {
                Log.i(TAG, "start: 录音机未处于空闲状态,请稍等");
            }
        }
    
        private class ASRResultProcess implements ASRRecorderListener {
            @Override
            public void onRecorderEventError(RecorderEvent event, int errorCode) {
                Log.i(TAG, "onRecorderEventError: errorCode = " + errorCode);
                if (null != mOnAsrRecogListener) {
                    mOnAsrRecogListener.onError(errorCode);
                }
            }
    
            @Override
            public void onRecorderEventRecogFinsh(RecorderEvent recorderEvent, final AsrRecogResult arg1) {
                if (recorderEvent == RecorderEvent.RECORDER_EVENT_RECOGNIZE_COMPLETE) {
                    Log.i(TAG, "onRecorderEventRecogFinsh: 识别结束");
                }
                if (null != mOnAsrRecogListener) {
                    mActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mOnAsrRecogListener.onAsrRecogResult(arg1);
                        }
                    });
                }
            }
    
            @Override
            public void onRecorderEventStateChange(RecorderEvent recorderEvent) {
                if (recorderEvent == RecorderEvent.RECORDER_EVENT_BEGIN_RECORD) {
                    Log.i(TAG, "onRecorderEventStateChange: 开始录音");
                } else if (recorderEvent == RecorderEvent.RECORDER_EVENT_BEGIN_RECOGNIZE) {
                    Log.i(TAG, "onRecorderEventStateChange: 开始识别");
                } else if (recorderEvent == RecorderEvent.RECORDER_EVENT_NO_VOICE_INPUT) {
                    Log.i(TAG, "onRecorderEventStateChange: 无音频输入");
                } else {
                    Log.i(TAG, "onRecorderEventStateChange: recorderEvent = " + recorderEvent);
                }
            }
    
            @Override
            public void onRecorderRecording(byte[] volumedata, int volume) {
                if (null != mOnAsrRecogListener) {
                    mOnAsrRecogListener.onVolume(volume);
                }
            }
    
            @Override
            public void onRecorderEventRecogProcess(RecorderEvent recorderEvent, AsrRecogResult arg1) {
                if (recorderEvent == RecorderEvent.RECORDER_EVENT_RECOGNIZE_PROCESS) {
                    Log.i(TAG, "onRecorderEventRecogProcess: 识别中间反馈");
                }
                if (arg1 != null) {
                    if (arg1.getRecogItemList().size() > 0) {
                        Log.i(TAG, "onRecorderEventRecogProcess: 识别中间结果结果为:" + arg1.getRecogItemList().get(0).getRecogResult());
                    } else {
                        Log.i(TAG, "onRecorderEventRecogProcess: 未能正确识别,请重新输入");
                    }
                }
            }
        }
    
        /**
         * 读取语法
         *
         * @param fileName 文件名
         * @return 语法
         */
        private String loadGrammar(String fileName) {
            String grammar = "";
            InputStream is = null;
            try {
                is = mActivity.getAssets().open(fileName);
                byte[] data = new byte[is.available()];
                is.read(data);
                grammar = new String(data);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return grammar;
        }
    
        /**
         * 语音识别的回调接口
         */
        public interface OnAsrRecogListener {
            // 识别结果
            void onAsrRecogResult(AsrRecogResult asrRecogResult);
    
            // 识别错误码
            void onError(int errorCode);
    
            // 录音音量
            void onVolume(int volume);
        }
    }

    使用

    使用和语音识别完全一致

    初始化灵云的语音能力和语法识别

    // 灵云语音工具类
    mInitTts = new HciUtil(this);
    // 初始化灵云语音
    boolean isInitHci = mInitTts.initHci();
    if (isInitHci) { // 初始化成功
        ……
        // 语音识别
        mAsrUtil = new AsrUtil(this);
    }

    语法识别

    /**
     * 语音识别(语音转文字)
     *
     * @param view view
     */
    public void asr(View view) {
        mAsrUtil.start(new AsrUtil.OnAsrRecogListener() {
            @Override
            public void onAsrRecogResult(AsrRecogResult asrRecogResult) {
                StringBuilder stringBuffer = new StringBuilder();
                ArrayList<AsrRecogItem> asrRecogItemArrayList = asrRecogResult.getRecogItemList();
                for (AsrRecogItem asrRecogItem : asrRecogItemArrayList) {
                    String result = asrRecogItem.getRecogResult();
                    Log.i(TAG, "onAsrRecogResult: " + result);
                    stringBuffer.append(result).append("\n");
                }
                showDialog("识别结果", stringBuffer.toString());
            }
    
            @Override
            public void onError(int errorCode) {
                Log.i(TAG, "onError: " + errorCode);
            }
    
            @Override
            public void onVolume(int volume) {
                Log.i(TAG, "onVolume: " + volume);
            }
        });
    }

    离线语音识别

    在在线语法识别的基础上,离线的语法识别只需要将CapKey替换,并且添加离线资源即可

    离线资源的下载

    下载完解压离线资源

    下载完解压离线资源

    将里面所有的文件重命名,前面加lib,后面加.so,然后导入工程

    重命名

    修改CapKey为asr.local.grammar.v4

    注意,灵云的离线语音功能第一次使用需要联网激活,激活以后才可以使用离线功能。

    展开全文
  • URL中参数的加号

    千次阅读 2017-01-06 19:19:39
    问题:当URL中参数值有加号时,java后台获取该参数后,加号消失解决方法:在js,拼接URL地址时,用encodeURIComponent对该参数进行编码;后台直接用request.getParameter获取,无需解码!!参考文章: ...
  • github ReadMe语法

    千次阅读 2018-07-13 17:49:40
    GitHub的markdown语法在标准的markdown语法基础上做了扩充,称之为GitHub Flavored Markdown。简称GFM,GFM在GitHub上有广泛应用,除了README文件外,issues和wiki均支持markdown语法。  Author:果冻虾仁 ....
  • Markdown 语法

    千次阅读 2017-07-04 16:22:38
    Markdown 语法以下是 Markdown 的常用语法!在以后的笔记中将持续使用 Markdown 语法进行编译,因此,将此分享给大家。 概述 Markdown 的目标是实现 【易读易写】 Markdown 语法全由一些符号所组成,这些符号经过...
  • Solr查询语法示例

    千次阅读 2017-02-12 10:47:46
    在这个Solr查询语法示例,我们将讨论Solr不同的查询格式。 对于我们的讨论,我们将使用Solr安装附带的一个集合示例( 技术产品 )。 我们将向您展示如何使用Solr公开的基于REST的API,并向您展示如何使用各种...
  • 在 ASP.NET 执行 URL 重写

    千次阅读 2004-10-30 19:24:00
    在 ASP.NET 执行 URL 重写发布日期: 8/23/2004 | 更新日期: 8/23/2004Scott Mitchell4GuysFromRolla.com适用范围:Microsoft® ASP.NET摘要:介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写。URL 重写是截取...
  • Google搜索命令语法

    千次阅读 2011-10-12 16:45:30
    以下是目前所有的Google搜索命令语法,它不同于Google的帮助文档,因为这里介绍了几个Google推荐使用的命令语法。大多数的Google搜索命令语法有它特有的使用格式,希望大家能正确使用。我用不同颜色标注了不同的...
  • markdown基本语法

    千次阅读 2019-05-18 20:44:05
    文章目录markdown基本语法一、标题二、样式文本三、引用文字四、引用代码语法突出显示五、链接六、列表七、表格九、分割线十、MarkDown生成目录索引 markdown基本语法 一、标题 在标题文本前添加一到六个#,#的个数...
  • KML语法规则

    万次阅读 2016-02-24 10:50:34
    一个KML文档应该完全遵循KML格式,文档也和基本的XML语法规则差不多,有以下几点要特别注意的地方. XML标签必须关闭 XML标签是大小写敏感的 对于KML语法,首字母大写的标签是复合标签,否则就是单一标签,在实体和...
  • Markdown语法

    千次阅读 2016-09-29 14:01:39
    Markdown 语法说明 (简体中文版) / (点击查看快速入门) 概述 宗旨 兼容 HTML 特殊字符自动转换 区块元素 段落和换行 标题 区块引用 列表 代码区块 分隔线 区段元素 链接 强调 ...
  • 所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章不足之处也请海涵。在这个喧嚣的时代,很多技术或概念会不断兴起,我希望你能沉下心来去学习,不要...
  • IISURL重写

    千次阅读 2011-01-15 16:53:00
    突然间接到了一个任务,将URL中的一个字段都转成另一个字段,然后再重新发送到Server端,例如将http://***/GEO/***转换成 http://***/ArcGIS/***,然后再转发到Server端,上网查了一下资料,突然发现这里面有很大的...
  • Google Hacking语法 Google hacker (Google黑客)是利用GOOGLE提供的搜索功能查找黑客们想找到的信息.一般是查找网站后台,网管的个人信息,也可以用来查找某人在网络上的活动. Google hacker 一般是做为黑客在入侵时...
  • MXML 语法

    千次阅读 2008-06-23 11:20:00
    MXML 语法MXML 是Adobe Flex™应用一种用于展示用户界面组件的XML 语言。主题 MXML基本语法 设置组件属性MXML 基本语法大多数MXML标签相当于ActionScript 3.0的类或者类属性。Flex解析MXML标签,并将其编译成一个...
  • JSX语法使用详解——终极版

    千次阅读 2018-09-14 17:11:20
    一、基础 1、JSX是什么 JSX是一种像下面这样的...它是一种JavaScript语法扩展,在React可以方便地用来描述UI。 本质上,JSX为我们提供了创建React元素方法(React.createElement(component, props, ...childre...
  • URL Schemes 使用详解
  • MarkDown完整语法

    千次阅读 2017-04-18 10:23:35
    MarkDown完整语法
  • 浏览器输入url后发生了什么

    千次阅读 2017-09-21 10:17:37
    下面是个人学习过程的总结,供个人复习使用,如有理解不正确或不足的地方希望大家指出。 先上一张脑图: 浏览器输入url后发生了什么 我将该过程分为了以下六步: 1. DNS域名解析 在浏览器DNS缓存...
  • URL详解

    万次阅读 多人点赞 2017-04-05 20:07:36
    一:URL举例 就以下面这个URL为例,介绍下普通URL的各部分组成 ...从上面的URL可以看出,一个完整的URL包括以下几部分: 1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。
  • 总结SQLite支持的SQL语法有哪些

    千次阅读 2016-07-22 11:19:54
    1、TOP 这是一个大家经常问到的问题,例如在 SQLSERVER 中可以使用如下语句来取得记录集中的前十条...但是这条SQL语句在SQLite中是无法执行的,应该改为:  SELECT * FROM [index] ORDER BY indexid DESClimit0,10;
  • HTTP中URL和URI的区别

    千次阅读 2015-11-10 10:52:24
    URL 百度百科链接 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该...
  • URLURL encoding 简述

    万次阅读 2015-10-15 23:42:06
    其中,有一项最基本的机制使得我们可以顺利的在浩瀚的互联网海洋快速的定位到我们想要的资源并接收数据。这项技术是网页的根本,是形成互联网的基石。它就是URLURL 英文全名 Uniform resource locator,翻译过来...
  • XML语法

    千次阅读 2011-07-07 18:37:50
    1. XML文档包含三个部分XML文档包含以下三个部分:① 一个XML文档声明。② 一个关于文档类型的定义。③ 用XML标记创建的内容。下面以myfile.xml为例进行说明。 XML轻松学习手册 ajie ajie@aolhoo.com2
  • .NET实现URL重写

    千次阅读 2007-01-08 19:51:00
    --------------本文来源于MSDN,很不错的发布日期: 8/23/2004 | 更新日期: 8/23/2004Scott Mitchell4GuysFromRolla.com适用范围:Microsoft® ASP.NET摘要:...URL 重写是截取传入 Web 请求并自动将请求重定向到其他
  • 使用语法分析器对SQL进行解析

    千次阅读 2016-02-25 19:39:02
    以下是本人的开源项目santr,一个类似antlr的语法分析器:  URL: https://github.com/szlwin/santr
  • apache URL重写转换成 NGINX URL重写 工具 http://www.anilcetin.com/convert-apache-htaccess-to-nginx/ 首先Apache的Rewite规则差别不是很大,但是Nginx的Rewrite规则比Apache的简单灵活多了 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,858
精华内容 28,743
关键字:

以下url中语法不正确的是