会话:
会话管理:Cookie和Session配合解决
-
cookie是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息
-
session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息
-
cookie和session配合记录请求状态
cookie:
一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。
-
服务端创建cookie,将cookie放入响应对象中,Tomcat容器将cookie转化为set-cookie响应头,响应给客户端
-
客户端在收到cookie的响应头时,在下次请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookie
-
cookie是一种键值对格式的数据,从tomcat8.5开始可以保存中文,但是不推荐
-
由于cookie是存储于客户端的数据,比较容易暴露,一般不存储一些敏感或者影响安全的数据
// 创建Cookie
Cookie cookie1 =new Cookie("key","value");
// 将cookie放入响应对象
resp.addCookie(cookie1);
//获取请求中的cookie
Cookie[] cookies = req.getCookies();
//迭代cookies数组
if (null != cookies && cookies.length!= 0) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
cookie时效性:
-
会话级Cookie
-
服务器端并没有明确指定Cookie的存在时间
-
在浏览器端,Cookie数据存在于内存中
-
只要浏览器还开着,Cookie数据就一直都在
-
浏览器关闭,内存中的Cookie数据就会被释放
-
-
持久化Cookie
-
服务器端明确设置了Cookie的存在时间
-
在浏览器端,Cookie数据会被保存到硬盘上
-
Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
-
持久化Cookie到达了预设的时间会被释放
-
-
cookie.setMaxAge(int expiry)参数单位是秒,表示cookie的持久化时间,如果设置参数为0,表示将浏览器中保存的该cookie删除
cookie提交路径:cookie的setPath(String path)
session:
HttpSession是一种保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间,即session对象. 客户端在发送请求时,都可以使用自己的session. 这样服务端就可以通过session来记录某个客户端的状态
-
服务端在为客户端创建session时,会同时将session对象的id,即JSESSIONID以cookie的形式放入响应对象
-
后端创建完session后,客户端会收到一个特殊的cookie,叫做JSESSIONID
-
客户端下一次请求时携带JSESSIONID,后端收到后,根据JSESSIONID找到对应的session对象
-
通过该机制,服务端通过session就可以存储一些专门针对某个客户端的信息
// 获取session对象
HttpSession session = req.getSession();
httpsession时效性:
// 设置最大闲置时间
session.setMaxInactiveInterval(60);
// 直接让session失效
session. Invalidate();
三大域对象:
-
请求域对象是HttpServletRequest ,传递数据的范围是一次请求之内及请求转发
-
会话域对象是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求
-
应用域对象是ServletContext,传递数据的范围是本应用之内,可以跨多个会话
API:
API | 功能 |
---|---|
void setAttribute(String name,String value) | 向域对象中添加/修改数据 |
Object getAttribute(String name); | 从域对象中获取数据 |
removeAttribute(String name); | 移除域对象中的数据 |
过滤器:
API | 目标 |
---|---|
default public void init(FilterConfig filterConfig) | 初始化方法,由容器调用并传入初始配置信息filterConfig对象 |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | 过滤方法,核心方法,过滤请求,决定是否放行,响应之前的其他处理等都在该方法中 |
default public void destroy() | 销毁方法,容器在回收过滤器对象之前调用的方法 |
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 参数父转子
HttpServletRequest request =(HttpServletRequest) servletRequest;
HttpServletResponse response =(HttpServletResponse) servletResponse;
// 放行请求
filterChain.doFilter(request,response);
}
过滤器生命周期:
阶段 | 对应方法 | 执行时机 | 执行次数 |
---|---|---|---|
创建对象 | 构造器 | web应用启动时 | 1 |
初始化方法 | void init(FilterConfig filterConfig) | 构造完毕 | 1 |
过滤请求 | void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) | 每次请求 | 多次 |
销毁 | default void destroy() | web应用关闭时 | 1次 |
过滤器链原理图:
注解方式配置过滤器:
@WebFilter(
filterName = "loggingFilter",
initParams = {@WebInitParam(name="dateTimePattern",value="yyyy-MM-dd HH:mm:ss")},
urlPatterns = {"/servletA","*.html"},//关键
servletNames = {"servletBName"}
)
过滤器的应用:控制登录校验
-eg:未登录状态下不允许访问信息页,进行相关增删改处理,需要重定向到登录页面,登录成功后可以自由访问 ,过滤器针对信息页的请求,查验登录状态(依赖session域进行数据状态的检查)
监听器(接口)-针对域对象事件
-
域对象的创建和销毁监听器 ServletContextListener HttpSessionListener ServletRequestListener
-
域对象数据增删改事件监听器 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener
application域监听器:
ServletContextListener 监听ServletContext对象的创建与销毁
方法名 | 作用 |
---|---|
contextInitialized(ServletContextEvent sce) | ServletContext创建时调用 |
contextDestroyed(ServletContextEvent sce) | ServletContext销毁时调用 |
-
ServletContextEvent对象代表从ServletContext对象身上捕获到的事件,通过这个事件对象可以获取到ServletContext对象。
-
ServletContext application = sce.getServletContext();
ServletContextAttributeListener 监听ServletContext中属性的添加、移除和修改
方法名 | 作用 |
---|---|
attributeAdded(ServletContextAttributeEvent scab) | 向ServletContext中添加属性时调用 |
attributeRemoved(ServletContextAttributeEvent scab) | 从ServletContext中移除属性时调用 |
attributeReplaced(ServletContextAttributeEvent scab) | 当ServletContext中的属性被修改时调用 |
-
ServletContextAttributeEvent对象代表属性变化事件,它包含的方法如下:
方法名 | 作用 |
---|---|
getName() | 获取修改或添加的属性名 |
getValue() | 获取被修改或添加的属性值 |
getServletContext() | 获取ServletContext对象 |
session与request域监听器与上述应用域API基本一致(方法名不同)
ajax:
-
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
-
XMLHttpRequest 只是实现 Ajax 的一种方式。
-
通过运行JS代码发送的请求浏览器可以不用跳转页面 ,可以在JS代码中决定是否要跳转页面
-
通过运行JS代码发送的请求,接收到返回结果后,可以将结果通过dom编程渲染到页面的某些元素上,实现局部更新(BOM编程实现页面跳转)
原生javascript方式 实现ajax请求:
<script>
function loadXMLDoc(){
var xmlhttp=new XMLHttpRequest();
// 设置回调函数处理响应结果
xmlhttp.onreadystatechange=function(){//状态4表示后端作出了响应,状态码200表示正确响应
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var xxx = document.getElementById("xxx").innerHTML=xmlhttp.responseText;;
//dom编程渲染页面
}
}
// 设置请求方式和请求的资源路径
xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
// 发送请求
xmlhttp.send();
}
</script>