这周发布装修那个项目,遇到了一个很奇葩的问题。说是奇葩,只是我觉得奇葩,因为以前这么做总是理所应当这个结果,结果这个理所应当就把自己当进去了。
问题是这样的,客户那边新买了一个服务器,需要把项目布到新项目中去,布完之后用网址访问,却总是提示“非微信官方网站”。为了解决这个方法,就采用域名访问,然而问题又来了。登录信息在登录成功后,是存入Cookie中的,其他页面可以从Cookie中直接获取。结果用域名访问的时候,苹果机却获取不到Cookie中的信息,所以页面信息显示不出来。这是为什么呢?在旧服务器上明明是没事的呢?这个问题的原因和解决办法以后说,但是在说解决办法之前,得先说说HttpServlet这个东东。
说HttpServlet之前,不得不先说一下Servlet。Servlet是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。一般情况下,Servlet是指任何实现了Servlet这个接口的类。客户端和服务器交互时,是将请求发送给Servlet,Servlet解析Http协议获取客户端提交的数据,然后操作数据库,所以Servlet也可以认为是扩展基于Http协议的Web服务器。
Servlet是一个接口,HttpServlet是Servlet接口的一个实现类。Servlet有两个包,一个是javax.servlet和javax.servlet.http,在javax.servlet.http包中就定义了采用Http通信协议的HttpServlet类。HttpServlet类有两个经常用的对象,HttpServletRequest和HttpServletResponse,简单来说,HttpServletRequest是发送请求的,HttpServletResponse是服务器端给客户端做响应用的。
一个HTTP请求包含请求方法、请求URL、头字段、和请求体,包含以下请求方法:
1. GET :获取由请求URL标识的资源
2. POST :向Web服务器发送无限制长度的数据
3. PUT :存储一个资源到请求的URL
4. DELETE :删除由URL标识的资源
5. HEAD :返回URL标识的头信息
6. OPTIONS :返回服务器支持的HTTP方法
7. TRACE :返回TRACE请求附带的头字段
HTTP响应包括响应码、头字段、和响应体,HTTP协议要求响应码和所有的头字段都在任何响应体之前返回。
对应HTTP协议的请求和响应,HttpServlet也有相应的需要覆盖doPost()方法和doGet()方法。HttpServlet类的创建过程为:
1)扩展HttpServlet抽象类;
2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法;
3)获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串;
4)生成HTTP响应结果。通过HttpServletResponse对象生成响应结果,它有一个getWriter()方法,该方法返回一个PrintWriter对象。
HttpServlet创建之后,就可以响应Web客户请求了,请求流程如下:
1)Web客户向Servlet容器发出Http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)Servlet容器把HttpServlet的响应结果传给Web客户。
HttpServlet跟Servlet实际功能是一样的,都是一种容器,只不过HttpServlet是用来处理HTTP协议的。另外还有一点,在项目开发中,在不确定什么处理会得出什么结果之前,一定不要认为什么事情是理所应当的,因为在计算机的世界里,没有什么是理所应当,它总会出其不意的,在意料范围之外的出现一些问题。