request和response
1.1 重定向
特点: 1,重定向是客户端行为。 2,重定向是浏览器做了至少两次的访问请求。 3,重定向浏览器地址改变。 4,重定向两次跳转之间传输的信息会丢失(request范围)。 5,重定向可以指向任何的资源,包括当前应用程序中的其他资源,同一个站点上的其他应用程序中的资源,其他站点 的资源。注意:传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB 站点的根目录
请求转发
1,转发是服务器行为 2,转发是浏览器只做了一次访问请求 3,转发浏览器地址不变 4,转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递 5,转发只能将请求转发给同一个WEB应用中的组件 注意:如果创建RequestDispatcher 对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
ServletResponse简介
定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为 参数传递给 servlet 的 service 方法。 要发送 MIME 正文响应中的二进制数据,请使用 getOutputStream 返回的 ServletOutputStream。要发送字符数据,请使用 getWriter 返回的 PrintWriter 对象。
HttpServletResponse介绍
扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能。例如,该接口拥有访问 HTTP 头和 cookie 的方法。 客户端向服务器发起的都是HTTP协议操作,所以我们大部分使用HttpServletResponse对 象作为直接操作对象!
HttpServletRequest介绍
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所 有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
同响应相同,客户端请求协议都是基于HTTP所以我们选用HttpServletRequest来操作用户发送过来 的请求的数据!
HttpServletRequest常用API
URL :Uniform Resource Location (统一资源定位符) 网址
URI :Uniform Resource Identifier (统一资源标识符) URI包含URL
//获取请求路径相关参数 **
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名 getMethod得到客户机请求方式
封装请求参数
第一种方式:使用getParameter获取
使用Apache BeanUtils进行快速映射
BeanUtils.populate(bean2, request.getParameterMap());
总 结
1页面跳转
重定向
1,重定向是客户端行为。
2,重定向是浏览器做了至少两次的访问请求。
3,重定向浏览器地址改变。
4,重定向两次跳转之间传输的信息会丢失(request范围)。
5,重定向可以指向任何的资源,包括当前应用程序中的其他资源,同一个站点上的其他应用程序中 的资源,其他站点的资源。注意:传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头, 它是相对于整个WEB站点的根目录
response.sendRedirect("");
转发
1,转发是服务器行为
2,转发是浏览器只做了一次访问请求
3,转发浏览器地址不变
4,转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递
5,转发只能将请求转发给同一个WEB应用中的组件 注意:如果创建RequestDispatcher 对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根 目录。
request.getRequestDispatcher("").forward(request,response);
2 response对象
ServletResponse
setCharacterEncoding();
setConentType();
HttpServletResponse extends ServletResponse
addCookie();
addHeader();
3 request对象
ServletRequest
setChracterEncoding();
getRequestURL();
getRequestURI();
HttpServletRequest
getHeader()
getParameter();
Cookie是浏览器的一片存储区域,可以以key-value的形式来存储一些值
Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一片数据,WEB服务器传送给各个客户端浏览器的数据是可以各不相同的
一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都应在HTTP请求头中将这个Cookie回传给WEB服务器。
WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
创建Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
response.addCookie(ck);//让浏览器添加Cookie
Cookie的优缺点
优点:
可配置到期规则 Cookie 可以在浏览器会话结束时到期,或者可以在客户端计算机上无限期存在,这取决于客户端的到期规则。不需要任何服务器资源 Cookie 存储在客户端并在发送后由服务器读取。简单性 Cookie 是一种基于文本的轻量结构,包含简单的键值对。数据持久性 虽然客户端计算机上 Cookie 的持续时间取决于客户端上的 Cookie 过期处理和用户干预,Cookie 通常是客户端上持续时间最长的数据保留形式
缺点:
大小受到限制 大多数浏览器对 Cookie 的大小有 4096 字节的限制,尽管在当今新的浏览器和客户端设备版本中,支持 8192 字节的 Cookie 大小已愈发常见。用户配置为禁用 有些用户禁用了浏览器或客户端设备接收 Cookie 的能力,因此限制了这一功能。潜在的安全风险 Cookie 可能会被篡改。用户可能会操纵其计算机上的 Cookie,这意味着会对安全性造成潜在风险或者导致依赖于 Cookie 的应用程序失败。另外,虽然 Cookie 只能被将它们发送到客户端的域访问,历史上黑客已经发现从用户计算机上的其他域访问 Cookie 的方法。您可以手动加密和解密 Cookie,但这需要额外的编码,并且因为加密和解密需要耗费一定的时间而影响应用程序的性能
自动登录
/从session中获取登录标志
Object obj = req.getSession().getAttribute("login");
//如果登录标志存在,说明用户已经登录过了
if(obj!=null){
req.getRequestDispatcher("/WEB-INF/pages/userinfo.html").forward(req,resp);
}else{
//做自动登录
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("autologin".equals(name)){
String value = cookie.getValue();
String[] strs = value.split("=");
if(Message.users.containsKey(strs[0])&&Message.users.get(strs[0]).equals(strs[1])){
req.getSession().setAttribute("login",true);
req.getRequestDispatcher("/WEB-INF/pages/userinfo.html").forward(req,resp);
return;
}
}
}
Session
定义
Session可以让服务器确认多个请求是否来自于同一个浏览器
Session用于跟踪客户的状态
Session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。在一个Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源
session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程
session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现
获取Session
HttpSession session=request.getSession();
存储和删除Session中的值
使用HttpSession的setAttrobute(属性名,Object)方法
获取HttpSession的getAttribute(属性名)
删除HttpSession的removeAttribute(属性名)
Session超时
我们不能无时间限制的存储session,这样做是不安全的
HttpSession的最后一程访问时间和当前时间的差距大于了指定的最大空闲时间,这时服务器就会销毁Session对象。默认的空闲时间为30分钟
几种超时情况
超过了设置的超时时间
主动调用了invalidate方法
服务器主动或异常关闭
注意:浏览器关闭并不会让Session失效
总结:
Session
可以被同一个浏览器发出的多个请求共享
增删改查 设置超时时间 销毁session
超时时间 : Java代码直接 > 项目的web.xml中配置 > tomcat的web.xml中配置(config)
是根据浏览器发送来的JSESSIONID的cookie来验证的
登录状态保持案例
Cookie
浏览器的一个存储技术,可以让浏览器帮助我们存储一些少量的数据
组成 : name value path maxAge
name和path相同才认定为重复
url匹配的cookie才会发送到服务器
maxAge :
负数 内存存储, 浏览器关闭之后, 消失
0 立即消失
正数 表示具体的时间, 单位是秒
过滤器
定义
过滤器会在请求到达实际指向目标的时候先截获到请求, 并且在请求离开目标后再次截获请求
在截获请求之后,我们可以对请求中的内容作出修改,甚至拒绝请求
Filter是Servlet技术的核心内容, 我们可以利用其完成权限控制,过滤请求, 压缩数据等等
public class MyFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//拦截前
chain.doFilter(request, response);
//拦截后
}
}
指定Filter的拦截范围
配置式
myfilter
com.qianfeng.user.MyFilter
myfilter
/*
注解式
@WebFilter("/*")
public class MyFilter implements Filter{}
过滤器链
通常客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。
每个过滤器实现某个特定的功能,一个过滤器检测多个Servlet。(匹配几个,检测几个)。
一组过滤器中的执行顺序与
多过滤器下的优先级
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter。原因 : tomcat 读取web.xml时,是从上往下读取的, 没读取一个就包裹成Java对象存入有序集合中
FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源
如果为注解的话,是按照类名的字符串顺序进行起作用的
监听器
定义
监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等
配置
注解式 : @WebServlet
配置式
com.qf.web.listener.RequestLeftListener
常用的监听器
ServletContextListener : 监听ServletContext生命周期
初始化:contextInitialized
销毁:contextDestroyed
ServletContextAttributeListener : 监听ServletContext属性内容变化
attributeAdded:监听属性的添加
attributeRemoved:监听属性的移除
attributeReplaced:监听属性的修改
HttpSessionListener : 监听Session生命周期
sessionCreated:监听Session对象的创建
sessionDestroyed:监听Session对象的销毁
HttpSessionAttributeListener : 监听Session属性内容变化
attributeAdded:监听属性的添加
attributeRemoved:监听属性的移除
attributeReplaced:监听属性的修改
HttpSessionActivationListener : 监听服务器的Session的钝化和活化
sessionWillPassivate:监听Session内部存储对象的钝化-存储
sessionDidActivate:监听Session内部存储对象的活化---读取
对应类需要实现序列化接口Serializable
HttpSessionBindingListener : 监听Session中对象的添加和移除(针对某个对象)
valueBound:监听对象的绑定
valueUnbound:监听对象的解除绑定
HttpSessionIdListener : 监听HttpSession的id的变化
sessionIdChanged:监听HttpSession的id的变化
ServletRequestListener : 监听request对象的初始化和销毁
requestInitialized:监听request对象的初始化
requestDestroyed:监听request对象的销毁
ServletRequestAttributeListener
attributeAdded:监听属性的添加
attributeRemoved:监听属性的移除
attributeReplaced:监听属性的修改
AsyncListener : 监听异步请求
onStartAsync:监听异步开始
onTimeout:监听超时
onError:监听异步的错误信息
onComplete:监听异步的完成
总结
过滤器
所有的请求在到达目的之前, 要先经过过滤器, 请求返回时, 在到达客户端之前, 还要经过滤器
将多个servlet中的相同代码提取出来, 放到监听器中, 以便于提高代码的复用性
配置方式
配置文件式(web.xml)
注解式 (@WebFilter("拦截范围")) wxml
多个过滤器的顺序问题
配置文件式 : 从上往下, 先配置的先执行
注解式 : 类名自然顺序
url注意事项
/范围
*.后缀名
Listener
监测
当系统中对应的动作执行时, 相应的监听器中的相应方法就会执行
优点 : 非侵入式检测