在这篇文章中,我们将带领您了解Swift2.0学习笔记的全貌,包括Day43——构造函数继承的相关情况。同时,我们还将为您介绍有关100天搞定机器学习|day43几张GIF理解K-均值聚类原理、day
在这篇文章中,我们将带领您了解Swift 2.0学习笔记的全貌,包括Day43——构造函数继承的相关情况。同时,我们还将为您介绍有关100天搞定机器学习|day43 几张GIF理解K-均值聚类原理、day43 大前端:通过一云多端搭建跨PC/移动的平台应用、day43:Apache域名跳转、用户验证及访问格式、java day43【Filter:过滤器 、Listener:监听器】的知识,以帮助您更好地理解这个主题。
本文目录一览:- Swift 2.0学习笔记(Day43)——构造函数继承(swift构造方法)
- 100天搞定机器学习|day43 几张GIF理解K-均值聚类原理
- day43 大前端:通过一云多端搭建跨PC/移动的平台应用
- day43:Apache域名跳转、用户验证及访问格式
- java day43【Filter:过滤器 、Listener:监听器】
Swift 2.0学习笔记(Day43)——构造函数继承(swift构造方法)
原创文章,欢迎转载。转载请注明:关东升的博客Swift中的子类构造函数的来源有两种:自己编写和从父类继承。并不是父类的所有的构造函数都能继承下来,能够从父类继承下来的构造函数是有条件的,如下所示。
条件1:如果子类没有定义任何指定构造函数,它将自动继承所有父类的指定构造函数。
条件2:如果子类提供了所有父类指定构造函数的实现,无论是通过条件1继承过来的,还是通过自己编写实现的,它都将自动继承所有父类的便利构造函数。
下面看示例代码:
来看看符合条件1的继承,Graduate继承Student,Graduate类没有定义任何指定构造函数,它将自动继承所有Student的指定构造函数。符合条件1后,Graduate从Student继承了如下指定构造函数:
init (name: String,age: Int,school: String)
再看符合条件2的继承,由于Graduate实现了Student的所有指定构造函数,Graduate将自动继承所有Student的便利构造函数。符合条件2后,Graduate从Student继承了如下3个便利构造函数:
init (name: String,age: Int)
init (name: String)
init ()
Student继承Person后有4个构造函数。
条件1对Student不满足,因为它有指定构造函数,Student类中的便利构造函数init (name: String,age: Int)满足了条件2,它实现了父类指定构造函数init (name: String,age: Int)。另外,由于子类构造函数与父类构造函数参数相同,需要使用override关键字,表示子类构造函数重写(overriding)了父类构造函数。
由于Student类实现了父类指定构造函数,因此也继承了父类的另外两个便利构造函数。
欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php
100天搞定机器学习|day43 几张GIF理解K-均值聚类原理
前文推荐
如何正确使用「K均值聚类」?
KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
K个初始聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机地选取任意k个对象作为初始聚类中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离赋给最近的簇。当考查完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。
算法过程如下: (1)从N个数据文档(样本)随机选取K个数据文档作为质心(聚类中心)。 本文在聚类中心初始化实现过程中采取在样本空间范围内随机生成K个聚类中心。 (2)对每个数据文档测量其到每个质心的距离,并把它归到最近的质心的类。 (3)重新计算已经得到的各个类的质心。 (4)迭代(2)~(3步直至新的质心与原质心相等或小于指定阈值,算法结束。
The data points.
Starting with 4 left-most points
Starting with 4 right-most points
Starting with 4 top points
Starting with 4 bottom points
Starting with 4 random points in one cluster
参考:
https://github.com/MLEveryday/100-Days-Of-ML-Code https://www.cnblogs.com/eczhou/p/7860424.html http://www.avikjain.me
原文出处:https://www.cnblogs.com/jpld/p/11374548.html
day43 大前端:通过一云多端搭建跨PC/移动的平台应用
前端应用
移动开发的几种模式
第一种是原生开发,比如苹果的应用,我们通常会使用 Swift 来开发,而对于安卓的应用,我们通常会使用 Kotlin 来开发。
原生开发有这样几点好处:
- 对于终端用户来说,它的体验会更顺畅,因为一般在 App 包下载安装的过程中,会一次性下载初始化的资源包,再加上加载过程的预处理,就减少了动态渲染的压力;
- 对于开发者来说,原生的 App 有强大的开发工具,从开发到打包再到发布,都有着很成熟的一条龙的流水线,而不像在 Web 应用的开发中,需要处理各种的原生支持问题、浏览器兼容问题等。
其劣势:
其中比较明显的就是在开发的过程中,作为开发者需要同时掌握 Swift、Kotlin 和 JavaScript 三种语言,再加上测试和应用商店审核等工作,可以说这样的工作量是成倍增加的,所以三端通常是由不同团队完成的。
第二种是 Web 应用,对于 Web 应用来说,程序是在浏览器中运行的。
Web 应用有这样几点好处:
- 大大减少了用户手机内存空间;避免了 App 在部分区域的商店不支持的问题,用户需要访问相关应用的时候,只需要打开浏览器,输入相关的应用地址,就可以浏览相关信息;
- 对开发者来说,大大避免了漫长的应用商店审核流程,缩短了开发和发布周期。
其劣势:
- 从终端用户的体验上,Web 应用的体验是逊色于原生 App 的,毕竟浏览器的渲染还是比不上原生 App 的丝滑体验;
- 从用户体验上来说,用户需要输入地址才能访问相关的 App,虽然 Web 应用也支持生成快捷图标到桌面,或者移动浏览器也支持书签的功能,但是从使用习惯上来说,用户并没有相关的习惯,所以对于用户粘性很高、使用频率也比较高的应用来说,Web 应用就显得不是那么合适了;
- 对于品牌来说,想要给用户一个值得信赖的体验,一个可以下载的原生应用也是比一个只能访问的 Web 应用的 URL 看上去更加靠谱的。
第三种是混合开发模式,在混合开发模式下,顾名思义,就是 App 本身是通过原生的方式发布的,但是里面从不同程度嵌入了 Web 应用的混合应用。
首先,我们先来说说优势:
- 这样的开发模式下,让应用“看上去”更加原生了,毕竟它是“借壳上架”到应用商店的;
- 这样的开发模式下,内容的更新变得更加容易了,因为在一层原生应用的壳下,内部的应用实际是动态加载的 Web 应用,这样每次在更新的时候就可以采用“热更新”,而不需要重新对应用进行打包、再次审核及发布。
其劣势:
- 应用商店也不傻,如果大家都只做一个壳,然后发布到应用商店,那这个审核机制就形同虚设了,所以通常一个应用的原生部分低于一定比例的时候,是无法通过审核的;
- 即使通过了审核,它的体验也会比较差,因为 App 本身就是一个应用,内部再调用浏览器来渲染一个 Web 应用,这样的体验通常是低于原生应用,甚至还不如直接在浏览器访问的 Web 应用。所以对于开发的应用,特别是游戏类的,这种方式肯定是不适合的。
那么为了解决上面的问题,在开发中,有没有什么解决方案呢?
在早期,曾经有一段时间,前端试图通过渐进式 Web 应用(PWA)的方式来代替原生应用。
PWA :它的核心理念是在 Web 应用的基础上,通过一系列的技术实现,来提高用户的粘性、增加响应、增强离线消息的可靠性。
为了能够给用户更加类原生的体验,这里用到了 Notification/Web Push API、Web Manifest、 Service Worker 等等。这些功能可以让 Web 应用也实现消息推送、形成桌面应用和离线功能等。
但是由于端上用户更习惯于下载原生app,在PC端,更多用户形成了用浏览器而尽可能不安装原生应用的习惯。
既然通过开发驱动去改变用户的使用习惯是不可能的,那么开发者又换了一个思路,就是怎么在保持原生的基础上,能够选择 JavaScript 作为开发语言。
这时,在 2015 年,由 Meta 在同一时期推出的 React Native 就逐渐变得流行起来。它可以允许开发者同时用一套 JavaScript 代码开发出 iOS、Android 和 Web 应用,以及基于 Android 的电视应用。也就是说,作为开发者,不再需要同时学习几种语言进行前端的移动开发。当然,随着 React Native 的流行,后面又相继出现了基于 React Native 的 Windows 和 macOS 应用开发模式。
同一时期,2013 年推出的 Electron 也逐渐流行了起来,开发者可以在 Windows 和 macOS 应用的基础上,开发 Linux 的桌面应用。
再往后,随着小程序的出现,国内也出现了基于 Vue.js 的 uni-app,它可以在原生和 Web 应用的基础上,加上对小程序的支持。
Web 服务
说完了前端,我们再来看看中间层。
通常,我们的网站需要一个 Web 应用框架,用来创建前端的页面,并且提供相关的数据给到前端渲染。为了达到这个目的,Web 应用最核心需要支持的功能是路由(routing)、中间件(middleware)和模版系统(template engine)。
路由的目的是能够根据 URL 来解析用户请求访问的页面;中间件的目的是根据前端的请求做出反馈,并且调用下一个中间件;模版引擎的作用是根据定义好的 HTML 模版和变量参数,对页面进行渲染。目前,市面上比较流行的 Web 服务器端的框架是 Express.js,可以满足我们上面说到的几个核心功能。
中间件核心子功能:
- 作为服务的提供方,在中间层除了构建页面外,也需要对应不同的前端,一云多端地提供按照不同的需求适配的 API;
- 在面对中间件下面的不同类型的数据库或后端系统,也需要提供一层聚合,让转化后的数据格式可以满足前端的需求;
- 从安全的角度来看,API 的创建需要一系列的鉴权。
数据的存储和查询
前面,我们说完了前端应用、中间件和 Web 服务 API,那么为了创建一个完整的 Web 应用系统,离不开数据本身。所以最后,我们再来看下数据的存储和查询。
首先,我们需要一个数据库来存储前端产生的数据。数据库可以大致分为两类,一类是关系型数据库(RDBMS),另外一类是非关系型数据库(NoSQL)。在服务器端的 JavaScript 中,有基于 JS 引擎 SpiderMonky 来实现的 MongoDB,它是一个类文件型的非关系型数据库。通过 MongoDB,我们可以对应用产生和依赖的数据进行存储。因为它天然就是用类 JSON 的格式来做数据文件存储的,所以非常适用于 Web 应用的开发。
我们知道在前端开发中,当我们想要查询数据库中的信息时,需要通过一种查询语言。在传统的查询语言中,特别是在关系型的数据库中,我们通常使用的是 select from 这样的查询请求格式,返回的是一张表;而一种叫做 GraphQL 的查询请求和返回的格式,则更像是 JSON 或对象的字面量表达。
换句话说,它的使用更符合我们前端开发的直觉。GraphQL 便是在 2012 年发展起来的,当时 Meta 内部开发了一个 GraphQL 的项目,随后,在 2015 年对外公布,之后在 2018 年从 Meta 移到了独立的组织来管理。
GraphQL 有几大特点:
- 从对 JSON 格式的使用上,我们可以看出,GraphQL 是一种更适用于 API 服务的查询语言,也是使用现有数据完成这些查询的运行时。 GraphQL 为 API 中的数据结构提供了完整且易于理解的描述,使客户端能够准确地表达想要查询的对象。
- GraphQL 的另外一大特点是,它用到了我们在前面 JavaScript 类型检查中提到的类型系统。这样可以更好地对输入和输出的数据类型有所定义和规范。
- 在传统的 REST API 中,我们有时需要通过几个请求才能拿到一条完整的返回信息,而通过 GraphQL,我们可以在一条信息中包含所需的全部信息,这样大大减少了反复的请求。
在传统的开发中,前后端产生分歧是常有的事,其中很大的原因就是后端很难站在前端的角度想如何能提供面向业务对象的数据;在数据服务于业务的情况下,应该如何保证类型系统的规范;又或者是应该如何让请求的数量减少,增加每次服务调用的效率。而在大前端的概念下,一切的系统设计都是服务于前端用户的,在这样重业务驱动的模式下,可以倒逼后端更好地满足前端开发的需求。
此文章为2月Day21学习笔记,内容来源于极客时间《Jvascript进阶实战课》,大家共同进步
day43:Apache域名跳转、用户验证及访问格式
1、apapche用户验证:访问网站时需要输入用户名和密码,验证通过后才能访问,增加安全性:比如管理登录后台的入口:
1、先针对根目录(网站)做认证:也就是说访问网站的时候会提示用户名和密码:才可以访问:
1:需要编辑虚拟主机配置文件: /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf :此时针对第一个虚拟主机做验证:如下:
[root@localhost_002 111.com]# vim /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com #定义管理员邮箱:
DocumentRoot "/data/wwwroot/111.com" #网站根目录,要与下面验证时的目录一致:
ServerName www.111.com #网站域名:只能有一个:
ServerAlias www.example.com #网站别名:可以有多个:
#认证如下:
<Directory /data/wwwroot/111.com> #指定认证的目录:
AllowOverride AuthConfig #相当于打开认证的开关:
AuthName "111.com user auth" #自定义认证的名字,用处不大,会显示在验证页面:
AuthType Basic #认证类型,一般为Basic:
AuthUserFile /data/.htpasswd #指定密码文件所在位置,后续需要手动用命令生成:
require valid-user #指定需要认证的用户为auth里定义的全部用户:
</Directory>
#认证结束:
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
2:创建在上述文件(httpd-vhosts.conf)里定义的密码文件:如下:
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/htpasswd -m /data/.htpasswd lisi
New password:
Re-type new password:
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/htpasswd -m /data/.htpasswd zhansan
New password:
Re-type new password:
Adding password for user zhansan
[root@localhost_002 111.com]# cat /data/.htpasswd
lisi:$apr1$Ju.ZWThz$3aMSzII6cDp6xXCNm.a2A/
zhansan:$apr1$r8DvZQBQ$qm208cGSaTYQfP2uaW1Wa0
用到的两个参数:-c:create,创建: -m:md5加密:
如上图例,我们创建了两个用户了zhansan和lisi,并且第二次创建用户则不需要加-c参数了:
3:配置完成后测试和重新加载配置文件: -t graceful
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful
4:测试:crul -x192.168.149.130:80 -I
[root@localhost_002 111.com]# curl -x192.168.149.130:80 www.111.com -I
HTTP/1.1 401 Unauthorized
Date: Sun, 26 Aug 2018 16:29:26 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
WWW-Authenticate: Basic realm="111.com user auth"
Content-Type: text/html; charset=iso-8859-1
由上图例可知,用户状态码401,说明当前所访问的内容页面需要进行验证:
使用用户和密码验证访问: crul -x192.168.149.130:80 -uzhansan:nihao123! www.111.com -I
[root@localhost_002 111.com]# curl -x192.168.149.130:80 -uzhansan:nihao123! www.111.com -I
HTTP/1.1 200 OK
Date: Sun, 26 Aug 2018 16:36:03 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
如上图例可知,状态码为200 OK,网站可以正常访问:
当然,也可以浏览器访问,不过绑定到物理主机的hosts文件:C:\Windows\System32\drivers\etc\hosts: IP地址 域名
注释:用户名和密码输入正确后既可访问:
扩展:htpasswd命令,是Apache的web服务器内置工具,用户创建、更新和存储用户名和用户基本认证的密码文件:
语法:htpasswd options 参数
-c:create,创建一个密码文件:
-m:使用md5算法对密码进行加密:
-s:使用SHA算法对密码进行加密:
-p:不对密码进行加密,即明文密码:
-D:删除指定用户:
2、当然Apapche可以针对网站做验证,也可以对某个网站下的文件做验证,比如:需要对后台登录界面做二次验证:
1:编辑虚拟主机配置文件: /usr/local/apapche2.4/conf/extra/httpd-vhost.conf
[root@localhost_002 ~]# vim /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/data/wwwroot/111.com"
ServerName www.111.com
ServerAlias www.example.com
#<Directory /data/wwwroot/111.com> #注释掉,即取消对目录设置的用户验证:
<FilesMatch 123.php> #新增这行:对文件设定用户验证:
AllowOverride AuthConfig
AuthName "111.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</FilesMatch> #新增这行:对文件设定用户验证:
# </Directory> #注释掉,即取消对目录设置的用户验证:
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
注释:注释掉"<Directory>......</Directory>" 取消对目录设定的用户验证:
"<FilsMatch>......</FilshMatch>" 对文件设定用户验证:
2:检测并重启服务: -t graceful
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
3:测试: crul -x192.168.149.130:80 www.111.com/123.php -I
[root@localhost_002 ~]# curl -x192.168.149.130:80 www.111.com/ -I
HTTP/1.1 200 OK
[root@localhost_002 ~]# curl -x192.168.149.130:80 www.111.com/123.php -I
HTTP/1.1 401 Unauthorized
Date: Mon, 27 Aug 2018 04:01:06 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
WWW-Authenticate: Basic realm="111.com user auth"
Content-Type: text/html; charset=iso-8859-1
注释:此时可以随意访问www.111.com,但是访问111.com的子目录时会提示401错误,即需要用户验证:
使用用户名和密码验证访问,如下: 状态码200 OK:
[root@localhost_002 ~]# curl -x192.168.149.130:80 -uzhansan:nihao123! www.111.com/123.php
123.php
[root@localhost_002 ~]# curl -x192.168.149.130:80 -uzhansan:nihao123! www.111.com/123.php -I
HTTP/1.1 200 OK
浏览器访问下也是一样子:
2、域名跳转:有时候网站变更,涉及到SEO,权重排名(页面多),域名变更好,也还是想访问原网站,设置域名跳转,会跳转到原网站:
域名跳转的分类: 301 302
301:永久跳转,是永久重定向,搜索引擎会在抓取新内容时,用重定向后的网址替换旧的网址:
302:暂时的跳转,搜索引擎会抓取新内容的同时保留旧网址,因为服务器返回的是302,搜索引擎认为新网址只是暂时的:不会降低权重不友好:
1:域名跳转配置: /usr/local/papache2.4/conf/extra/httpd-vhosts.conf
[root@localhost_002 ~]# vim /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/data/wwwroot/111.com"
ServerName www.111.com
ServerAlias www.example.com www.2111.com
<IfModule mod_rewrite.c>
#新增,需要mod_rewrite模块支持,在编译apapche时不选择的most大多数模块:则不会列出该模块:
RewriteEngine on
#开启rewrite_mod模块开关:
RewriteCond %{HTTP_HOST} !^www.111.com$
#cond=condition,定义rewrite条件,所有非主机名(域名)是www.111.com满足条件,则跳转到:
RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301,L]
#定义rewrite规则,当满足上面规则时,此规则才会执行:
</IfModule>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
如上图例:使用域名跳转功能,首先是需要mod_rewrite模块的支持才可以,其次是打开rewrite_mod模块开关,然后设定规则跳转条件如下:
RewrteCond %{HTTP_HOST} !^www.111.com$ 表示当域名不是www.111.com(主域名)的时候则跳转, "HTTP_HOST"就是定义的域名, "!"表示取反的意思: "^ $" 表示以www.111.com开头和结尾的:
RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301,L] 表示跳转网站后面的子页面,如www.exapmle.com/123.php最后要跳转到www.111.com/123.php,让后面123.php这一部分保存不变:
#"^/"只表示域名的前面那一部分http://www.111.com/, "/"则表示com后的那的斜杠:
#(.*)$表示则表示域名后面的那一部分,此处表示123.php,也指后面的$1, "$1"则是前面括号里的"(.*)"
#如果域名后有个子目录,可以加多个匹配和$,比如^/(.*)([0-9) http://www.111.com/$1/$2, $1则对应前面第一个括号,$2对应第二个小括号:
2:测试: apachectl -M 查看模块是否加载; 然后在主配置文件 httpd.conf里打开配置文件:
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -M |grep rewrite
rewrite_module (shared)
[root@localhost_002 ~]# cat /usr/local/apapche2.4/conf/httpd.conf |grep rewrite
LoadModule rewrite_module modules/mod_rewrite.so
3:测试: #看到状态码为301,跳转到www.111.com下: 需要先检查并重新加载服务:
[root@localhost_002 ~]# curl -x127.0.0.1:80 www.2111.com/ -I #状态码为301:
HTTP/1.1 301 Moved Permanently
Date: Mon, 27 Aug 2018 06:03:21 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Location: http://www.111.com/
Content-Type: text/html; charset=iso-8859-1
[root@localhost_002 ~]# curl -x127.0.0.1:80 www.2111.com/sdfsdf -I #子页面状态码也是301:
HTTP/1.1 301 Moved Permanently
Date: Mon, 27 Aug 2018 06:03:28 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Location: http://www.111.com/sdfsdf
[root@localhost_002 ~]# curl -x127.0.0.1:80 www.111.com/sdfssdfsadff/sdfsdf -I #再一级子页面则提示404:
HTTP/1.1 404 Not Found
#页面提示404,则表示页面不存:
状态码:常用 :
200 OK:表示成功:
301:表示页面跳转:
404:表示页面不存在:
401:表示用户名密码验证:
403:Forbidden:
3、Apache的访问日记:日记所在目录在虚拟主机httpd-vhosts.conf里定义,日记格式在httpd.conf下定义:
1:日记格式所在目录: /usr/local/apapche2.4/logs/
[root@localhost_002 ~]# ls /usr/local/apapche2.4/logs/
111.com-access_log 111.com-error_log abc.com-access_log abc.com-error_log access_log
error_log httpd.pid
[root@localhost_002 ~]# tail -f /usr/local/apapche2.4/logs/111.com-access_log
127.0.0.1 - - [27/Aug/2018:14:05:22 +0800] "HEAD HTTP://www.111.com/sdfssdfsadff/sdfsdf HTTP/1.1" 404 -
192.168.149.135 - - [27/Aug/2018:14:06:29 +0800] "GET / HTTP/1.1" 301 227
192.168.149.135 - lisi [27/Aug/2018:14:06:29 +0800] "GET / HTTP/1.1" 200 7
如上图例: HEAD表示是使用crul命令并加-I请求的,会显示状态码: get则表示正常的情况:
自定义日记格式: /usr/local/apapche2.4/conf/httpd.conf
[root@localhost_002 ~]#vim /usr/local/apapche2.4/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#%h表示来源IP, %l表login用户 %u表示user 用户, %t表示time 时间 %r表示request 行为, %s表示status 状态码, %b表示byte 大小:
格式信息: %h %l %u %t %r %s %b
User-Agent:浏览器标识:对于来访问服务器的对象,使用的是什么浏览器或客户端:
如谷歌:使用的谷歌类似标示:
如:crul:则显示curl相关:
Referer:访问本页面时,浏览器上一次所访问的网址是什么,比如你访问子页面,会记录父页面的网址:也就是说你是通过什么跳转到本论坛的:百度或者其他浏览器:
如上图例:系统自带的日记格式有: common combined 两种:
2:修改网站访问日记格式: /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf
[root@localhost_002 ~]# cat /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin yuanhh@foreb.com
DocumentRoot "/data/wwwroot/111.com"
ServerName www.111.com
ServerAlias www.example.com www.2111.com
#<Directory /data/wwwroot/111.com>
#<FilesMatch 123.php>
# AllowOverride AuthConfig
# AuthName "111.com user auth"
# AuthType Basic
# AuthUserFile /data/.htpasswd
# require valid-user
# </FilesMatch>
# </Directory>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.111.com$
RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301,L]
</IfModule>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" combined #此处修改common 为 combined
</VirtualHost>
注释:修改图例中CustomLog这一个行,最后common为combined:
3:检测配置并且启动服务: -t graceful
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
4:测试,分别用curl和浏览器访问,然后再次查看日记: crul -x127.0.0.1:80 www.111.com -I
[root@localhost_002 ~]# curl -x127.0.0.1:80 www.111.com -I
HTTP/1.1 200 OK
Date: Mon, 27 Aug 2018 06:53:14 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
[root@localhost_002 ~]# curl -x127.0.0.1:80 www.2111.com -I
HTTP/1.1 301 Moved Permanently
[root@localhost_002 ~]# curl -x127.0.0.1:80 www.2111.com/123.php -I
HTTP/1.1 301 Moved Permanently
Date: Mon, 27 Aug 2018 06:53:31 GMT
5:查看日记格式: tail /usr/local/apapche2.4/logs/111.com-access_log
[root@localhost_002 ~]# tail /usr/local/apapche2.4/logs/111.com-access_log
127.0.0.1 - - [27/Aug/2018:14:53:19 +0800] "HEAD HTTP://www.2111.com/ HTTP/1.1" 301 - "-" "curl/7.29.0"
127.0.0.1 - - [27/Aug/2018:14:53:31 +0800] "HEAD HTTP://www.2111.com/123.php HTTP/1.1" 301 - "-" "curl/7.29.0"
192.168.149.135 - lisi [27/Aug/2018:14:53:50 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
如上即可:
java day43【Filter:过滤器 、Listener:监听器】
第一章 Filter:过滤器
1. 概念:
* 生活中的过滤器:净水器,空气净化器,土匪、
* web 中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
* 过滤器的作用:
* 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...
2. 快速入门:
1. 步骤:
1. 定义一个类,实现接口 Filter
2. 复写方法
3. 配置拦截路径
1. web.xml
2. 注解
2. 代码:
@WebFilter ("/*")// 访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println ("filterDemo1 被执行了....");
// 放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
3. 过滤器细节:
1. web.xml 配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
2. 过滤器执行流程
1. 执行过滤器
2. 执行放行后的资源
3. 回来执行过滤器放行代码下边的代码
3. 过滤器生命周期方法
1. init: 在服务器启动后,会创建 Filter 对象,然后调用 init 方法。只执行一次。用于加载资源
2. doFilter: 每一次请求被拦截资源时,会执行。执行多次
3. destroy: 在服务器关闭后,Filter 对象被销毁。如果服务器是正常关闭,则会执行 destroy 方法。只执行一次。用于释放资源
4. 过滤器配置详解
* 拦截路径配置:
1. 具体资源路径: /index.jsp 只有访问 index.jsp 资源时,过滤器才会被执行
2. 拦截目录: /user/* 访问 /user 下的所有资源时,过滤器都会被执行
3. 后缀名拦截: *.jsp 访问所有后缀名为 jsp 资源时,过滤器都会被执行
4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
* 拦截方式配置:资源被访问的方式
* 注解配置:
* 设置 dispatcherTypes 属性
1. REQUEST:默认值。浏览器直接请求资源
2. FORWARD:转发访问资源
3. INCLUDE:包含访问资源
4. ERROR:错误跳转资源
5. ASYNC:异步访问资源
* web.xml 配置
* 设置 <dispatcher></dispatcher > 标签即可
5. 过滤器链 (配置多个过滤器)
* 执行顺序:如果有两个过滤器:过滤器 1 和过滤器 2
1. 过滤器 1
2. 过滤器 2
3. 资源执行
4. 过滤器 2
5. 过滤器 1
* 过滤器先后顺序问题:
1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
* 如: AFilter 和 BFilter,AFilter 就先执行了。
2. web.xml 配置: <filter-mapping> 谁定义在上边,谁先执行
4. 案例:
1. 案例 1_登录验证
* 需求:
1. 访问 day17_case 案例的资源。验证其是否登录
2. 如果登录了,则直接放行。
3. 如果没有登录,则跳转到登录页面,提示 "您尚未登录,请先登录"。
2. 案例 2_敏感词汇过滤
* 需求:
1. 对 day17_case 案例录入的数据进行敏感词汇过滤
2. 敏感词汇参考《敏感词汇.txt》
3. 如果是敏感词汇,替换为 ***
* 分析:
1. 对 request 对象进行增强。增强获取参数相关方法
2. 放行。传递代理对象
* 增强对象的功能:
* 设计模式:一些通用的解决固定问题的方式
1. 装饰模式
2. 代理模式
* 概念:
1. 真实对象:被代理的对象
2. 代理对象:
3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
* 实现方式:
1. 静态代理:有一个类文件描述代理模式
2. 动态代理:在内存中形成代理类
* 实现步骤:
1. 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance ();
3. 使用代理对象调用方法。
4. 增强方法
* 增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
第二章 Listener:监听器
* 概念:web 的三大组件之一。
* 事件监听机制
* 事件 :一件事情
* 事件源 :事件发生的地方
* 监听器 :一个对象
* 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
* ServletContextListener: 监听 ServletContext 对象的创建和销毁
* 方法:
* void contextDestroyed (ServletContextEvent sce) :ServletContext 对象被销毁之前会调用该方法
* void contextInitialized (ServletContextEvent sce) :ServletContext 对象创建后会调用该方法
* 步骤:
1. 定义一个类,实现 ServletContextListener 接口
2. 复写方法
3. 配置
1. web.xml
<listener>
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
* 指定初始化参数 <context-param>
2. 注解:
* @WebListener
今天关于Swift 2.0学习笔记和Day43——构造函数继承的介绍到此结束,谢谢您的阅读,有关100天搞定机器学习|day43 几张GIF理解K-均值聚类原理、day43 大前端:通过一云多端搭建跨PC/移动的平台应用、day43:Apache域名跳转、用户验证及访问格式、java day43【Filter:过滤器 、Listener:监听器】等更多相关知识的信息可以在本站进行查询。
本文标签: