JavaWeb-Servlet服务连接器(终)

这篇具有很好参考价值的文章主要介绍了JavaWeb-Servlet服务连接器(终)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

上一篇文章JavaWeb-Servlet服务连接器(三)_Alphamilk的博客-CSDN博客

目录

1.ServletContext通信

会话技术Cookie与Session

1.Cookie

2.Session


1.ServletContext通信

概念:代表了整个web应用,用于与服务器实现通信

可以通过以下方法获取该对象

方法 描述
request.getServletContext() 返回与给定请求关联的Servlet上下文对象。
this.getServletContext() 返回当前Servlet的上下文对象。它是通过servlet类自动继承的方法,可以在当前servlet中直接调用。

获取的对象可以实现以下功能

获取MIME类型(互联网通信时候用到的文件类型)

方法 描述
request.getServletContext().getMimeType(String file) 返回给定文件的 MIME 类型。可以通过请求的 Servlet 上下文对象调用,传入文件路径或文件名作为参数。
this.getServletContext().getMimeType(String file) 返回给定文件的 MIME 类型。可以在当前 Servlet 中直接调用,传入文件路径或文件名作为参数。

常见的MIME类型

MIME类型 描述
text/plain 纯文本
text/html HTML文档
text/css CSS样式表
application/json JSON数据
application/xml XML数据
application/pdf Adobe PDF文件
application/msword Microsoft Word文档
image/jpeg JPEG图像
image/png PNG图像

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

案例代码:

package com.company;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ContextDemo")
public class ServletContextdemo extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        定义文件名
        String filename = "javaWeb.jpg";

//      通过request创建对象
        ServletContext context = req.getServletContext();
//        通过HttpServlet本身的方法创建ServletContext
        ServletContext context1 = this.getServletContext();
//        获取文件名的mimeType类型
        String mimeType = context.getMimeType(filename);
        System.out.println("FileName:"+filename+" MIMEType:"+mimeType);
    }
//    方法统一
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

2. 域对象(实现共享数据)

通过以下方法实现

方法 描述
setAttribute(String name, Object obj) 将给定名称和对象绑定在当前范围内(如servlet上下文、会话或请求)。
getAttribute(String name) 返回与给定名称关联的对象,如果没有找到则返回null。
remove(String name) 从当前范围中删除具有给定名称的属性,并返回被删除的属性值,如果没有找到则返回null。

 案例代码:

设置共享变量类

package com.company;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Contextdemo3")
public class Contextdemo3 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
//        创建共享变量
        context.setAttribute("msg","HelloWorld");
        System.out.println("访问ContextDemo3");
    }
//    方法统一
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

获取共享变量类

package com.company;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/Contextdemo4")
public class Contextdemo4 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
//        获取共享变量
        Object msg =context.getAttribute("msg");

        System.out.println("访问ContextDemo4");
//        如果消息可以进行转型字符串则转型为字符串
        if (msg instanceof String){
            System.out.println((String) msg);
        }
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

 3.获取文件的真实路径

方法名 描述
getRealPath(String path) 获取指定路径下资源在服务器文件系统中的真实路径

案例代码:

就以刚才javaWeb.jpg举例,找到其在服务器中的位置

package com.company;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ContextDemo2")
public class ContextDemo2 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        使用HttpServlet创建对象
        ServletContext context = this.getServletContext();
//        通过相对于部署的 Web 应用程序的根目录的路径来获取真实路径
        String realpath = context.getRealPath("/src/javaWeb.jpg");
        System.out.println("在服务器中存放的路径是:"+realpath);
    }
//        方法统一
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

 对比可以发现确实是在该位置


会话技术Cookie与Session

1.Cookie

cookie是客户端的会话数据,并且将数据保存到客户端浏览器,可以保存一些并不重要的信息,比如购物车网站,当选好购物的商品的时候如果关闭了浏览器,如果没有Cookie技术则会丢失购买记录,需要重新进行购物。

Cookie的创建、设置、获取

方法名 描述
Cookie(String name, String value) 创建一个新的 Cookie 对象,使用给定的名称和值
response.addCookie(Cookie cookie) 将指定的 Cookie 添加到响应中
response.getCookies() 获取响应中包含的所有 Cookie,并将其以数组形式返回

Cookie生命周期

每一个Cookie都有一定的生命周期,当超过有效时间时候就会失效,默认情况下,Cookie的创建生命周期直到客户端的浏览器关闭就失效,而如果不存在失效的情况下太多的Cookie被浏览器保存下来会造成大量的资源占用。可以通过以下方法控制生命周期

方法名 描述
setMaxAge(int seconds) 设置 Cookie 的最大存活时间(以秒为单位)。
- 当 seconds 为 0 时,表示该 Cookie 将立即过期并从客户端删除。
- 当 seconds 为负数时,表示该 Cookie 是一个会话 Cookie,只在用户会话期间有效,关闭浏览器后将被删除。
- 当 seconds 大于0时,表示该 Cookie 将在指定的秒数后过期。

创建Cookie的案例代码:

设置Cookie类(案例情景:在成功登陆一些网站时候,就授予Cookie用以可以记录用户的操作)

package com.company;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建一个Cookie表示购物袋中有一辆兰博基尼,并且传入多个cookie
        Cookie cookie = new Cookie("shoppingMap","Lamborghini");
        Cookie cookie1 = new Cookie("login-id","1234");
//        第一个保留七天数据,第二个默认处理
        cookie.setMaxAge(60*60*7);
        resp.addCookie(cookie);
        resp.addCookie(cookie1);
    }
//    方法统一处理
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

访问Cookie类

package com.company;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookies[] = req.getCookies();
//        输出所有的Cookie数据
        for (Cookie c:cookies) {
            String name = c.getName();
            String value = c.getValue();
            System.out.println("CookieName:"+name+" CookieValue:"+value);
        }
    }
//    统一方法处理
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

查看发送的数据包:

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

Cookie的特点与作用

特点:

  1. cookie的内容存储在客户端的浏览器上
  2. 浏览器对单个cookie的大小有限制,并且对同一个域名的cookie的数量也有限制

作用:

  1. cookie常用于存储少量不太敏感的数据
  2. 在未登陆的情况下能够实现服务器对用户的身份识别

注意:cookie不应该用于记录用户的登陆的唯一标识,因为如果有人通过伪造cookie的方式(比如sql注入,或者csrf外部绕过)从而登陆到相关的网站,并对用户的信息进行非法修改,造成损失


2.Session

Seesion也是一门服务器的会话技术,但是相比与Cookie,其数据保存在服务器中。一般用来识别与跟踪用户的状态信息。

Session的创建、使用

方法 描述
HttpSession session = request.getSession() 创建或获取当前请求的 HttpSession 对象,如果不存在则会创建一个新的。
session.getAttribute(String name) 获取指定名称的属性值,返回一个 Object 类型的值。
session.setAttribute(String name, Object value) 设置指定名称的属性值,将 Object 类型的值存储到 Session 中。
session.removeAttribute(String name) 移除指定名称的属性值。

案例代码:创建session对象并赋值

创建类

package com.company;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建Session
        HttpSession session = req.getSession();
        session.setAttribute("用户name","AlphaMilk");
        System.out.println("设置session成功");
    }
//    方法统一
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

获取session类:

package com.company;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        告诉浏览器服务器的编码方式是utf-8
        resp.setHeader("content-type","text/html;charset=utf-8");
//        获取请求头的session对象
        HttpSession session = req.getSession();
//        创建输出流,将session内容输出到浏览器中
        PrintWriter writer = resp.getWriter();
        writer.write("<h1>欢迎用户"+session.getAttribute("用户id")+"</h1>");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

 问题引出:如果客户端浏览器不小心关闭,再次开启浏览器获取到的session将是不同的对象。那么该如何解决这个问题呢?

Session 的实现通常依赖于 Cookie。每次创建 Session 时,会生成一个对应的 Cookie,其中包含了一个称为 JSESSIONID 的标识符,用于唯一标识该 Session 对象。

在客户端发起请求时,浏览器会自动将该 Cookie 携带到服务器端,服务器通过解析 Cookie 中的 JSESSIONID,就能够找到对应的 Session 对象,从而实现状态的保持和用户身份的识别。

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

 实现session持久化

解决方法本质就是创建一个一模一样的cookie中JSESSIONID和值

案例代码:

package com.company;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/SessionDemo3")
public class SessionDemo3 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建session对象
        HttpSession session = req.getSession();
//        创建对应的cookie对象
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
//        设置生命周期
        cookie.setMaxAge(60*60);
        resp.addCookie(cookie);
//        获取session对象的id
        System.out.println(req.getSession().getId());
    }
//    实现方法统一
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

第一次获取然后关闭浏览器重新获取id

JavaWeb-Servlet服务连接器(终),JavaWeb,servlet

Session的销毁

  • 服务器关闭
  • session调用invalidate()
  • session修改默认失效时间

        session的默认失效时间是30分钟如果想要修改需要在项目的总web.xml配置中设置 

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

下一篇文章:

JavaWeb-Filter过滤器_Alphamilk的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-649280.html

到了这里,关于JavaWeb-Servlet服务连接器(终)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaWeb-Servlet的应用

    1. HTTP协议 2. HttpServlet 什么是HTTP协议 HTTP 协议一般指 HTTP(超文本传输协议)。超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守

    2024年02月08日
    浏览(43)
  • JavaWeb-Servlet【内含思维导图】

    目录 Servlet思维导图​编辑 1.什么是Servlet 2.Servelt概述 3.Servlet-Quickstart Your Project 3.1创建一个Web项目,导入Servlet依赖 3.1.1 选择Servlet导入依赖       3.1.2 导入Servlet依赖 3.2 在Web项目,定义类,实现Servlet接口,并重写其方法  3.2.1 Servlet 方法介绍 4. Servlet 执行流程  5. Servlet 生命

    2024年02月02日
    浏览(81)
  • Flink 之 Kafka连接器

    Flink附带了一个通用的Kafka连接器,它试图跟踪Kafka客户端的最新版本。Kafka的客户端版本会在Flink不同版本间发生变化。现代Kafka客户端向后兼容broker 0.10.0版本及以后的版本。 用法 Kafka Source 提供了一个构造器类来构建KafkaSource的实例。下面代码展示如何构建一个KafkaSource来消

    2023年04月08日
    浏览(48)
  • 汽车连接器接线端子和多芯线束连接界面

    冷压接的开式压接和闭式压接以及热压接的超声波焊接对汽车连接器接线端子和多芯线束连接界面 连接器接线端子和多芯线束的连接是电子线束行业,特别是汽车行业常用的导线连接方式。汽车整车线束又由许多分支线束组成,而分支线束必须通过连接器实现连接,连接核心

    2024年01月19日
    浏览(53)
  • 【flink sql】kafka连接器

    Kafka 连接器提供从 Kafka topic 中消费和写入数据的能力。 前面已经介绍了flink sql创建表的语法及说明:【flink sql】创建表 这篇博客聊聊怎么通过flink sql连接kafka 以下的连接器元数据可以在表定义中通过元数据列的形式获取。 R/W 列定义了一个元数据是可读的(R)还是可写的(

    2024年02月08日
    浏览(51)
  • 【腾讯云】腾讯云HiFlow场景连接器

    iFlow场景连接器是腾讯云推出的一个免费的应用连接自动化工具。提供助力办公流程自动化的场景连接工具,可以零代码的连接你的多个应用,鼠标轻点即可轻松设置自动化的工作流程数据流程,轻松实现日常办公任务的自动化操作。 通过场景连接器,你可以轻松快速实现如

    2024年02月16日
    浏览(48)
  • 罗技鼠标m590 连接器无法工作

    买了M590,手感不错,一开始可以连接两台设备。但是后来我重置了蓝牙,调换了两台设备的连接方法,,就发现蓝牙可以,连接器不行。 我比较奇怪,按道理一般连接器要比蓝牙方便,但这次为什么蓝牙可以,连接器不行了。然后我又把两个连接方式调换了一下,发现还是

    2024年02月11日
    浏览(108)
  • Semantic Kernel 入门系列:?Connector连接器

    当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果。这一过程在Semantic Kernel中可以被归类为Connector。 Connector更像是一种设计模式,并不像Function和Memory 一样有强制和

    2023年04月15日
    浏览(46)
  • Flink系列之:Elasticsearch SQL 连接器

    Sink: Batch Sink: Streaming Append Upsert Mode Elasticsearch 连接器允许将数据写入到 Elasticsearch 引擎的索引中。本文档描述运行 SQL 查询时如何设置 Elasticsearch 连接器。 连接器可以工作在 upsert 模式,使用 DDL 中定义的主键与外部系统交换 UPDATE/DELETE 消息。 如果 DDL 中没有定义主键,那么

    2024年02月04日
    浏览(56)
  • Flink系列之:JDBC SQL 连接器

    Scan Source: Bounded Lookup Source: Sync Mode Sink: Batch Sink: Streaming Append Upsert Mode JDBC 连接器允许使用 JDBC 驱动向任意类型的关系型数据库读取或者写入数据。本文档描述了针对关系型数据库如何通过建立 JDBC 连接器来执行 SQL 查询。 如果在 DDL 中定义了主键,JDBC sink 将以 upsert 模式与外

    2024年02月02日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包