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的原理
所谓异步处理就是指数据发送方发送数据给数据接收方后,不必等待数据接收方作出响应,可以继续发送下一个数据的通信方式。
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);
}
}
});
}
}