一、基本概念和知识点
1、web server:实现了http协议的tcp服务器
2、application server:实现程序逻辑的服务器
3、web container:提供基础支持的容器
4、proxy:代理,client与目标之间的中介
5、https:安全传输层协议(TLS)之上的http
6、servlet处理资源请求的程序逻辑,程序员自己处理多用户导致多线程问题
7、ServletContext:多个servlet共享的环境
8、servlet容器: 支持servlet执行的runtime
9、forward:server内部流程跳转到别的页面
10、redirect:强制client二次请求,可以体现在client的地址栏
11、session:从客户打开浏览器连接到服务器,到客户关闭浏览器离开这个服务器,称做一个会话。当客户访问服务器时,可能会反复连接这个服务器上的几个页面、反复刷新一个页面或不断地向一个页面提交信息等,服务器应当通过某种方法知道这是同一个客户,这时就需要session对象。
12、cookie:每次http交互时client都会带上的数据,可以用于标记uid,数据存在client。
13、tomcat的server service connector engine servlet
server:对外暴露service,理论上可以不仅仅是http服务
service:connector+container,http服务
connector:处理外部的请求连接,如socket和传输相关
container:具体的处理逻辑的环境,其分为engine、host、context
engine:servlet的容器(支持多个虚拟主机)
host:虚拟主机(区别于硬件上的主机),对应一个网站(公网ip)
context:一个app的上下文环境(一个host可以有多个app)
14、filter 对每个请求都进行的逻辑
15、listener 事件发生时自动执行的代码,分为ServletContext,HttpSession和ServletRequest
16、csrf:(Cross-site request forgery)跨站请求伪造,利用登陆后的session信息,伪装浏览器发http请求。防御措施:api尽量不用get,因为get是单个的url,很容易被嵌入;每个post添加token域,保证是从固定的页面发起请求;或者直接添加一个账号验证或验证码;判断referer;在 HTTP 头中自定义属性并验证
17、XSS:跨站脚本(Cross-site scripting),在用户的输入中加入自动执行的js代码(可以是<script>也可以是隐藏html的事件触发),防范主要是对用户输入的转义
18、DDoS:Distributed Denial of Service 破坏信息安全“保密性”、“完整性”和“可用性”中的可用性,利用大量肉鸡模仿真实的请求,导致server资源耗尽。包括ARP、ICMP、IP、UDP、TCP和应用层的攻击等几个层次。
19、变量的范围包括 page、request、session、application等
二、java和python(以django为例)对web开发的支持
1、基础设施的层次
python:wsgi服务器、wsgi标准、web框架、app
java:app server、servlet容器、servlet、request+request、session
2、标准 wsgi vs javaee
3、signal VS listener
4、middleware VS Filter
5、django middleware tips:
process_request:收到请求后,解析url,确定view之前
process_view:进入view回调之前
view_callback:具体回调
process_template_response:view执行后,模板渲染之前(可以改模板)
process_response:生成response之后
三、实际开发流程
1、springmvc + mybatis
目录结构
pojo/entry/model
dao
service
controller
filter
依次实现数据库模式、model、dao、service、controller
打包成war
deploy到tomcat等服务器
2、django
写model、配url、写view、设置template、写配置文件
打包上线
不需要pojo、dao、service等部分
四、总结
1、java是静态类型语言,但是web开发要的是灵活性,所以java做了很多规范来提供web开发的支持,比如 javaee体系、servlet、request、header、cookie、session、filter、listener等的封装,jdbc、orm映射等
2、python是动态类型语言,支持闭包、装饰器,语言的表达能力是远大于java的,所以python没有为web开发设计很细的规范,只是定义了wsgi,使app服务器和web 框架解耦。在web框架内部,因为是脚本语言,不需要抽象request、header、cookie等数据结构(直接用dict就行),orm的映射也是很轻的。
3、python不需要依赖注入和反射(内置直接支持字符串的import)、aop(语言支持高阶函数)、webmvc(支持url直接映射回调)、不需要设计可插拔的架构(直接可以用配置文件来搞定)、不需要处理所有和类型相关的问题