JavaEE之response,请求转发重定向,session,四大范围对象

request,response原理图

在这里插入图片描述

1 response :响应对象

提供的方法:

void addCookie( Cookie cookie ); 服务端向客户端增加cookie对象
void sendRedirect(String location ) throws IOException; :页面跳转的一种方式(重定向)
void setContetType(String type):设置服务端响应的编码(设置服务端的contentType类型)

示例:登陆

login.jsp -> check.jsp 如果登录成功跳转->success.jsp
判断登录成不成功用check.jsp检查

页面跳转重定向导致数据丢失

response.sendRedirect("success.jsp");

页面跳转:用请求转发,可以获取到数据并且地址栏没有改变(仍然保持转发时候的页面)
比如现在确实是succss的数据,但页面地址栏为check.jsp

 request.getRequestDispatcher("success.jsp").forward(request,response);

请求转发与重定向流程原理图

请求转发

在这里插入图片描述

请求转发原理和重定向跳转次数原理分析图

在这里插入图片描述
请求转发的跳转是在服务器内部跳转,一次回路
重定向的跳转时返回客户端(第一次由check.jsp告诉客户端你找的不是我,第二次客户端重新对success.jsp跳转),二次回路

地址栏是否改变
请求转发地址栏不变,对于客户端只发了一次请求,服务器内部进行请求转发
重定向地址栏会变,发送了两次请求

请求转发重定向
地址栏是否改变不变(check.jsp)改变(success.jsp)
是否保留第一次request请求时的数据(是否在一次请求中有效)保留不保留
请求的次数12
跳转发生的位置服务端客户端发出的第二次跳转

转发、重定向类比:

转发:

张三(客户端) -> 【 服务窗口 A (服务端 ) -> 服务窗口B 】
张三不知道,窗口内部由A到B,由B给张三

重定向:

张三(客户端) -> 服务窗口 A (服务端 ) ->去找B
张三(客户端) -> 服务窗口 B (服务端 ) ->结束

重定向第一次的请求的response是去找B
第二次请求的response是办理成功了

2. session(服务端,是内置对象)

Cookie(客户端,不是内置对象,需要new)

Cookie是由服务端生成的 ,再发送给客户端保存。
相当于 本地缓存的作用: 客户端(hello.mp4,zs/abc)->服务端(hello.mp4;zs/abc)
作用:提高访问服务端的效率,但是安全性较差。

Cookie: name=value
不是内置对象,是由这个类产生的javax.servlet.http.Cookie

public Cookie(String name,String value) 构造方法,可在服务器产生new
String getName():获取name
String getValue():获取value
void setMaxAge(int expiry);最大有效期 (秒)

服务器发送Cookie到客户端的过程:

服务器端:
1 服务器端产生Cookie通过构造方法产生Cookie

服务器产生Cookie
在这里插入图片描述

2 服务端准备Cookie:

response.addCookie(Cookie cookie)

3 服务器发送Cookie直接通过页面跳转

(转发,重定向),到下一个页面(到客户端)

客户端:
客户端获取cookie: request.getCookies();

a.服务端增加cookie :response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将 全部的cookie拿到

代码实现

服务器端代码
response_addCookie.jsp
    //服务端
        Cookie cookie1 = new Cookie("name","zs");
        Cookie cookie2 = new Cookie("pwd","abc");

        response.addCookie(cookie1);
        response.addCookie(cookie2);

        //页面跳转到客户端(转发,重定向)
        response.sendRedirect("result.jsp");
客户端代码

result.jsp

    //客户端获取Cookie,一次性全拿到
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
    out.print(cookie.getName()+"-------"+cookie.getValue()+"<br/>");
}

F12发现

在这里插入图片描述
通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie
建议 cookie只保存 英文数字,否则需要进行编码、解码

Demo原理图(记住密码)

利用的性质就是从服务器得到的cookie对于客户端来说是都可以通过request访问的
在这里插入图片描述

login.jsp客户端发送数据到服务端
<form action="check.jsp" method="post">
    用户名:<input type="text" name="uname"><br/>
    密码:<input type="password" name="upwd"><br/>
    提交:<input type="submit" value="登录"><br/>
</form>
服务端check.jsp将数据生成Cookie,放到response对象中返回回去
request.setCharacterEncoding("utf-8") ;
    String name = request.getParameter("uname");
    String pwd = request.getParameter("upwd");


    //服务端将用户名加入到Cookie中
   Cookie cookie = new Cookie("uname",name);
    response.addCookie(cookie) ;
    //服务器发送给客户端
      response.sendRedirect("result.jsp") ;

在由转发或者重定向到客户端页面(任何页面只要是往客户端跳),通过两种方式response的cookie带到了客户端,客户端所有的页面都可以访问

目的是登录过后在登陆页显示名字

使用Cookie实现 记住用户名 功能
login.jsp登录过后,客户端收到从服务器返回的Cookie,自动读取key为uname的cookie,将其value填充form表单

<%!
    String uname;

%>
<%
    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        if(cookie.getName().equals("uname")){
            uname = cookie.getValue();
        }
    }

%>
<form action="check.jsp" method="post">
    用户名:<input type="text" name="uname" value="<%= (uname==null?' ':uname)%>"><br/>
    密码:<input type="password" name="upwd"><br/>
    提交:<input type="submit" value="登录"><br/>
</form>

3.session :会话

session是内置对象,而cookie不是内置对象

a.浏览网站:开始-关闭
b.购物: 浏览、付款、退出
c.电子邮件:浏览、写邮件、退出
开始-结束

session机制:

session原理图
在这里插入图片描述

客户端第一次请求服务器时

服务器在内部产生一个session对象(自带一个sessionID),然后把sessionID的值赋给JSESSIONID,创建一个键值对为<“JSESSIONID”,JSESSIONID的值>的cookie

服务端做出响应

服务器响应的时候将产生的cookie发送给客户端,客户端的Cookie中就有JESSIONID,也就是Cookie中的JESSIONID和Session中的SessionId一一对应,从而保证客户端和session一一对应

过程

客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户(浏览器)的信息);
并且每个session对象 都会有一个唯一的 sessionId( 用于区分服务端的其他session);
服务端又会产生一个cookie,并且该cookie的name(key)=JSESSIONID ,value=服务端sessionId的值;
然后 服务端会在响应客户端的同时 将该cookie发送给客户端,至此客户端就有了 一个cookie(名为JSESSIONID,值为sessionid);
因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID)

客户端第2/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和sesion sessionid相等),说明此用户不是第一次访问(创建过session对象),无需登录;

例子:

客户端: 顾客(客户端)
服务端: 商场(服务端)
session 商场的柜子
cookie 钥匙

顾客第一次存包:商场 判断此人是否之前已经存过包(通过你手里是否有钥匙)。

1 如果是新顾客(没钥匙) ,分配一个钥匙 给该顾客; 钥匙 会和 柜子 一一对应;
2 第2/n次 存包:商场 判断此人是否之前已经存过包(通过你手里是否有钥匙)
如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙 会 和柜子 自动一一对应。

session和cookie的理解

在这里插入图片描述

session的性质:

a. session存储在服务端
b. session是在同一个用户(客户)请求时共享
c. 实现机制:第一次客户请求时 产生一个sessionid 并复制给 cookie的jsessionid 然后发给客户端。最终通过session的sessionid和cookie的jsessionid的一一对应,实现服务器端session和一个客户端(jsession的cookie)产生一一对应

session方法:

String getId() :获取sessionId
boolean isNew() :判断是否是新用户(第一次访问)
void invalidate():使session失效 (退出登录、注销)

void setAttribute() 设置属性值
Object getAttribute(); 获取属性值

void setMaxInactiveInterval(秒) :设置最大有效 非活动时间
int getMaxInactiveInterval():获取最大有效 非活动时间

示例:

登录

session示例图
在这里插入图片描述
第一部分,服务端什么时候创建session,必须是在登录成功后创建,从数据库中查询出来用户信息后存放入session中
login.jsp—>check.jsp
进行检查,登录成功后分配session,并向session中存入属性值,请求转发到welcome.jsp
登录失败重定向到login.jsp
注意:由于设置了session的最大有效非活动时间,过了时间访问welcome.jsp,session消失,又需要重新登录

代码

check.jsp

   request.setCharacterEncoding("utf-8");
        String name = request.getParameter("uname");
        String pwd = request.getParameter("upwd");
        if (name.equals("zs") && pwd.equals("abc")){
            //登录成功分配客户端一个session
            //session是内置对象不需要new,直接给session赋属性值
            //只有登录成功session对象中才有uname,upwd两个属性值
            session.setAttribute("uname",name);
            session.setAttribute("upwd",pwd);
            session.setMaxInactiveInterval(10);
            request.getRequestDispatcher("welcome.jsp").forward(request,response);

        }else{
            //登录失败
            response.sendRedirect("login.jsp");
        }
session的重要性质,对于同一个会话共享

同一个会话区分往往是通过客户端浏览器的
cookie和session
在这里插入图片描述
对于IE浏览器中,一次对话中,访问不同的页面(login.jsp,b.jsp,c.jsp)都能拿到session中的属性值(zs/abc的值)

使用session的invalidate()方法实现注销

调用invalidate()方法就是删除服务器端的session对象,注意不同会话对应着不同的session对象
void invalidate():使session失效 (退出登录、注销)

客户端在第一次请求服务端时,如果服务端发现 此请求没有 JSESSIONID这个cookie,则会创建一个 name=JSESSIONID的cookie 并返回给客户端

Cookie性质:

a.不是内置对象,要使用必须new
b.但是,服务端会 自动生成一个(服务端自动new一个cookie) name=JSESIONID的cookie 并返回给客户端

cookie和session的区别:
sessioncookie
保存的位置服务端客户端
安全性较安全较不安全
保存的内容ObjectString

4 application 全局对象

String getContextPath() 虚拟路径
String getRealPath(String name): 绝对路径(虚拟路径 相对的绝对路径)

JSP9大内置对象

pageContext JSP页面容器
request 请求对象
session 会话对象
appliation 全局对象
response 响应对象
config 配置对象(服务器配置信息)
out 输出对象
page 当前JSP页面对象(相当于java中的this)
exception 异常对象

四种范围对象(小->大)

pageContext JSP页面容器 (page对象); 当前页面有效
request 请求对象 同一次请求有效
session 会话对象 同一次会话有效
application 全局对象 全局有效(整个项目有效)

以上4个对象共有的方法:
Object getAttribute(String name):根据属性名,或者属性值
void setAttribute(String name,Object obj) :设置属性值(新增,修改)
setAttribute("a","b") ;//如果a对象之前不存在,则新建一个a对象,值赋为b ;
如果a之前已经存在,则将a的值改为b
void removeAttribute(String name):根据属性名,删除对象

a.pageContext 当前页面有效 (页面跳转后无效)

b.request 同一次请求有效;其他请求无效 (请求转发后有效,因为客户端发出一次请求,内部进行转发;重定向后无效,因为客户端两次不同的请求)

能否让重定向有效,同一个客户端浏览不同的页面有效(也就是会话有效)?
c.session 同一次会话有效 (无论怎么跳转,都有效;关闭/切换浏览器后无效 ; 从 登陆->退出 之间 全部有效)

d.application
全局变量;整个项目运行期间 都有效 (切换浏览器 仍然有效);关闭服务、其他项目 无效

->多个项目共享、重启后仍然有效 :JNDI

1.以上的4个范围对象,通过 setAttribute()复制,通过getAttribute()取值;
2.以上范围对象,尽量使用最小的范围。因为 对象的范围越大,造成的性能损耗越大。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值