j2ee高级开发技术课程第三周

一、分析Filter例子(轻量级javaee企业应用实战p132)

 1 // 执行过滤的核心方法
 2     public void doFilter(ServletRequest request,
 3         ServletResponse response, FilterChain chain)
 4         throws IOException,ServletException
 5     {
 6         // ---------下面代码用于对用户请求执行预处理---------
 7         // 获取ServletContext对象,用于记录日志
 8         ServletContext context = this.config.getServletContext();
 9         long before = System.currentTimeMillis();
10         System.out.println("开始过滤...");
11         // 将请求转换成HttpServletRequest请求
12         HttpServletRequest hrequest = (HttpServletRequest)request;
13         // 输出提示信息
14         System.out.println("Filter已经截获到用户的请求的地址: " +
15             hrequest.getServletPath());
16         // Filter只是链式处理,请求依然放行到目的地址
17         chain.doFilter(request, response);
18         // ---------下面代码用于对服务器响应执行后处理---------
19         long after = System.currentTimeMillis();
20         // 输出提示信息
21         System.out.println("过滤结束");
22         // 输出提示信息
23         System.out.println("请求被定位到" + hrequest.getRequestURI() +
24             "   所花的时间为: " + (after - before));
25     }

第8行,从Filter 子类的this中获取ServletContext对象。

第12行,从参数request强制转换为HttpServletRequest对象。

第14行,打印截获的用户请求的地址

第17行,filter链式处理用户请求和应答

二、了解session

ession直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到关闭浏览器所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。
需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
session的工作原理
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。

2.1、session的使用

(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
Session 是 用于保持状态的基于 Web服务器的方法。Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。
Session 通常用于执行以下操作
存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览 Web应用程序时需要的其它信息。
存储只需要在页重新加载过程中或按功能分组的一组页之间保持其状态的对象。
Session 的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或手机这样的浏览器设备。
持久性方法的限制
随着越来越多用户登录,Session 所需要的服务器内存量也会不断增加。
访问 Web应用程序的每个用户都生成一个单独的 Session 对象。每个 Session 对象的持续时间是用户访问的时间加上不活动的时间。
如果每个 Session 中保持许多对象,并且许多用户同时使用 Web应用程序(创建许多 Session),则用于 Session 持久性的服务器内存量可能会很大,从而影响了可伸缩性。

三、异步

容器在部署时会处理XML片段并组装成最终的部署描述符。由于容器负责组装web.xml文件,因此如果需要按照特定的顺序来调用框架的 Servlet、Listener或Filter时就可能产生问题。为了避免这个问题,Servlet 3.0 API支持绝对与相对顺序的部署描述符。我们可以在web.xml文件中使用元素指定绝对顺序,这样 WEB-INF/lib下的每个jar都可以通过META-INF/web-fragment.xml文件的元素获得一个名字。接下来,Web应用的WEB-INF/web.xml文件可以通过元素按照顺序列举出这些片段名,这个顺序就是jar的调用顺序,同时还有一个可选的元素用于指定是否以及何时包含那些未命名的jar文件。由于部署者可以选择只列出那些受信任的jar以进行部署,这样就可以避免意外情况的发生。除此之外,通过顺序还可以排除那些不需要被扫描的jar,这样就可以加快应用的部署速度。最后,如果你不想在产品环境下看到自我注册的情况发生,那就可以在web.xml文件中使用 元素,这会告诉Web容器只去寻找注解而非Web片段。

  由于既支持片段,又可以使用注解作为另一种配置机制,Servlet 3.0可以插入框架的共享拷贝,比如JAX-WS、JAX-RS以及JSF等,他们都构建在Web容器之上,使用了 ServletContainerInitializers。这些框架是通过jar services API被检测到的,同时还可以指定其处理的类型列表。对于WEB-INF/lib下的任何jar来说,只要其中包含的类被检测到都会传递给 ServletContainerInitializer。这样,我们还可以将同样的API作为ServletContextListeners。

  从Servlet API首次发布以来,构建Web应用的方法发生了翻天覆地的变化,尤其是使用越来越多的异步Web技术。这些技术(一般统称为Ajax或是Web 2.0)对于Web客户端(比如浏览器)与服务器端之间的传输机制产生了重要的影响,因为客户端会在一个页面中向服务器端发出更多的请求而不是每次请求都刷新一次页面。

  长时间的服务器端处理会恶化这一情况,比如等待JDBC连接池中的连接,或是等待JMS队列中的消息等。在Servlet中等待实在是太低效了,因为这种阻塞会消耗线程以及其他有限的系统资源。鉴于此,Servlet 3.0引入了异步处理请求的功能,这样线程就可以返回到容器中并执行其他任务。在请求上的异步处理开始时,其他线程或是回调既可以生成响应,也可以分发请求以便通过AsyncContext.dispatch方法在容器上下文中执行请求。

  由于异步Servlet的行为与同步的差别非常大,因此Servlet 3.0要求开发者指定asyncSupported=true以表示Servlet支持异步请求。不仅是Servlet,Filter也可以异步执行。 Servlet 3.0通过新的ServletRequest方法来支持异步处理,比如startAsync()会返回一个AsyncContext对象,该对象用于持有传递给方法的request与response对象。这里,处理原始请求的线程还可以执行其他操作。此外,API还引入了一个新的Listener 类:AsyncListener,它会告诉我们异步操作何时结束或者是否超时了。AsyncContext类拥有一个complete()方法,凭借该方法我们可以在异步操作结束后提交响应。AsyncListener类拥有一个dispatch()方法,它会将异步请求转发给容器,这样其他框架(比如 JSP)就可以生成响应了。

  除了引入大量的新技术和新方法外,Servlet 3.0规范还对其他地方进行了大量的增强:HttpServletRequest终于获得对multipart/form-data MIME类型的内置支持了、Cookie类开始支持“HttpOnly” cookie以避免某些跨站点的脚本攻击、ServletContext API也得到了更新,我们可以通过编程的方式将Servlet和Filter加到上下文中了。

例子:

1 @WebServlet(name="CalculatorServlet", asyncSupported=true, urlPatterns={"/calc", "/getVal"})  
2    public class CalculatorServlet extends HttpServlet{  
3       public void doGet(HttpServletRequest req, HttpServletResponse res) {  
4       ...  
5          AsyncContext aCtx = req.startAsync(req, res);  
6       }  
7       ...  
8    }  
原文地址:https://www.cnblogs.com/zgq0/p/8643116.html