📄 11. servlet note.txt
字号:
如果有,则根据sessionId检索出session并处理;如果没有,则创建一个session,并绑定一个不重复的sessionId。
1)基本特点
状态信息保存在服务器端。这意味着安全性更高
通过类似与Hashtable的数据结构来保存
能支持任何类型的对象(session中可含有多个对象)
2)保存会话id的技术(1)
Cookie
这是默认的方式,在客户端与服务器端传递JSeesionId
缺点:客户端可能禁用Cookie
表单隐藏字段
在被传递回客户端之前,在 form 里面加入一个hidden域,设置JSeesionId:
<input type=hidden name=jsessionid value="3948E432F90932A549D34532EE2394" />
URL重写
直接在URL后附加上session id的信息
HttpServletResponse对象中,提供了如下的方法:
encodeURL(url); //url为相对路径
5. SESSION编程
1)HttpSession接口
Servlet API定义了接口:javax.servlet.http.HttpSession, Servlet容器必须实现它,用以跟踪状态。
当浏览器与Servlet容器建立一个http会话时,容器就会通过此接口自动产生一个HttpSession对象
2)获取Session
HttpServletRequest对象获取session,返回HttpSession:
request.getSession(); //表示如果session对象不存在,就创建一个新的会话
request.getSession(true); //等价于上面这句;如果session对象不存在,就创建一个新的会话
request.getSession(false); //表示如果session对象不存在就返回 null,不会创建新的会话对象
3)Session存取信息
session.setAttribute(String name,Object o) //往session中保存信息
Object session.getAttribute(String name) //从session对象中根据名字获取信息
4)设置Session的有效时间
public void setMaxInactiveInterval(int interval)
设置最大非活动时间间隔,单位秒;
如果参数interval是负值,表示永不过时。零则是不支持session。
通过配置web.xml来设置会话超时,单位是分钟
<seesion-config>
<session-timeout>1</session-timeout>
</session-config>
允许两种方式并存,但前者优先级更高
5)其他常用的API
HttpSession.invalidate() //手工销毁Session
boolean HttpSession.isNew() //判断Session是否新建
如果是true,表示服务器已经创建了该session,但客户端还没有加入(还没有建立会话的握手)
HttpSession.getId() //获取session的id
6. 两种状态跟踪机制的比较
Cookie Session
保持在客户端 保存在服务器端
只能保持字符串对象 支持各种类型对象
通过过期时间值区分Cookie的类型 需要sessionid来维护与客户端的通信
会话Cookie——负数 Cookie(默认)
普通Cookie——正数 表单隐藏字段
不支持Cookie——0 url重写
7. RequestDispatcher.forward(req, resp); vs. HttpServletResponse.sendRedirect("url"); 请求分发器 rd.forward(req, resp); 只能访问内部资源。浏览器地址不变。针对同一个请求。 可获取表单传递过来的信息req.getParameter("name"); 应用内部数据共享的方式 req.getAttribute("name"); 重定向 resp.sendRedirect("url"); 可以跨网站访问资源。浏览器地址会改变。变成另外的一个请求。
8. 相对路径 与 绝对路径 1)形式: 绝对路径:以/开头的路径 相对路径:不是以/开头的路径 2)绝对路径: 运行在客户端时:请求的参考点是站点(站台)本身;即是 http://localhost:8080/ 如: <form action="/WebTest/login" ...> ... 路径等于 http://localhost:8080/WebTest/login 运行在服务器时:请求相对于应用的根 http://localhost:8080/工程/ web.xml, servlet, jsp... 这些都是运行在服务器端 如:RequestDispatcher rd = request.getRequestDispatcher(url); //相对路径,也可以绝对路径 RequestDispatcher rd = servletcontext.getRequestDispatcher(url); //只能绝对路径 3)相对路径: 运行在客户端时:请求的参考点是应用的当前路径;即是页面所在的目录 http://localhost:8080/工程/页面所在目录/ 主要用在两处: 一是表单中的 action="..." 如: <form action="login" ...> ... 路径等于 http://localhost:8080/工程/页面当前目录/login 二是在重定向中用 resp.SendRedirect("logon/er.html"); 路径等于 http://localhost:8080/工程/页面当前目录/logon/er.html
运行在服务器时:都是相对于应用的当前路径;可认为是直接在当前url后面加上相对路径 如: rd.forward("target");
9. 范围对象 context > session > request > config 对比HttpSession、HttpServletRequest、ServletContext、ServletConfig的作用范围 1)ServletConfig:在一个Servlet实例化后,就创建了一个ServletConfig对象。 主要用来读取web.xml中配置的Servlet初始信息,不能被其他Servlet共享。
作用范围:处于同一个Servlet中,均起作用。 2)HttpServletRequest:这是由Web容器对客户Http请求数据封装而成的对象,可通过它获得所有跟客户请求相关的信息。 比如Http请求方法(Get or Post)。 注意:request是可以跨Servlet的。
作用范围:只要处于同一个请求中,均起作用。 3)HttpSession: 当浏览器与Servlet容器建立一个Http会话时,容器就会通过此接口自动产生一个HttpSession对象。
作用范围:处于同一个会话中,均起作用。(用JsessionId标识同一个会话) 4)ServletContext:对同一个Web应用中的任何Servlet,在任何时候都有效,是一个全局的对象。
作用范围:处于同一个Web应用中,均起作用。(不同的session和请求都可用)
Day5 一、 过滤器 Filter
1. why Filter?
针对通用WEB服务、功能,透明的处理2. 什么是 Servlet Filter? 过滤是 Servlet 2.3 版才引入的新特性。过滤器可以认为是实现 Http 请求、响应以及头信息等内容的传送的代码片断。 过滤器并不能创建响应,但它可以“过滤”传给 servlet 的请求,还可以“过滤”从 servlet发送到客户端的响应; 它不仅能处理静态内容,还可以处理动态内容。换而言之,filter 其实是一个“servlet chaining”(servlet 链)。 一个 filter 包括: 1) 在 servlet 被调用之前截获; 2) 在 servlet 被调用之前检查 servlet request; 3) 根据需要修改 request 头和 request 数据; 4) 根据需要修改 response 头和 response 数据; 5) 在 servlet 被调用之后截获.3. 过滤器的生命周期 Filter 组件的生命周期与 Servlet 的类似。 过滤器有四个阶段(与servlet类似):
1) 实例化;
2) 初始化(调用init()方法);
3) 过滤(调用doFilter()方法);
4) 销毁(调用destroy()方法);
4. Filter编程
1)定义Filter(implements Filter)
2)配置Filter
配置对哪些资源进行过滤(url)
<filter>
<filter-name>Logger</filter-name> //过滤器名
<filter-class>com.LoggerFilter</filter-class> //具体过滤器类
<init-param> //初始化参数
<param-name>xsltfile</param-name>
<param-value>/xsl/stockquotes.xsl</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Logger</filter-name>
<url-pattern>/*</url-pattern> //将过滤器应用于Web应用中的每个Web资源;可以只指定某个资源
</filter-mapping>
5. FilterChain
1) chain是如何配置,顺序 当同一个应用中配置了多个 filter 时,其执行顺序是如何的呢? 答:按 web.xml 中<filter-mapping>的顺序来执行的
2) chain.doFilter(req, resp) 调用下一个Filter,到最后一个Filter则正式调用 TargetServlet
3) 调用过程(类似于递归调用)
6. Filter的类型 Filter 有4种类型,主要体现在<filter-mapping>中的<dispatcher>属性: <dispatcher>REQUEST</dispatcher> 默认,客户端的直接的请求,才触发该过滤器 <dispatcher>FORWARD</dispatcher> servlet 调用 rd.forward(req,resp)时触发 <dispatcher>INCLUDE</dispatcher> servlet 调用 rd.include(req,resp)时触发 <dispatcher>ERROR</dispatcher> 发生错误,跳转到错误页面时触发
二、监听器 Listener Listener 是 Servlet 的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作。 如:监听在线的用户数量。当增加一个session时,就激发sessionCreated(HttpSessionEvent se),给在线人数加11. 监听器的种类 一共分三大类型,有 8 种 listener: a.监听 servlet context 1)生命周期事件 接口: javax.servlet.ServletContextListener 内容: servlet 上下文已经被创建,并且可以用来向其第一个请求提供服务,或者 servlet 上下文即将关闭 2)属性的改变 接口: javax.servlet.ServletContextAttributeListener 内容: 在 servlet 上下文中,增加、删除或者替换属性 b.监听 servlet session 1)生命周期事件 接口: javax.servlet.http.HttpSessionListener 内容: 对一个 HttpSession 对象进行创建、失效处理或者超时处理 2)属性改变 接口: javax.servlet.http.HttpSessionAttributeListener 内容: 在 servlet 会话中,增加、删除或者替换属性 3)会话迁移 接口: javax.servlet.http.HttpSessionActivationListener 内容: HttpSession 被激活或者钝化 4)对象绑定 接口: javax.servlet.http.HttpSessionBindingListener 内容: 对 HttpSession 中的对象进行绑定或者解除绑定 c.监听 servlet request 1)生命周期 接口: javax.servlet.ServletRequestListener 内容: 一个 servlet 请求开始由 web 组件处理 2)属性改变 接口: javax.servlet.ServletRequestAttributeListener 内容: 在 ServletRequest 中,增加、删除或者替换属性
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -