一、分析Filter例子:

@WebFilter(filterName="log",urlPatterns={"/*"})
//创建一个LOgFilter类
public class LogFilter implements Filter
{
//FilterConfig可用于访问Filter的配置信息
private FilterConfig config;
//实现初始化方法
public void init(FilterConfig config)
{
this.config = config;
}
//实现销毁方法
public void destroy()
{
this.config = null;
}
//执行过滤的核心方法
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
throws IOException,ServletException//创建一个doFilter 类,request参数是用于获取客户请求数据,response参数是用于发送响应数据,chain参数是过滤调用链。
{
//---------下面代码用于对用户请求执行预处理---------
//获取ServletContext对象,用于记录日志
ServletContext context = this.config.getServletContext();  //从Filter 子类的this中获取ServletContext对象
long before = System.currentTimeMillis();//是获得当前时间距离1970-1-1 00:00:00经过的毫秒数
System.out.println("开始过滤...");
//将请求转换成HttpServletRequest请求
HttpServletRequest hrequest = (HttpServletRequest)request;//把参数request强制转换为HttpServletRequest对象
//输出提示信息
System.out.println("Filter已经截获到用户的请求的地址: " +hrequest.getServletPath());//打印截获的用户请求的地址

//hrequest.getServletPath()是返回的是项目名到当前jsp文件的路径(意思就是在这个项目首页到文件的路径)
//Filter只是链式处理,请求依然放行到目的地址
chain.doFilter(request, response);//调用下一个filter,filter链式处理用户请求和应答
//---------下面代码用于对服务器响应执行后处理---------
long after = System.currentTimeMillis();//是获得当前时间距离1970-1-1 00:00:00经过的毫秒数
//输出提示信息
System.out.println("过滤结束");
//输出提示信息
System.out.println("请求被定位到" + hrequest.getRequestURI() +
" 所花的时间为: " + (after - before));//hrequest.getRequestURI()是返回的整个URL的路径请求(意思就是返回的浏览器地址栏的整个地址)
}
}

Filter用户授权的例子:

package com.drp.util.filter; 
 
import java.io.IOException; 
 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
 
public class AuthFilter implements Filter {
 
public void destroy() {
 
}
 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
 
HttpServletRequest request = (HttpServletRequest)servletRequest; 
HttpServletResponse response = (HttpServletResponse)servletResponse;
 
String currentURL = request.getRequestURI(); //取得根目录所对应的绝对路径:
 
String targetURL = currentURL.substring(currentURL.indexOf("/", 1), 
currentURL.length()); //截取到当前文件名用于比较
 
HttpSession session = request.getSession(false); 
 
if (!"/login.jsp".equals(targetURL)) {
//判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
if (session == null || session.getAttribute("user") == null) {
/
}
 
public void init(FilterConfig filterConfig) throws ServletException {
 
}
}
然后在配置文件web.xml里添加:
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.drp.util.filter.AuthFilter</filter-class>
</filter>
 
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>*.jsp</url-pattern>//表示对所有jsp文件有效
</filter-mapping>
在用户没有登录的情况下就会转到登录页面。

二、了解session:

session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session
对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session
对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web
服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session
对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用
Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。

工作原理:

(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

2.1、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 持久性的服务器内存量可能会很大,从而影响了可伸缩性。

三、异步:

容器在部署时会处理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加到上下文中了。

Java EE开发技术课程第三周的更多相关文章

  1. Java EE开发技术课程第五周(Applet程序组件与AJAX技术)

    1.Applet程序组件 1.1.定义: Applet是采用Java编程语言编写的小应用程序,该程序可以包含在HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同.含有Apple ...

  2. Java EE开发技术课程第六周(jsf、facelets)

    1.jsf(java sever faces) 1.1 jsf的定义: jsf是一种用于构建java web应用程序的框架.它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器 ...

  3. Java EE开发技术课程第七周(json)

    JSON: https://baike.baidu.com/item/JSON/2462549?fr=aladdin JSON指JavaScript对象表示法(JavaScript Object No ...

  4. Java EE开发技术课程

    新的学期开始了,j2e已经上了两节课,接下来就是对该课程的一些作业以及相关的认识: 一.课程目标: Java EE是java的企业级应用,所以在我看来在学习这门课程之前肯定要对java有一个具体的认识 ...

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

    一.分析Filter例子(轻量级javaee企业应用实战p132) // 执行过滤的核心方法 public void doFilter(ServletRequest request, ServletR ...

  6. 《Java EE 开发技术与案例教程》 这是一本好书啊:简洁精辟(相见恨晚)

    第一章:Java EE 概述 1.get:JPA:Java Persistence API, 数据持久化API: JPA是一种ORM规范,它的实现实例:Hibernate.mybatis 2.Web ...

  7. j2ee高级开发技术课程第五周

    pplet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程序. 如下所示是独立的 J ...

  8. j2ee高级开发技术课程第六周

    一.jsf(java server faces)的运行原理(工作方式) 1.jsf应用是事件驱动的,当一个事件发生时(比如用户单击一个按钮),事件通知通过HTTP发往服务器,服务器端使用叫做Faces ...

  9. j2ee高级开发技术课程第八周

    介绍一. hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢? 因 ...

随机推荐

  1. Django中Q搜索的简单应用

    本节涉及: 1.Q搜索在前后端的设计 2.Django中Queryset对象的序列化(由后端扔给前端的数据必然会经过序列化) 3.前端动态地构造表格以便显示(动态创建DOM对象) 思路: 用户通过前端 ...

  2. Java for Android 学习第一周

    前言 专业Java程序员所必需掌握的3个主题: 1. Java编程语言 2. 使用Java的面向对象编程(OOP) 3. Java核心库 JDK.JRE和JVM 1. javac编译java源代码为字 ...

  3. [LeetCode] Binary Search 二分搜索法

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...

  4. Java根据链接生成二维码

    Java根据链接生成二维码 相关 jar 包: core-3.1.0.jar 源码及 jar 包下载:http://files.cnblogs.com/files/liaolongjun/qrcode ...

  5. c++库函数 Map

    转载:https://blog.csdn.net/shuzfan/article/details/53115922 C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第 ...

  6. [daily] emacs显示file name buffer的全路径

    在用emacs看代码的时候,在文件间跳来跳去,如果工程太大的话,很可能会有重名文件,这个时候, 你就不知道自己在什么的地方了.需要一个查看当前正在编辑区的文件的名字的方法. emacs在这个地方,存储 ...

  7. mayan游戏

    这道题超级好 就是我太菜了写了几个小时不算是debug了几个小时. 我只想出了几个小剪枝 可能是状态不太好吧 写完这道题真的是完美诠释了什么,叫做: 暴力出奇迹!!! 真的是太暴力了. 最多只移动5步 ...

  8. 【转】tars源码漫谈第1篇------tc_loki.h (牛逼哄哄的loki库)

    loki库是C++模板大牛Andrei写的, 里面大量运用模板的特性, 而tc_loki.h借用了loki库的部分代码, 形成了一个基本的文件tc_loki.h, 来看看: #ifndef __TC_ ...

  9. tomcat之性能优化

    tomcat是我们常用的web容器,它的性能高低直接影响到应用对外提供服务的能力和用户的体验,所以tomcat的优化至关重要.对于单台tomcat服务器而言,优化主要是两方面:内存优化和配置优化(例如 ...

  10. 在python项目中导出项目依赖的模块信息

    1.安装pipreqs pip install pipreqs 2.导出requriements.txt文件 在windows中,终端切换到项目所在的文件夹下: 运行: pipreqs ./ 如果遇到 ...