javaEE第三周

1.分析filter的例子

// 执行过滤的核心方法
 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链式处理用户请求和应答

2.了解session

a.session的用法

session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。 session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。

b.session的原理

session的工作原理
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册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 持久性的服务器内存量可能会很大,从而影响了可伸缩性。
3.异步处理

所谓异步处理就是指数据发送方发送数据给数据接收方后,不必等待数据接收方作出响应,可以继续发送下一个数据的通信方式。

Servlet 3.0版本提供了相关异步处理的功能,具体实现方式如下:

  • 需要使用注解在对应Servlet配置asyncSupported=true,表示当前Servlet支持异步。
  • 通过Request对象的startAsync(Request, Response)方法获取异步上下文对象。
  • 通过异步上下文对象调用start(new Runnable(){})方法开始异步处理,Runnable类的run()方法提供具体异步的逻辑代码。

根据上述步骤,通过一个代码实例演示。

@WebServlet(urlPatterns="/async",asyncSupported=true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, final HttpServletResponse resp)
            throws ServletException, IOException {
        // 设置响应类型及编码格式
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().print("马上开始:<br/>");
        // 刷新缓冲区
        resp.getWriter().flush();
        // 获取异步上下文对象
        final AsyncContext ac = req.startAsync(req, resp);
        // 开始异步处理
        ac.start(new Runnable() {
            @Override
            public void run() {
                try {
                    for (char ch = 'A'; ch <= 'Z'; ch++) {
                        resp.getWriter().print(ch);
                        resp.getWriter().flush();
                        Thread.sleep(250);
                    }
                    // 表示异步处理完毕
                    ac.complete();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        });
    }
}
原文地址:https://www.cnblogs.com/li1158/p/8921596.html