request和response 、Cookie、 Session、Filter和Listener

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的拦截范围

配置式

<filter>

<filter-name>myfilter</filter-name>

<filter-class>com.qianfeng.user.MyFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

@WebFilter("/*")

public class MyFilter implements Filter{}

过滤器链

通常客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。

每个过滤器实现某个特定的功能,一个过滤器检测多个Servlet。(匹配几个,检测几个)。

一组过滤器中的执行顺序与<filter-mapping>的配置顺序呢有关。当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源

多过滤器下的优先级

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter。原因 : tomcat 读取web.xml时,是从上往下读取的, 没读取一个就包裹成Java对象存入有序集合中

FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源

如果为注解的话,是按照类名的字符串顺序进行起作用的

监听器

定义

监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等

配置

注解式 : @WebServlet

配置式