上文也说过,HttpServletBean继承了Httpservlet,因此它也遵循Servlet流程来处理用户请求。
Servlet创建时的初始化过程中,会调用init()方法,我们可以在init()方法内做一系列的初始化动作,比如给Servlet的私有变量赋值,事实上SpringMVC在初始化过程中经常干这种事情。我们知道,在Servlet初始化过程中,Servlet把init-param的属性放在ServletConfig里,然后在循环它拿到值,但是这样太费劲了,所以SpringMVC索性把init-param赋值到自己的私有属性中。
HttpservletBean继承了HttpServlet,所以它也是一个Servlet,它也是FrameworkServlet的父类,而FrameworkServlet是DispatcherServlet的父类,每个类都有自己相关的初始化动作,这是典型的Template Method模板设计模式,每个类都会完成一些自己的本职工作,把不属于自己的本职工作推给自己的子类去完成。
Tomcat是一个基于组件形式的的Web容器,由Server(服务器)、Service(服务)、Connector(连接器)、Engine(引擎)、Host(主机)、Context(应用服务)组成,它们在server.xml里配置:
这个小组件,它会帮我们解析request中的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中。我们只需要调用FileItem的方法即可。
一个Workbook类可以看成一个Excel文件(即工作簿):
Sheet sheet = Workbook.createSheet("sheetName");// 创建一个Sheet类,Sheet为工作簿中的工作表
Row row = sheet.createRow("rowName");// 创建一个Row类,Row为工作表中的某一行
Cell cell = row.createCell("cellName");// 创建一个Cell类,Cell为某一行中的单元格的值
在如今的互联网,传统的页面刷新的用户交互已经过时了,而且使用后台渲染技术如JSP等也不符合当今互联网发展趋势,因为后台渲染会大大消耗服务器的资源,现在大多数网站的搭建都是使用html + js的方式来搭建,把数据的交互都交给客户执行,客户端通过Ajax异步交互从数据库中获取数据,而不用每次请求都刷新一次页面,说起交互,那就不得不提现在流行的单一页面应用程序了,单一页面指的是一个web应用只有一个页面,通过Ajax异步避免页面刷新提高网站的响应性,具有应用程序的良好体验,AngularJS就是为此而生的。
在这里主要讲如何利用md5散列算法对密码进行加密与校验,md5是一种不可逆的散列算法,因此广泛应用与密码的加密,以及文件的md5校验等。
对于一个好的框架,那必然有易于使用和理解的API,我们从外部看shiro,即从应用程序角度来看shiro是如何来完成工作的:
从上图可看到,程序与shiro直接的交互对象是Subject,它是shiro对外交互的核心API:
之前说过了微服务间,我是通过 Spring 的 RestTemplate 类来相互调用的,它可通过整合 Ribbon 实现负载均衡,但发现了这样写不够优雅,且不够模板化,因此本篇介绍一下 Feign。
Feign是一种声明式、模板化的 HTTP 客户端,在 Spring Cloud 中使用 Feign 其实就是创建一个接口类,它跟普通接口没啥两让,因此通过 Feign 调用 HTTP 请求,开发者完全感知不到这是远程方法。
到这里我们就可以构建一个略微不足的微服务分布式系统了,前面我们通过Ribbon实现服务的消费和负载均衡,但还有些不足的地方,举个例子,服务A和服务B,他们都注册到服务注册中心,这里还有个对外提供的一个服务,这个服务通过负载均衡提供调用服务A和服务B的方法,但是这样做就破坏了服务无状态的特点,无法直接复用既有接口,当我们需要对一个即有的集群内访问接口,实现外部服务访问时,我们不得不通过在原有接口上增加校验逻辑,或增加一个代理调用来实现权限控制,无法直接复用原有的接口。
最好的方法就是把所有请求都集中在最前端的地方,这地方就是zuul服务网关。
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。