服务器为了保存用户状态而创建的一个特殊的对象。
当浏览器第一次访问服务器时,服务器创建一个session对象(该
对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId
以cookie的方式发送给浏览器。
当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据
sessionId就可以找到对应的session对象。
在 无连接(HTTP)协议基础之上实现用户状态管理。
注:
HttpSession是一个接口。
当flag为true时:
先查看请求当中是否有sessionId,如果没有,
则创建一个session对象。如果有,则依据sessionId
查找对应的session对象,如果找到了,则返回该
对象,如果找不到,创建一个新的session对象。
当flag为false时:
先查找请求当中是否有sessionId,如果没有,
返回null。如果有,则依据sessionId查找对应的session
对象,如果找到了,则返回该对象,如果找不到,返回
null。
等价于 request.getSession(true);
绑订数据:
session.setAttribute(String name,Object obj);
依据绑订名获得绑订值:
Object session.getAttribute(String name);
注:如果绑订名对应的值不存在,返回null。
解除绑订:
session.removeAttribute(String name);
利用这组方法共享一次会话期间相关的数据。
为了避免Session中存储的数据过大,Session需要销毁:
1. 从用户最后一次访问网站开始,超过一定时间后,服务器自动销毁Session,以及保存在Session中的数据。
2. Tomcat 服务器默认的Session超时时间是30分钟
3. 可以利用web.xml设置超时时间单位是分钟,设置为0表示不销毁。
<session-config>
<session-timeout>20</session-timeout>
</session-config>
session.invalidate()
案例:销毁Servlet
public class DeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
session.invalidate();
response.setContentType(
"text/html; charset=utf-8");
response.getWriter().println("呵呵!");
}
}
Servlet 标准中定义了过滤器,可以拦截任意的服务器请求和响应。
实现过滤器的步骤:
重写(实现)全部抽象方法
业务逻辑写到 doFilter中
如果在doFilter中调用了 chain.doFilter方法则处理后续逻辑,如果不执行这个方法,表示对后续逻辑的拦截。
可以配置多个filter-mapping,这样可以复用同一个Filter
可以使用 *.png 或者 /* 过滤一组url
当有多个过滤器过滤统一个资源时候,按照配置的先后执行。
<filter>
<filter-name>demo</filter-name>
<filter-class>web.DemoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/img.png</url-pattern>
</filter-mapping>
比如需要使用 request.getSession() 方法:
HttpServletRequest req = (HttpServletRequest)request;
HttpSession session = req.getSession();
<init-param>
<param-name>start</param-name>
<param-value>8</param-value>
</init-param>
<init-param>
<param-name>end</param-name>
<param-value>17</param-value>
</init-param>
config.getInitParamter("start");
config.getInitParamter("end");
1. 在Web容器启动时候创建Filter对象,Filter对象是单例的(只创建一个Filter对象)!
2. 创建以后,立即执行init()方法,只执行一次
3. 在有url请求时候,会执行匹配的doFilter(),doFilter()是并发执行的。
4. Filter对象在容器关闭时候销毁,销毁时候执行destroy()
基本过滤器步骤:
编写过滤器类:
/**
* 过滤器 Hello World!
*/
public class DemoFilter implements Filter {
public void init(FilterConfig cfg) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest req,
ServletResponse res, FilterChain chain)
throws IOException, ServletException {
req.setAttribute("test", "试试");
System.out.println("Hello World!");
//处理后续请求:如果执行doFilter就正常处理后续
//Web请求和响应,如果不执行doFilter就意味着
//不处理后续请求和响应(也就是请求被拦截了!)
chain.doFilter(req, res);
}
}
配置web.xml:
<filter>
<filter-name>demo</filter-name>
<filter-class>web.DemoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/img.png</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/test.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>*.png</url-pattern>
</filter-mapping>
测试
多个过滤可以连接使用:
编写Servlet
/**
* 演示过滤器执行顺序
*/
public class TestFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String test =
(String)request.getAttribute("test");
System.out.println("Test Filter:"+test);
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
配置web.xml:
<filter>
<display-name>TestFilter</display-name>
<filter-name>TestFilter</filter-name>
<filter-class>web.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>*.png</url-pattern>
</filter-mapping>
测试
利用过滤器限制图片的访问:
编写过滤器
public class ImageFilter implements Filter {
private int start, end;
public void destroy() {
System.out.println("我还会回来的!");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//获取当前的时间
Calendar cal = Calendar.getInstance();
//获取小时分量
int hour = cal.get(Calendar.HOUR_OF_DAY);
//在start到下午end之前,可以看见图片
if(hour>start && hour<end) {
chain.doFilter(request, response);
}else {
response.setContentType(
"text/html; charset=UTF-8");
response.getWriter().println("系统繁忙!");
}
}
public void init(FilterConfig fConfig) throws ServletException {
//读取web.xml文件中的配置参数
String s1=fConfig.getInitParameter("start");
String s2=fConfig.getInitParameter("end");
start = Integer.parseInt(s1);
end = Integer.parseInt(s2);
System.out.println(start+","+end);
}
}
配置 web.xml
<filter>
<display-name>ImageFilter</display-name>
<filter-name>ImageFilter</filter-name>
<filter-class>web.ImageFilter</filter-class>
<init-param>
<param-name>start</param-name>
<param-value>8</param-value>
</init-param>
<init-param>
<param-name>end</param-name>
<param-value>17</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ImageFilter</filter-name>
<url-pattern>*.png</url-pattern>
</filter-mapping>
测试
在Web容器的工作时候,在出现特定情况下,会自动的执行用户定义的监听器程序。利用监听器程序,可以将用户程序嵌入到Web容器中工作。
特定情况包括:
如使用: HttpSessionListener
案例:
/**
* 监听器演示案例
*/
public class DemoListener
implements HttpSessionListener {
//在Session对象创建以后执行
public void sessionCreated(HttpSessionEvent e) {
System.out.println("Hello Session Created");
//e 代表当前事件发生时候的相关数据。
HttpSession s = e.getSession();
System.out.println("SID:"+s.getId());
}
//在Session对象销毁以后执行
public void sessionDestroyed(HttpSessionEvent e) {
System.out.println("Hello Session Destroyed");
}
}
<listener>
<listener-class>web.DemoListener</listener-class>
</listener>
如上功能的意义:在session创建销毁时候插入用户自定义的代码。
最重要的监听器:ServletContextListener
案例:
public class InitListener implements ServletContextListener {
//在web服务器关闭时候执行
public void contextDestroyed(ServletContextEvent e) {
System.out.println("Hello contextDestroyed");
}
//在web服务器启动时候执行,用于初始化资源
public void contextInitialized(ServletContextEvent e) {
System.out.println("Hello contextInitialized");
}
}
<listener>
<listener-class>web.InitListener</listener-class>
</listener>