Cookie概念
cookie是在浏览器访问web服务器某个资源时,由web服务器在Http响应消息头中附带传送浏览器的一小部分数据
一但web服务器保存了某个web,那么每次访问这个服务器,都要在http请求头中吧这个cookie回传到web服务器中
一个Cookie主要由组成它的名称(name)和值(value)组成
创建cookie
//创建Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/webs");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0浏览器关闭;<0内存存储,默认-1
response.addCookie(ck);//添加到response对象中,响应时发送给客户端
//注意:有效路径: 当前访问资源的上一级目录,不带主机名
获取Cookie
//获取所有的Cookie
Cookie[] cks=request.getCookies();
//遍历Cookie
for(Cookie ck:cks){
//检索出自己的Cookie
if(ck.getName().equals("code"))
{
//记录Cookie的值
code=ck.getValue();
break;
}
}
修改Cookie
只需要保证cookie的名和路径一致就能修改
//修改Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/webs");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
response.addCookie(ck);//让浏览器添加Cookie
Cookie编码与解码
Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
编码可以使用java.net.URLEncoder类的endode(String str,String encoding)方法
解码可以使用java.net.URLDecoder类的decode(String str,String encoding)方法
创建带中文的Cookie
// 使用中文的 Cookie. name 与 value 都使用 UTF-8 编码.
Cookie cookie = new Cookie(
URLEncoder.encode("姓名", "UTF-8"),
URLEncoder.encode("老邢", "UTF-8"));
// 发送到客户端
response.addCookie(cookie);
读取带中文的Cookie
if(request.getCookies() != null){
for(Cookie cc : request.getCookies()){
String cookieName = URLDecoder.decode(cc.getName(), "UTF-8");
String cookieValue = URLDecoder.decode(cc.getValue(), "UTF-8");
out.println(cookieName + "=");
out.println(cookieValue + "; <br/>");
}
}
else{
out.println("Cookie 已经写入客户端. 请刷新页面. ");
}
Cookie的优缺点
优点:
可以配置到期规则
简单性:Cookie是一种基于文本的轻量架构,包含简单的键值对
数据持久性:Cookie在默认过期时间前,是可以一直储存在客户端浏览器上的
缺点
大小受限制:大多数浏览器对Cookie的大小有4K,8K的字节限制
用户配置为禁用:有些用户禁用了浏览器或客户端接收Cookie的能力,因此限制了功能
潜在的安全风险:Cookie可能会被篡改,会对安全性造成潜在的危险或者导致依赖Cookie的程序失败
Session对象
Session概述
Session用来记录用户的状态,Session是指单个时间内客户端与web服务器一连串相关交互的过程
在一个Session中客户可能多次请求访问一个资源,也有可能请求访问各种不同的服务器资源
Session原理
服务器会为每一次会话分配一个Session对象
同一个浏览器发送多次请求,统一属于一次会话(Session)
首次使用到Session是,服务器会自动创建Session并创建Cookie储存Session返回客户端
Session使用
Session作用域:拥有储存数据的空间,作用范围是一次会话
一次会话是指同一浏览器发送多次请求,一但浏览器关闭,会话结束
可以将数据储存在Session中,在一次会话的任意位置进行获取
` 可传递数据类型(基本数据类型,集合,对象,数组)
获取Session
Session是由服务器端自动创建,通过request对象获取
//获取Session对象
HttpSession session=request.getSession();
System.out.println("Id:"+session.getId());//唯一标记,
Session保存数据
setAttribute(属性名,Object)保存数据到Session中
session.setAttribute("key",value);//以键值对形式存储在session作用域中。
Session获取数据
getAttribute(属性名)获取Session中的数据
session.getAttribute("key");//通过String类型的key访问Object类型的value
Session移除数据
removeAttribute(属性名)从Session中删除数据
session.removeAttribute("key");//通过键移除session作用域中的值
Session与Request的区别
request是一次请求有效,请求改变,则request改变
session是一次会话有效,浏览器改变,则session改变
Session的生命周期
开始:第一次用到Session请求产生,就创建Session
结束:
浏览器关闭就失效
Session超时就失效
Session.setMaxlnacterval(seconds)//设置最大有效时间(单位:秒)
手动销毁则失效
session.invaldate()//登录退出,注销
Session失效
session.setMaxInactiveInterval(60*60);//设置session最大有效期为一小时
session.invalidate();//手工销毁
ServletContext对象
概述
全局对象,也拥有作用域,对应一个tomcat中的web应用
在web服务器启动的时候,会为每个web应用程序创建一块共享的储存区域(ServletContext)
ServletContext在服务器启动的时候创建,在关闭的时候销毁
获取ServletContext对象
GenericServlet提供了getServletContext方法(推荐)this.getServeltContext()
HttpServletRequest提供了getServletContext()方法(推荐)
HttpSession提供了getServletContext()方法
ServletContextr作用
获取项目真实路径
String realpath=servletContext.getRealPath("/");
获取项目上下文路径
System.out.println(servletContext.getContextPath());//上下文路径(应用程序名称)
System.out.println(request.getContextPath());
全局容器
ServletContext拥有作用域,可以储存数据到全局容器中
储存数据:servletContext.setAttribute("name",value);
获取数据:servletContext.getAttribute("name")
移除数据:servletContext.removeAttribute("name")
ServletContext特点:
唯一性:一个应用对应一个ServletContext
生命周期:只要容器不关闭或者应用程序不卸载,ServletContext就一直存在
作用域总结
HttpServletRequest:一次请求,请求响应之前有效
HttpSession:一次会话开始,浏览器不关闭或者不超时之前有效
ServletContext:服务器启动和服务器关闭之前有效
监听器(Listener)
监听器用于监听一下重要事件,监听器对象可以在事件发生之前,之后做出相应的处理
常用的三个监听器
application: ServletContextListener(服务器启动关闭事件监听)*
request: ServletRequestListener (请求访问的监听事件)
session: HttpSessionListener(session启动关闭事件监听)
过滤器
过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术
过滤器作用
执行地位在Servlet之前.,客户端发送请求是,会先经过Filter,在到达目标Servlet中:响应时,会根据执行流程再次反向执行Filter
可以解决多个Servlet共性代码的冗余问题,例如(乱码处理,登录验证)
编写过滤器
Servlet API提供了一个Filter接口,开发人员编写一个java类实现这个接口即可,这个java类被称为过滤器
实现过程
编写java类实现Filter接口
在doFilter方法中编写拦截逻辑
设置拦截路径
过滤器配置
注解配置:在自定义的Filter类上使用注解WebFilter(value=“/过滤目标资源”)
xml配置
<!--过滤器的xml配置 -->
<filter>
<!--名称-->
<filter-name>sf</filter-name>
<!--过滤器类全称-->
<filter-class>com.qf.web.filter.SecondFilter</filter-class>
</filter>
<!--映射路径配置-->
<filter-mapping>
<!--名称-->
<filter-name>sf</filter-name>
<!--过滤的url匹配规则和Servlet类似-->
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器路径
过滤器的过滤路径通常有三种形式:
精确过滤匹配 ,比如/index.jsp /myservlet1
后缀过滤匹配,比如*.jsp、*.html、*.jpg
通配符过滤匹配/*,表示拦截所有。注意过滤器不能使用/匹配。
/aaa/bbb/* 允许
过滤器链和优先级
过滤链
客户端对服务器请求之后,服务器在调用Servlet之前执行一组过滤器,这一组过滤器就叫做过滤器链
每个过滤器实现某个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
过滤器优先级
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来可以叫做Filter链接
优先级
如果为注解的话,是按照类全名称的字符串顺序决定作用顺序
如果实web.xml,安装filter-mapping注册顺序,从上往下
web.xml配置高于注解
如果注解和xml配置同时配置,会创建多个过滤器对象,造成过滤多次