一、《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 } 26 }
第8行“ServletContext context = this.config.getServletContext();”:从Filter 子类的this中获取ServletContext对象;
第12行“HttpServletRequest hrequest = (HttpServletRequest)request;”:从参数request强制转换为HttpServletRequest对象;
第14行“System.out.println("Filter已经截获到用户的请求的地址: " + hrequest.getServletPath());”:打印截获的用户请求的地址;
第17行“chain.doFilter(request, response);”:filter链式处理用户请求和应答。
二、filter授权的程序,判断过滤项是否合法:
1 public class MyFilter implements Filter { 2 @Override 3 public void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException{ 4 5 HttpServletRequest req = (HttpServletRequest)var1; 6 HttpSession session = req.getSession(); 7 String state = (String)session.getAttribute("state"); 8 if(state.equals("1")){ 9 var3.doFilter(var1,var2); 10 }else{ 11 HttpServletResponse response = (HttpServletResponse)var2; 12 response.sendRedirect("Error_page.html"); 13 } 14 } 15 }
引用于:http://www.cnblogs.com/yangming1996/p/6691840.html
三、session:
1、session解释:在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到关闭浏览器所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。
需要注意的是,一个Session的概念需要包括特定的客户端,特定的
服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
2、session用法:
当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 持久性的服务器内存量可能会很大,从而影响了可伸缩性。
四、程序比较:
1、
1 @WebServlet(urlPatterns={"/syncservlet"}) 2 public class SyncServlet extends HttpServlet { 3 private MyRemoteResource resource; 4 @Override 5 public void init(ServletConfig config) { 6 resource = MyRemoteResource.create("config1=x,config2=y"); 7 } 8 @Override 9 public void doGet(HttpServletRequest request, 10 HttpServletResponse response) { 11 response.setContentType("text/html;charset=UTF-8"); 12 String param = request.getParameter("param"); 13 String result = resource.process(param); 14 /* ... print to the response ... */ 15 } 16 }
2、
1 @WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true) 2 public class AsyncServlet extends HttpServlet { 3 /* ... Same variables and init method as in SyncServlet ... */ 4 @Override 5 public void doGet(HttpServletRequest request, 6 HttpServletResponse response) { 7 response.setContentType("text/html;charset=UTF-8"); 8 final AsyncContext acontext = request.startAsync(); 9 acontext.start(new Runnable() { 10 public void run() { 11 String param = acontext.getRequest().getParameter("param"); 12 String result = resource.process(param); 13 HttpServletResponse response = acontext.getResponse(); 14 /* ... print to the response ... */ 15 acontext.complete(); 16 } 17 }
两个程序都是对一个servlet进行处理,第一个程序是未采用异步进行处理,第二个程序采用异步。