Servlet

概念

Servlet是基于Java技术的Web应用程序中的一个组件,由容器管理并产生动态的内容

  • Servlet是按照Servlet规范编写的Java类。
  • Servlet应用请求/响应模型,扩展了服务器的功能

Servlet是一种独立于平台和协议的服务器端的Java技术,可以用来生成动态的Web页面与传统的CGI(公共网关接口)和许多其他类似CGI技术相比,Servlet具有更好的可移植性、更强大的功能,更少的投资,更高的效率,更好的安全性等特点

Servlet请求转发

  • forward:是指转发,将当前request和response对象保存,交给指定的url处理。并没有表示页面的跳转,所以地址栏的地址不会发生改变
  • redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变
  • include:意为包含,即包含url中的内容,进一步理解为,将url中的内容包含进当前的servlet当中来,并用当前servlet的request和respose来执行url中的内容处理业务.所以不会发生页面的跳转,地址栏地址不会发生改变

客户端跳转

在Servlet中如果要想进行客户端跳转,直接使用HttpServletResponse接口的sendRedirect()方法即可,要注意的是:此跳转只能传递session范围的属性,无法传递request范围属性
这个过程也可叫做重定向。重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,且跳转后浏览器地址栏内容将变为新的指定地址
重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求response.sendRedirect(path)
由于是客户端跳转,从运行程序结果可以发现,跳转后的地址栏是会发生变化的,只能接收session属性范围的内容,不能接收request属性范围的内容

服务器跳转

服务器跳转也可叫做请求转发。请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变。请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应

Session

状态保持

HTTP是一种无状态协议,会话跟踪技术可以由以下四种方式来实现

  • 使用Cookie对象(Cookie):客户端会话
  • 使用请求对象(ServletRequest或HttpServletRequest)
  • 使用会话对象(HttpSession)
  • 使用上下文对象(ServletContext)

cookie机制

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie
然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie
cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的
浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器

  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
  • 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie

session机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一种是作为查询字符串附加在URL后面,表现形式http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器
HttpSession是Java平台对session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异

Filter

过滤器(Filter)是 Java 组件,允许运行过程中改变进入资源的请求和资源返回的响应中的有效负载和 header 信息
过滤器是一种代码重用的技术,它可以改变 HTTP 请求的内容,响应,及 header 信息
过滤器通常不产生
响应或像 servlet 那样对请求作出响应,而是修改或调整到资源的请求,修改或调整来自资源的响应。
过滤器可以作用于动态或静态内容
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应
主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链
优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题

作用

  • 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest
    根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据
  • 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse
    根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据

Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改,它在Servlet被调用之前检查Request对象,修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response内容
Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件,具有以下特点

  • Servlet过滤器可能检查和修改ServletRequest和ServletResponse对象
  • 可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发该过滤器工作
  • 多个Servlet过滤器可以被串联起来,形成管道效应,协同修改请求和响应对象
  • 所有支持Java Servlet规范2.3的Servlet容器,都支持Servlet过滤器

实现

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口

  • init(FilterConfig)
    这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后就会调用这个方法
    在这个方法中可以通过FilterConfig来读取web.xml文件中Servlet过滤器的初始化参数。
  • doFilter(ServletRequest, ServletResponse, FilterChain)
    这是完成实际的过滤操作的方法,当客户请求访问与过滤器关联的URL时,Servlet容器先调用该方法
    FilterChain参数用来访问后续的过滤器的doFilter()方法
  • destroy()
    Servlet容器在销毁过滤器实例前调用该方法,在这个方法中,可以释放过滤器占用的资源

几种配置

  • request过滤器
    只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理
  • forward过滤器
  • include过滤器
  • error过滤器

GET/POST

使用GET,form中的数据将编码到url中,而使用POST的form中的数据则在http协议的header中传输
重复访问使用GET方法请求的页面,浏览器会使用缓存处理后续请求。使用POST方法的form提交时,浏览器基于POST将产生永久改变的假设,将让用户进行提交确认
form提交的第一步是创建数据集,并根据ENCTYPE对数据集进行编码。ENCTYPE有两个值:multipart/form-data,application/x-www-form-urlencoded(默认值),前者可同时用于GET,POST,后者只用于POST
原则上,除理GET和POST请求是没有分别的

  • get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  • 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。两种方式的参数都可以用Request来获得。
  • get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
  • get安全性非常低,post安全性较高。

参考资料

Servlet/JSP基础指南

推荐阅读更多精彩内容