重定向:

      /*
之前的写法
response.setStatus(302);
response.setHeader("Location", "login_success.html");*/ //重定向写法: 重新定位方向 参数即跳转的位置
response.sendRedirect("login_success.html"); 1. 地址上显示的是最后的那个资源的路径地址
2. 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。
3. 可以跳转到任意路径。 不是自己的工程也可以跳。
4. 效率稍微低一点, 执行两次请求。
5. 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。

请求转发:

        //请求转发的写法: 参数即跳转的位置
request.getRequestDispatcher("login_success.html").forward(request, response);
1. 地址上显示的是请求servlet的地址。 返回200 ok
2. 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。
3. 只能跳转自己项目的资源路径 。
4. 效率上稍微高一点,因为只执行一次请求。
5. 可以使用上一次的request对象。

Cookie:
是服务器给客户端,并且存储在客户端上的一份小数据

应用场景:
自动登录、浏览记录、购物车。

为什么要有这个Cookie:
 http的请求是无状态。 客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访问过。 为了更好的用户体验,更好的交互 [自动登录],其实从公司层面讲,就是为了更好的收集用户习惯[大数据]

添加Cookie给客户端

1. 在响应的时候,添加cookie    
            Cookie cookie = new Cookie("aa", "bb");
            //给响应,添加一个cookie
            response.addCookie(cookie);

2. 客户端收到的信息里面,响应头中多了一个字段 Set-Cookie

获取客户端带过来的Cookie

      //获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName + " = "+ cookieValue);
}
}

常用方法

        //关闭浏览器后,cookie就没有了。 ---> 针对没有设置cookie的有效期。
// expiry: 有效 以秒计算。
//正值 : 表示 在这个数字过后,cookie将会失效。
//负值: 关闭浏览器,那么cookie就失效, 默认值是 -1
cookie.setMaxAge(60 * 60 * 24 * 7); //赋值新的值
//cookie.setValue(newValue); //music.fly.com
//sport.fly.com
//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(".fly.com"); //只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");

例子一 :显示最近访问的时间

response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("abc".equals(username)&&"123".equals(password)) {
Cookie[] cookies = request.getCookies();
boolean firstLogin = true;
if (cookies!=null) {
for (Cookie cookie : cookies) {
// System.out.println(cookie.getName());
// System.out.println(cookie.getValue());
if (cookie.getName().equals("last-data")) {
firstLogin= false;
long lastData = Long.parseLong(cookie.getValue());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String string = format.format(new Date(lastData));
System.out.println("string"+string);
response.getWriter().write("欢迎:"+username+",上次登录"+string);
//重置登录时间
cookie.setValue(System.currentTimeMillis()+"");
response.addCookie(cookie);
}
}
}
//第一次登录
if (firstLogin) {
System.out.println("第一次登录");
Cookie cookie = new Cookie("last-data", System.currentTimeMillis()+"");
cookie.setMaxAge(60*20); //20分钟
response.addCookie(cookie);
response.getWriter().write("欢迎:"+username);
}
}else {
response.getWriter().write("登录失败");
}

Jsp 里面使用Java代码:
Java Server Pager ---> 最终会翻译成一个类, 就是一个Servlet

定义全局变量
    <%! int a = 99; %>
定义局部变量
    <% int b = 999; %>
在jsp页面上,显示 a 和 b的值
    <%=a %>
    <%=b %>

例子二:jsp显示浏览记录

    String goodsId = request.getParameter("id");
Cookie[] cookies = request.getCookies();
Cookie cookie = CookUtils.getCookie(cookies, "history");
if (cookie==null) {
Cookie c = new Cookie("history", goodsId);
c.setMaxAge(60*60*24*7);
c.setPath("/CookiesDemo02"); //访问这个工程,才将cookie带过来
response.addCookie(c);
}else {
String value = cookie.getValue();
cookie.setValue(value+"#"+goodsId);
cookie.setMaxAge(60*60*24*7);
cookie.setPath("/CookiesDemo02");
response.addCookie(cookie);
}
//跳转
response.sendRedirect("product_info.htm"); jsp部分:
<%
Cookie[] cookies = request.getCookies();
Cookie cookie = CookUtils.getCookie(cookies, "history");
if(cookie == null){
%>
<h2>您还没浏览任何商品</h2> <%
}else{
String [] id = cookie.getValue().split("#");
for(String i : id){
%>
<li style="width: 150px;height: 216;float: left;margin: 0 8px 0 0;padding: 0 18px 15px;text-align: center;"><img src="products/1/cs1000<%=i %>.jpg" width="130px" height="130px" /></li>
<%
}
} %>

清除Cookie, 删除cookie是没有什么delete方法的。只有设置maxAge 为0 。

     Cookie cookie = new Cookie("history","");
cookie.setMaxAge(0); //设置立即删除
cookie.setPath("/CookieDemo02");
response.addCookie(cookie);

Cookie总结

1. 服务器给客户端发送过来的一小份数据,并且存放在客户端上。
2. 获取cookie, 添加cookie
    request.getCookie();
    response.addCookie();
3. Cookie分类

会话Cookie
        默认情况下,关闭了浏览器,那么cookie就会消失。

持久Cookie

在一定时间内,都有效,并且会保存在客户端上。
        cookie.setMaxAge(0); //设置立即删除
        cookie.setMaxAge(100); //100 秒

4. Cookie的安全问题。
由于Cookie会保存在客户端上,所以有安全隐患问题。  还有一个问题, Cookie的大小与个数有限制。

为了解决这个问题 ---> Session .

Session
会话 , Session是基于Cookie的一种会话机制。 Cookie是服务器返回一小份数据给客户端,并且存放在客户端上。 Session数据存放在服务器端。会在cookie里面添加一个字段 JSESSIONID . 是tomcat服务器生成。

常用API

//得到会话ID
        String id = session.getId();
        //存值
        session.setAttribute(name, value);
        //取值
        session.getAttribute(name);
        //移除值
        session.removeAttribute(name);

 Session何时创建  , 何时销毁?

创建:如果有在servlet里面调用了 request.getSession()

销毁:session 是存放在服务器的内存中的一份数据。 当然可以持久化. Redis . 即使关了浏览器,session也不会销毁。
1. 关闭服务器
2. session会话时间过期。 有效期过了,默认有效期: 30分钟。

例子三: 简单购物车

response.setContentType("text/html;charset=utf-8");

            //1. 获取要添加到购物车的商品id
int id = Integer.parseInt(request.getParameter("id")); // 0 - 1- 2 -3 -4
String [] names = {"Iphone7","小米6","三星Note8","魅族7" , "华为9"};
//取到id对应的商品名称
String name = names[id]; //2. 获取购物车存放东西的session Map<String , Integer> iphoen7 3
//把一个map对象存放到session里面去,并且保证只存一次。
Map<String, Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
//session里面没有存放过任何东西。
if(map == null){
map = new LinkedHashMap<String , Integer>();
request.getSession().setAttribute("cart", map);
} //3. 判断购物车里面有没有该商品
if(map.containsKey(name)){
//在原来的值基础上 + 1
map.put(name, map.get(name) + 1 );
}else{
//没有购买过该商品,当前数量为1 。
map.put(name, 1);
} //4. 输出界面。(跳转)
response.getWriter().write("<a href='product_list.jsp'><h3>继续购物</h3></a><br>");
response.getWriter().write("<a href='cart.jsp'><h3>去购物车结算</h3></a>");
<%
Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cart");
if(map!=null){
for(String key:map.keySet()){
int value = map.get(key);
%>
<h3>名称:<%=key %> 数量:<%=value %></h3>
<%
}
} %>

移除Session中的元素

//强制干掉会话,里面存放的任何数据就都没有了。
        session.invalidate();
        
        //从session中移除某一个数据
        //session.removeAttribute("cart");

为什么再一次开启浏览器访问的时候,无法取到以前的数据。

因为sessionid是通过cookie来传递的。 但是这个cookie并没有设置有效期。 所以关闭浏览器之后, cookie就删除了。
表明里面的那个sessionID 也就没有了。下一次再来访问。 如果还想在下一次访问的时候,取到以前的数据。

在服务器端手动设置cookie

String id = request.getSession().getId();
        Cookie cookie = new Cookie("JSESSIONID",id);
        cookie.setMaxAge(60*60*24*7);//7天
        reponse.addCookie(cookie);

03 重定向,请求转发,cookie,session的更多相关文章

  1. HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向

    上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...

  2. java重定向与请求转发

    重定向是不能直接访问WEB-INF下的资源的,因为重定向是浏览器二次请求,众所周知,客户端是不能直接访问WEB-INF下的资源的. 而请求转发却可以直接访问. 然而重定向却可以间接访问WEN-INF下 ...

  3. [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. Session 起航 登录会话和注销请求 重定向和转发

    [LoginServlet] @WebServlet(name="loginServlet",urlPatterns = "/login") public cl ...

  5. Web---HTTP请求、重定向、转发和数据压缩

    HTTP常用的请求方式包括: GET-最为常见,但发送的数据量很小,发送的数据直接包含到url的后面. POST-可以包含大量数据,数据在请求正文中通过表单进行提交. HEAD,PUT,DELETE. ...

  6. JavaWeb请求与响应 Cookie&Session

    1.请求与响应 &Cookie&Session 1.1.请求与响应 HTTP协议 概念:英文全称:HyperText Transfer Protocol 中文全称:超文本传输协议   ...

  7. spring mvc 请求转发和重定向(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  8. servlet中请求转发(forword)与重定向(sendredirect)的区别

    摘自:http://www.cnblogs.com/CodeGuy/archive/2012/02/13/2349970.html 通俗易懂 servlet请求转发与重定向的区别: request.s ...

  9. Java Servlet(九):转发请求与重定向请求区别

    转发: <% pageContext.setAttribute("pageContextAttr", "pageContextAttribute"); r ...

随机推荐

  1. H5 PWA技术以及小demo

    H5 PWA技术 1.原生app优缺点 a.体验好.下载到手机上入口方便 b.开发成本高(ios和安卓) c.软件上线需要审核 d.版本更新需要将新版本上传到不同的应用商店 e.使用前需下载 2.we ...

  2. python 列表切片

    列表切片是python语言独有的特征,大大方便了我们的编码. 首先,在介绍切片之前,必须要知道一个知识,就是python列表的读写,下标可以使用负数. insert,get,set 操作均可传入负数下 ...

  3. jquery radio使用

    var list= $('input:radio[name="list"]:checked').val();

  4. java this的用法

    this 含义:代表当前对象 用法: 用于返回对象的引用 示例代码 public class Test { public Test f() { return this;//获取当前对象的引用 } pu ...

  5. day31 锁 队列 前面课程重点总结

    今日内容: 1.进程的其他方法 2.僵尸进程和孤儿进程(了解) 3.验证进程之间是空间隔离的 4.守护进程 5.进程锁 重点(又叫同步锁,互斥锁) 6.进程队列(重点)  Queue 7.生产者消费者 ...

  6. docker(三)容器的基本操作

    下载镜像 docker pull name 基本启动容器 docker run IMAGE command args run 在新容器中运行 IMAGE 镜像名称 command 容器命令 args ...

  7. Linux下使用bind,epoll对网络编程封装

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  8. java IO实例

    import java.io.*; /** * Created by CLY on 2017/7/23. */ public class Main { public static void main( ...

  9. 使用DLL在进程间共享数据

    0x01 DLL在进程间共享数据理论 1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不 ...

  10. DevExpress ASP.NET Bootstrap Controls v18.2新功能详解(一)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Boot ...