java的进阶学习-第三章:会话管理

目录

一、Http协议:

1.1 概述

1.2 请求:

1.3 响应:

二、Servlet转发和重定向:

2.1 转发:

2.2 重定向:

三、Servlet路径问题:

3.1 映射路径:

3.2 缺省路径:

四、会话管理技术:

4.1 软件中会话:

4.2 会话技术:

五、Cookie技术:

5.1 Cookie技术的核心:

5.2 Cookie技术的原理:

5.3 案例——显示用户上次访问时间:


Java基础

Web前端:

页面结构:html

Servlet、jsp(Java Server Page)=html+java

页面样式:css(Cascading Style Sheet,层叠样式表)

页面交互:js(javascript)、jQuery、AJAX

XML文件

MySQL数据库

JDBC(Java DataBase Connectivty)

JavaWeb项目:

一、Http协议:

1.1 概述

1、定义:

对浏览器端和服务器端之间的数据传输的格式规范。

2、查看http协议的工具:

(1)谷歌浏览器:直接右键“检查”(审查元素)->Network

(2)QQ浏览器:

3、Http协议的内容:

请求:从浏览器端发送到服务器端的一个操作。

响应:从服务器端到浏览器端返回一个操作结果。

1.2 请求:

1、请求行:

URL:统一资源定位符;http://localhost:8080/Day29_Demo/hello.do,只能定位网络资源。是URI的子集。

URI:统一资源标记符;用于标记任何资源,可以是本地资源,可以是局域网资源,还可以是互联网资源。

Method(请求方式)——get、post

get:地址栏会自动拼接参数,以?开头,多个参数直接使用&分割;

get请求方式不安全,不适合提交敏感数据;

get请求方式提交参数有限制,不能超过1kB;

如果直接使用浏览器请求,默认提交方式就是get。

post:地址栏不会拼接参数,参数跟在请求的实体内容中;

post提交方式适合提交敏感数据;

post提交的参数没有大小限制。

2、请求头:

3、请求内容:

只有post提交的参数才会放在实体中。

4、HttpServletRequest:

作用在于获取请求数据。

请求行:

request.getMethod()    获取请求方式

request.getRequestURI()    获取请求资源

request.getProtocol      获取http请求的版本

请求头:

request.getHeader(“名称”)   根据请求名称获取请求值

request.getHeaderNames();  

实体内容:

request.getParameter(“name”)     根据名称获取请求值

request.getInputStream()    获取请求IO流

1.3 响应:

1、响应行:

状态码:

200:表示请求处理完成并正确返回。

302:表示请求需要进一步的细化。

404:表示用户访问的资源找不到(不存在,存在但无访问权限)。

500:表示服务器的资源发送错误(服务器内部错误)

2、响应头:

3、响应实体:

4、HttpServletResponse:

响应行:

response.setStatus()    设置响应码Status Code

响应头:

response.setHeader(“name”,”value”)

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

实体内容:

response.getWriter.write()   发送字符实体内容

response.getOutputStream.write()    发送字节实体内容

二、Servlet转发和重定向:

2.1 转发:

this.getServletContext().getRequestDispatcher("/index.html")

                     .forward(request, response);

1、地址栏不会发生变化;

2、转发只能转发到当前web应用内的资源;

3、在转发的过程中,可以把数据保存在request域对象中。转发属于浏览器端的一个操作。

2.2 重定向:

response.sendRedirect("index.html");

1、地址栏会发生变化,变成了重定向指定的地址;

2、重定向可以跳转到当前的web应用的地址,也可以外部网站域名,还可以是另外一个web应用。重定向属于服务器端的一个处理。

3、在重定向的过程中,不能通过request域对象保存数据的。

if (dbAdmin == null) { // 账号不存在

           // System.out.println("账号不存在!");

           // 1.转发:

           // this.getServletContext().getRequestDispatcher("/error.html")

           // .forward(request, response);

           // 重定向:

           response.sendRedirect("error.html");

       } else {

           if (password.equals(dbAdmin.getPassword())) {// 账号存在,并且密码正确

              // System.out.println("登录成功!");

              // 转发

              // this.getServletContext().getRequestDispatcher("/index.html")

              // .forward(request, response);

              // 重定向:

              response.sendRedirect("index.html");

           } else {

              // System.out.println("密码错误!!!");

              // 转发:

              // this.getServletContext().getRequestDispatcher("/error.html")

              // .forward(request, response);

              // 重定向:

              response.sendRedirect("http://www.baidu.com");

           }

       }

三、Servlet路径问题:

3.1 映射路径:

<servlet>

    <servlet-name>AdminServlet</servlet-name>

    <servlet-class>com.bw.servlet.AdminServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>AdminServlet</servlet-name>

    <url-pattern>/login.do</url-pattern>

  </servlet-mapping>

url-pattern:浏览器url中出现

精准匹配:http://localhost:8080/Day29_Demo/login.do

模糊匹配:/*    http://localhost:8080/Day29_Demo/任意路径

/xxxx/*   http://localhost:8080/Day29_Demo/xxxx/任意路径

*.后缀名  意味着使用该特定的后缀名即可访问该servlet。

*.do

*.action

*.html(伪静态)

注意:

1、url-pattern要么以/开头,要么以*开头;

2、不能同时使用两种模糊匹配,比如/servlet/*.do是非法的。

3、当输入的url有多个servlet同时被匹配的情况下,

精准匹配优先(长得最像优先被匹配)

以后缀结尾的模糊url-pattern优先级最低

3.2 缺省路径:

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

是Tomcat服务器内置的一个路径,该路径对应的是DefaultServlet(缺省Servlet),用于解析web应用的静态资源文件。

http://localhost:8080/Day29_Demo/login1.html  如何读取文件?

1、到当前的web应用的web.xml文件中查找是否有匹配的url-pattern

2、如果没有匹配的url-pattern,则交给Tomcat内置的DefaultServlet处理

3、DefaultServlet会到web应用根目录找login1.html文件

4、如果能够找到,则读取该文件内容返回给浏览器现实

5、如果找不到,返回404页面错误。

先找动态资源,后找静态资源。

四、会话管理技术:

4.1 软件中会话:

打开浏览器->浏览登录页面->访问一些服务器的内容->关闭浏览器

登录场景:

打开浏览器->进入登录页面->输入登录信息->访问到用户主页(显示用户名)

修改密码

下订单

删除订单

修改收货地址

->关闭浏览器

问题:登录会话过程中产生的数据是如何保存的?

域对象:实现资源之间数据共享。request、Cookie、Session

4.2 会话技术:

Cookie技术:会话数据保存在浏览器端

Session技术:会话数据保存在服务器端。

五、Cookie技术:

5.1 Cookie技术的核心:

Cookie类:

1、构造方法

Cookie(String name,String value)

2、Cookie的设置:

设置Cookie的有效时间(单位是秒):void setMaxAge(int expiry)

设置Cookie的有效访问路径:void setPath(String path)

设置Cookie的值:void setValue(String newValue)

3、发送Cookie到浏览器保存

void response.addCookie(Cookie cookie)

4、浏览器接收Cookie

Cookie[] request.getCookies()

5.2 Cookie技术的原理:

1、服务器创建Cookie对象,把会话数据保存到Cookie对象

2、服务器发送Cookie对象给浏览器

3、浏览器得到服务器发送的Cookie对象后保存在浏览器的缓存

4、下次访问的时候会带着Cookie对象

5、服务器接收从浏览器带来的Cookie信息。

5.3 案例——显示用户上次访问时间:

public class HistoryServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

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

       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

       String currentTime = sdf.format(new Date());

       // 取得Cookie数据

       Cookie[] cookies = request.getCookies();

       String lastTime = "";

       if (cookies != null && cookies.length > 0) {

           for (Cookie c : cookies) {

                if ("lastTime".equals(c.getName())) {

                    lastTime = c.getValue();

                    response.getWriter().write(

                            "欢迎回来,您上次的访问时间为:" + lastTime + ",当前时间为:"

                                    + currentTime);

                    c.setValue(currentTime);

                    c.setMaxAge(24 * 3600);

                    response.addCookie(c);

                    break;

                }

            }

       }

       if (cookies == null || lastTime == null || lastTime == "") {

           response.getWriter().write("您是首次访问本网站,当前时间为:" + currentTime);

           Cookie cookie = new Cookie("lastTime", currentTime);

           cookie.setMaxAge(24 * 3600);

           response.addCookie(cookie);

       }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doGet(request, response);

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逼哥很疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值