ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Servlet

2022-08-25 20:01:31  阅读:128  来源: 互联网

标签:String 获取 Cookie cookie Servlet response


0.IDEA创建第一个Servlet程序

创建Servlet参考:参考

1.概述

1.概念

Java Servlet(Server applet) 是运行在 Web 服务器或应用服务器上的基于HTTP协议的程序,它是作为来自Web浏览器或其他 HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。

2.基本入门
  1. 创建JavaEE项目
  2. 定义一个类实现Servlet接口
  3. 实现Servlet接口中的五个抽象方法
  4. 配置Servlet:两种方式,分别是XML文件配置和注解

方式1:在web.xml文件中配置

  1. 创建JavaEE项目
  2. 定义一个类实现Servlet接口
  3. 实现接口中地抽象方法
  4. 配置Servlet
<!--在web.xml中配置-->
在web-app根标签下增加如下
<servlet>
    <servlet-name>test</servlet-name>
    <!--全类名-->
    <servlet-class>jsoup_study.ServLetDemo</servlet-class>
</servlet>  
<servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>

方式二:使用注解

  1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  2. 定义一个类,实现Servlet接口
  3. 重写方法
  4. 在类上使用@webServlet注解,进行配置。@webServlet("资源路径")

note:上述方式配置好后,浏览器中输入tomcat中配置好的URL和注解中WebServlet的value值即可

3.Servlet的生命周期方法
  1. 被创建:执行init方法,只执行一次。 Servlet的init方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。这样多个用户同时访问可能存在线程安全问题。解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值。
默认情况下,第一次访问时,Servlet被创建
可以通过web.xml配置文件配置Servlet被创建的时机
在Servlet标签下:
1. 在第一次服务器被访问时创建Servlet:
<load-on-startup>的值为负数
2. 在服务器启动的时候就创建Servlet:
<load-on-startup>的值为0或者整数
  1. 提供服务(处理客户端的请求):执行service方法,执行多次。 每次访问Servlet时,该方法都会被调用一次。
  2. 被销毁:执行destroy方法,执行一次。 只有服务器正常关闭时,才会执行该方法。destroy方法在Servlet被销毁之前执行,一般用于释放资源。
4.Servlet的体系结构
  1. Servlet:一个接口
  2. GenericServlet:实现了Servlet接口的一个抽象类,含有一个抽象方法service.
将Servlet中的其他方法做了默认空实现,只将service方法作为抽象。
  1. HttpServlet类:一个继承自GenericServlet的抽象类。它是对Http协议的一种封装,简化操作。
1. 定义类继承自HttpServlet
2. 重写doPost方法和doGet方法
  1. 由Servlet的体系结构可以知道创建Servlet有三种方式:推荐使用方式三创建Servlet
1. 实现Servlet接口
2. 继承自GenericServlet抽象类
3. 继承自HttpServlet抽象类
5.Servlet相关配置
  1. urlparttern:定义Servlet访问路径。一个Servlet可以定义多个访问路径,比如说@WebServlet({"/dd","/dd/rr"})
路径定义规则:
1. /xxx
2. /ddd/xxx(多级目录)
3. *.do 

2.request对象

1.request对象和response对象的原理
  1. request对象和response对象都是由服务器创建的,request对象中封装了请求消息数据。程序员来使用他们。
  2. request对象是程序员获取请求消息数据的,response对象是用来设置响应消息。
2.request对象继承体系结构

由服务器实现HttpServletRequest接口,HttpServletRequest接口继承自ServletRequest接口

3.request对象的功能
  1. 获取请求行数据:一个请求行示例:GET /day11/demo1?name=lisi HTTP/1.1
获取请求方式:String getMethod()
获取虚拟目录(虚拟目录即tomcat服务器中配置的应用程序上下文):/day11:
String getContextPath()
获取Servlet路径/demo1:(即url-pattern标签中的值或者注解WebServlet配置的value值)
String getServletPath()
获取get方式的请求参数name=lisi:
String getQueryString()
获取请求的URI/day11/demo1:
String getRequestURI()
获取请求的URL
StringBuffer getRequestURL() http://localhost/day11/demo1
获取协议及版本号HTTP/1.1:
String getProtocol()
获取客户机的IP地址:
String getRemoteAddr()

// 示例,使用get方式在浏览器中输入http://localhost:8080/day11/demo1
System.out.println(req.getMethod());    //get
System.out.println(req.getRequestURI());//day11/demo1
System.out.println(req.getProtocol());//HTTP/1.1

注:URI:统一资源标识符
2. 获取请求头数据

String getHeader(String name):根据请求头的名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有的请求头名称
  1. 获取请求体数据
    请求体:只有post请求方式才有请求体,在请求体中封装了post请求的请求参数.
步骤:
1. 获取流对象(字符流或者字节流对象)
    1.BufferedReader getReader():获取字符输入流,只能操作字符数据
示例:
<html>
<head>
    <title>注册页面</title>
</head>
<body>
    <form action="/servlet_review_war_exploded/register" method="post">
        <input type="text" placeholder="请输入用户名" name="username"><br/>
        <input type="text" placeholder="请输入密码" name="password"><br/>
        <input type="submit" value="注册">
    </form>
</body>
</html>

@WebServlet(value = {"/register"})
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取post的请求消息体,即请求参数
        // 1.获取字符流
        BufferedReader reader = req.getReader();
        String line = null;
        while ((line = reader.readLine()) != null) {
            // 控制台将获取请求参数的值
            System.out.println(line);   //username=huwen&password=123456
        }
    }
}
    2.ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据

2. 再从流对象中拿数据
  1. 获取请求参数通用的方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组(这个方法可以用于复选框,
有的情况下同一个键对应多个值)
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]>getParameterMap():获取所有参数的map集合


// 示例:对于get请求,http://localhost:8080/servlet_review_war_exploded/
register?username=nrvcer&age=23&gender=boy

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println("username:" + username);
        Map<String, String[]> map = req.getParameterMap();
        Set<String> keySet = map.keySet();
        for (String name : keySet) {
            String[] values = map.get(name);
            for (String value : values) {
                System.out.println(name + ":" + value);
            }
            System.out.println("------------");
        }
    }
输出如下:    
username:nrvcer
username:nrvcer
------------
age:23
------------
gender:boy
------------
  1. 请求转发:一种在服务器内部的资源跳转方式
方法1:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 通过RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

// 示例:访问servletDemo2资源将转发到servletDemo3资源
@WebServlet(value = {"/servletDemo2"})
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo2被访问了!");
        // 转发到servletDemo3资源
        req.getRequestDispatcher("/servletDemo3").forward(req,resp);

    }
}
@WebServlet(value = {"/servletDemo3"})
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo3被访问了!");
    }
}

请求转发的特点:
1.浏览器地址栏路径不发生变化
2.只能转发到当前服务器内部资源中
3.转发是一次请求,可以使用request对象共享数据(多个资源之间使用同一个请求)

6. 共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
void setAttribute(String name, Object obj):存储数据
Object getAttribute(String name):通过建获取值
void removeAttribute(String name):通过建移除键值对

// 示例:
@WebServlet(value = {"/servletDemo2"})
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo2被访问了!");
        // 转发之前,存储数据到request域中
        req.setAttribute("msg", 666);
        // 转发到servletDemo3资源
        req.getRequestDispatcher("/servletDemo3").forward(req,resp);

    }
}

@WebServlet(value = {"/servletDemo3"})
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo3被访问了!");
        // 从request域中获取数据
        Object value = req.getAttribute("msg"); // 666
        System.out.println(value);
    }
}
  1. 获取ServletContext对象
ServletContext  getServletContext();

中文乱码问题:

  1. get:tomcat8已经将get方式乱码问题解决了
  2. post方式:会乱码,解决方式,在获取客户端的请求参数之前设置request的编码request.setCharacterEncoding("utf-8")

3.response对象

1.response功能:设置响应消息
  1. 设置响应行:比如有一个响应行HTTP/1.1 200 OK
1. 设置响应码:setStatus(int sc)
  1. 设置响应头
setHeader(String name, String value)
  1. 设置响应体
1. 获取输出流(分为字节输出流或者字符输出流)
2. 使用输出流,将其输出到客户端浏览器上

案例1:重定向的实现

访问/responsedemo1会自动跳转发到/responsedemo2

方法1:
1. 设置状态码,302表示服务端告诉客户端重定向
response.setStatus(302);
2. 设置响应头
response.setHeader("location","responsedemo2");
方法2:使用response的sendRedirect(String s)方法
例如response.sendRedirect("http://www.baidu.com");
resp.sendRedirect("/servlet_review_war_exploded/servletDemo3");   // 加上虚拟目录

重定向的特点:1.地址栏发生变化2.重定向可以访问其他站点(服务器)或者本服务器的资源3.重定向是两次请求,不能使用request对象共享数据

2.路径的写法
  1. 路径的分类:
    1. 相对路径:通过相对路径不能确定唯一资源。比如说./index.html,不以/开头,以./开头,当然./可以省略。规则:找到当前资源和目标资源之间的相对位置关系
    2. 绝对路径:通过绝对路径可以确定唯一资源,比如说/servlet_review_war_exploded/servletDemo3
  2. 给客户端浏览器使用(比如重定向,a标签中的href属性,form表单的action属性):需要加上虚拟目录(项目的访问路径),即包含Tomcat中Application Context中的内容.建议动态获取虚拟目录,记住一个方法request.getContextPath()动态获取虚拟目录的方法
// 示例:
@WebServlet(value={"/demo1"})
public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo1......");
        // 获取虚拟目录
        String contextPath = req.getContextPath();
        System.out.println(contextPath); ///servlet_review_war_exploded
        // 重定向
        resp.sendRedirect(contextPath + "/demo2");
    }
}
  1. 给服务器使用(比如转发),不需要加上虚拟目录,使用相对路径即可。
3.服务器输出字符数据到浏览器
1. 获取字符输出流 
2. 输出数据

// 获取字符输出流
PrintWriter out = response.getWriter();
// 输出数据
out.println("<h1>HelloWorld</h1>");

解决服务器输出字符数据到浏览器中文乱码的问题(乱码的原因:编码和解码使用的字符集不一致。通过response对象获取的流对象使用的编码为iso-8859-1):在获取流对象之前使用方法2

方法1:
// 获取流对象之前设置流的编码
response.setCharacterEncoding("utf-8");
// 通知浏览器服务器发送的消息体数据的编码,建议浏览器使用该编码来解码
response.setHeader("content-type","text/html;charset=utf-8")   // 这一行有的话上一行代码不用
方法2:使用简便方法
response.setContentType("text/html;charset=utf-8");
4.服务器输出字节数据到浏览器
1. 获取字节输出流
2. 输出数据

response.setContentType("text/html;charset=utf-8");
ServletOutputStream sos = response.getOutputStream();
sos.write("HelloWorld.getBytes()");
5.验证码

验证码:本质是一张图片,目的是防止恶意表单注册

4.ServletContext对象

1.概述
  1. 概念:代表整个web应用,可以和程序的容器(服务器容器)来通信
2.ServletContext对象的获取:ServletContext对象在应用中只有一个。
1. 通过request对象来获取 
request.getServletContext();
2. 通过HttpServlet继承过来的方法来获取
this.getServletContext();

// 获取ServletContext对象
ServletContext servletContext1 = this.getServletContext();
ServletContext servletContext2 = req.getServletContext();
System.out.println(servletContext1 == servletContext2); // true
3.功能
  1. 获取MIME类型:MIME类型的概念,在互联网通信过程中定义的一种文件数据类型 。格式有大类型和小类型,比如说text/html,image/jpeg
1. 通过ServletContext类的getMimeType(String file)方法

//获取ServletContext对象context
ServletContext context = this.getServletContext();
// 定义文件名称
String fileName = "a.jpg";
// 获取MIME类型
String mimeType = context.getMimeType(fileName);
  1. 域对象:共享数据

ServletContext对象的范围:所有用户所有请求的数据

void setAttribute(String name, Object obj):存储数据
Object getAttribute(String name):通过建获取值
void removeAttribute(String name):通过建移除键值对

  1. 获取文件的真实路径(服务器路径),比如Windows中以盘符开头
ServletContext对象的方法:String getRealPath(String path)

1. 在webapps目录下的文件
String realPath = context.getRealPath("/a.txt"); //a.txt位于webapps目录下
// E:\spring\spring-dubbo\servlet-review\target\servlet-review\a.txt
System.out.println(realPath);

2. 在webapps/WEB-INF目录下的b.txt文件
String realPath = context.getRealPath("/WEB-INF/b.txt");


案例:文件下载器
需求:

  1. 页面显示超链接
  2. 点击超链接后弹出下载提示框
  3. 完成图片文件的下载
步骤:
1. 定义页面,编辑超链接href属性,指向servlet,传递资源名称filaname
2. 定义servlet
    1.获取文件名称(即finaname字段的值)
    2.使用字节输入流加载文件进内存
    3.指定response的响应头的content-disposition字段,
    设置资源的打开方式:content-disposition:attachment;filename = xxx(以附件的形式下载文件)
    4.将数据写出到response输出流

download.html如下,位于WEB-INF目录下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>resource download</title>
</head>
<body>
    <a href = "/demo_war/downloadServlet?filename=1.jpg">示例图片</a>
    <a href = "/demo_war/downloadServlet?filename=1.avi">示例视频</a>
</body>
</html>

中文文件名出错问题,解决思路:

  1. 获取客户端使用的浏览器版本信息(根据请求消息头中的user-agent字段的值)
  2. 根据不同的版本信息,设置文件的编码方式不同(通过response对象设置响应头的content-dispositon字段的值就会不同)

5.会话

1.概述
  1. 概念:一次会话中包含多次请求和响应。一次会话:浏览器第一次给服务资源发送请求,会话建立,直到有一方断开为止。
  2. 功能概述:在一次会话的范围内的多次请求间,共享数据
  3. 方式:
1. 客户端会话技术:Cookie
2. 服务端会话技术:Session
2.Cookie
  1. 概念:客户端会话技术,将数据保存到客户端
  2. Cookie的快速入门
1. 服务端中创建Cookie对象,绑定数据
new Cookie(String name, String value);
2. 服务端发送Cookie对象
response.addCookie(Cookie cookie);
3. 服务端再次获取Cookie,拿到数据
requset调用Cookie[] getCookies();方法 

示例:

// 创建一个servlet1,创建Cookie,发送Cookie到客户端
@WebServlet("/myServlet1")
public class MyServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie对象
        Cookie cookie = new Cookie("user", "NrvCer");
        // 发送Cookie对象
        resp.addCookie(cookie);
    }
}

// 创建一个servlet2,用于获取Cookie
@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取Cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println("myServelt2," + name + ":" + value);
            }
        }
    }
}

在同一个浏览器中依次发送http://localhost:8080/my_project_war_exploded/myServlet1http://localhost:8080/my_project_war_exploded/myServlet2两个请求,服务器中的servlet2将会获取到Cookie

  1. 问题:一次性可以发送多个Cookie吗?服务端中可以一次性发送多个Cookie
可以创建多个Cookie对象,使用response对象调用多次addCookie方法
即可发送多个Cookie
  1. 问题:Cookie在浏览器中保存多长时间?
1. 默认情况下,保存在内存中,关闭浏览器后,Cookie数据将被销毁
2. 持久化存储
    setMaxAge(int seconds);
        seconds为正数表示将Cookie数据保存到硬盘文件中,持久化存储,seconds的值还表示Cookie的存活时间
        seconds为负数是默认值,浏览器一关闭,Cookie数据被销毁
        seconds为0表示删除Cookie信息
        
// 创建Cookie对象
Cookie cookie = new Cookie("user", "NrvCer");
// 设置Cookie的存活时间
// setMaxAge的参数为正数表示将Cookie持久化到硬盘
// 30表示30秒后自动删除Cookie文件
cookie.setMaxAge(30);
// 发送Cookie
response.addCookie(cookie);
  1. Cookie中能否存储中文?在Tomcat8之前,Cookie中不能直接存储中文,需要将中文数据转码,一般采用URL编码; 在Tomcat8之后,cookie支持中文数据,但是特殊字符还是不支持(比如说空格),应当使用URL编码。
  2. cookie共享问题

假设在一个Tomcat服务器中部署了多个web项目,那么在这些web项目中cookie能否共享?

1. 默认情况下,cookie不能共享
2. 可以调用setPath方法实现cookie的共享,setPath(String path)是设置cookie的共享范围的。
默认情况下path设置为当前web项目的虚拟目录。如果要实现共享,将path设置为''/'

Cookie对象.setPath("/");    // 这行代码即可实现Cookie的共享

不同Tomcat服务器间Cookie共享问题?

setDomain(String path)方法:如果设置一级域名相同,那么多个服务器之间Cookie可以共享
例如
setDomain(".baidu.com");//则tieba.baidu.com和news.baidu.com中cookie可以共享
3.Cookie的实现原理

基于响应头的set-Cookie字段和请求头的Cookie字段实现

4.Cookie的特点和作用

特点:

  1. Cookie将数据存储在客户端浏览器
  2. 浏览器对于单个cookie的大小(比如说4kb)有限制,以及同一域名下的总cookie数量(比如20个)有限制

作用:

  1. cookie一般用于存储少量的不太敏感的数据
  2. 在不登录的情况下完成服务器对客户端的身份识别

案例:访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问!;如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串。

步骤:
1. 在服务器中的Servlet中判断是否有一个名为lastTime的cookie
    有:不是第一次访问
        1. 响应数据:欢迎回来,您上次访问时间为:显示时间字符串
        2. 写回cookie:lastTime = xxx
    没有:是第一次访问
        1. 响应数据:您好,欢迎您首次访问!
        2. 写回cookie:lastTime = xxx
@WebServlet(name = "CookieTest", value = "/CookieTest")
public class CookieTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应的消息体的数据格式以及编码
        response.setContentType("text/html;charset=utf-8");
        // 获取所有cookies
        Cookie[] cookies = request.getCookies();
        // 遍历cookies数组

        boolean flag = false;   // 没有为lastTime的cookie
        if (cookies != null && cookies.length != 0) {
            for (Cookie cookie : cookies) {
                // 获取cookie的名称
                String name = cookie.getName();
                // 判断名称是否为lastTime
                if ("lastTime".equals(name)) {
                    flag = true;
                    // 客户端存在该cookie,则表示客户端不是第一次访问

                    // 获取cookie的value值,即时间
                    String value = cookie.getValue();
                    // URL解码
                    value = URLDecoder.decode(value, "utf-8");
                    response.getWriter().println("<h1>欢迎回来,您上次访问时间为:" + value + "</h1>");

                    // 设置Cookie的value
                    // 获取当前时间的字符串,重新设置Cookie的值,发送cookie
                    Date date = new Date();
                    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = format.format(date);
                    // 对字符串进行URL编码
                    str_date = URLEncoder.encode(str_date, "utf-8");
                    cookie.setValue(str_date);
                    // 设置cookie的存活时间为一个月
                    cookie.setMaxAge(60 * 60 * 24 * 30);
                    response.addCookie(cookie);

                    break;
                }
            }
        }
        // 客户端中没有为lastTime的cookie,表示用户没有访问过
        if (cookies == null || cookies.length == 0 || flag == false) {
            // 设置Cookie的value
            // 获取当前时间的字符串,重新设置Cookie的值,发送cookie
            Date date = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd月 HH:mm:ss");
            String str_date = format.format(date);
            // URL编码
            str_date = URLEncoder.encode(str_date, "utf-8");
            Cookie cookie = new Cookie("lastTime", str_date);
            cookie.setValue(str_date);
            // 设置cookie的存活时间为一个月
            cookie.setMaxAge(60 * 60 * 24 * 30);
            response.addCookie(cookie);
            response.getWriter().println("<h1>您好,欢迎您首次访问!</h1>");
        }
    }
}
5.Session
  1. 概念:服务端会话技术,在一次会话的多次请求间共享数据,将数据保存到服务端的对象中。HttpSession
  2. HttpSession对象
void setAttribute(String name, Object obj):存储数据
Object getAttribute(String name):通过建获取值
void removeAttribute(String name):通过建移除键值对
  1. 快速入门
1. 获取HttpSession对象
2. 使用HttpSession对象

一个Servlet中设置属性
// 获取HttpSession对象
HttpSession session = request.getSession();
// 使用HttpSession对象
session.setAttribute("user","NrvCer");

另一个Servlet中获取属性
// 获取HttpSession对象
HttpSession session = request.getSession();
// 使用HttpSession对象
Object user = session.getAttribute("user");
System.out.println(user);
  1. 原理:Session是依赖于cookie的,在一次会话范围内,多次获取的session对象是同一个。note:服务端中通过request.getSession方法第一次获取Session,没有Cookie,会在内存中创建一个新的Session对象,同时在响应头加入set-cookie字段的信息。注意观察请求头cookie中JSESSIONID字段的值和响应头set-cookie中JSESSIONID字段的值。
  2. 当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?
1. 默认情况下不是同一个
2. 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。

Cookie cookie = new Cookie("JSESSIONID", session.getId());
// 设置cookie最大存活时间为1小时
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
  1. 客户端不关闭,服务器关闭,两次获取的session是同一个吗?
不是同一个,但是需要确保数据不丢失,涉及到的概念如下:
session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
(序列化)
session的活化:在服务器启动之后,将session文件转化为内存中的session对象即可。
(反序列化)
Tomcat服务器自动完成session的钝化和活化,IDEA不会

7. session什么时候被销毁(session的失效时间)

情况如下:
1. 服务器正常关闭
2. session对象调用invalidate()方法
# tomcat安装目录conf下的web.xml中的
# session-config标签可以配置失效时间
3. session有一个默认失效时间30分钟
  1. session的特点
1. session用于存储一次会话中的多次请求的数据,存在服务端
2. session可以存储任意类型,任意大小的数据

9.session和cookie的区别

1. session存储数据在服务端,cookie存储在客户端
2. session没有数据大小限制,cookie有
3. session数据安全,cookie相对于不安全

标签:String,获取,Cookie,cookie,Servlet,response
来源: https://www.cnblogs.com/xiaocer/p/16625537.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有