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

配置式

<listener>

<!--直接写出自定义的监听器的类名即可-->

    <listener-class>com.qf.web.listener.RequestLeftListener</listener-class>

  </listener>

常用的监听器

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

监测

当系统中对应的动作执行时, 相应的监听器中的相应方法就会执行

优点 : 非侵入式检测

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 1. cookie 1.1 什么是cookie cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过...
    cbw100阅读 4,057评论 0 13
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 936评论 0 0
  • 修身
    周立zhouli阅读 195评论 0 0
  • 阿玉_15286 生命之轮写作 非常幸运,我参加了晨子老师7月份的生命之轮的写作训练营,完成了21天自律计划,也...
    阿玉_15286阅读 256评论 0 2
  • 昨晚到家已经将近凌晨两点,简单收拾了一下之后赶紧睡觉,一点精神都没有了。 今天早上睡的很晚才起立,头晕晕的,好像是...
    白衣马绝音阅读 150评论 0 0