Servlet学习笔记

简介

浏览器请求处理流程:浏览器发请求 => 服务器tomcat( => 应用程序 ( => servlet) )

Servlet应用的三大作用域:requestsessionapplication

tomcat存放项目的层级结构

注释:servlet原引用包名 javax.servlet,2017年,被oracle把servlet捐给了eclipse基金会,不让使用java包名,tomcat10之后,servlet的包名更名为jakarta.servlet。

1. Web.xml(配置)

配置的加载顺序: ServletContext> context-param > listener > filter > servlet

web-app 根标签:xmlns:xsi 命名空间实例,xmlns xml文档位置,xsi:schemaLocation 模式位置

1.1 应用名称

应用名称:display-name // 不影响程序执行,可省略不写(非必须)

1.2 应用描述

应用描述:description // 不影响程序执行,可省略不写(非必须)

1.3 配置上下文参数

(1) 上下文参数:context-param // 可以配置多个或不写,用于程序启动时获取全局变量。

(2) 参数名:context-name

(3) 参数值:context-value // 值也可以是配置文件,默认在WEB-INFO下读取,配置到其他路径<param-value>classpath*:META-INF/xx.xml</param-value> 

1.4 配置监听器

(1) 监听器:listener // 监听全局,会话,请求,的创建销毁与域对象的变更

(2) 监听处理类:listener-class

1.5 配置过滤器

(1) 过滤器:filter

(2) 过滤器名:filter-name

(3) 过滤器类:filter-class

(4) 过滤器参数:init-param, param-name, param-value

(5) 过滤器配置:filter-mapping

(6) 过滤器过滤路径:url-pattern // 匹配的是url名称与资源是否存在无关。

(7) 过滤拦截器名:servlet-name // web.xml只能拦截web.xml配置的servlet名,注解servlet拦不住

(8) 过滤器访问权限:dispatcher

注释:dispatcher配置:REQUEST(过滤器应用于来自客户端的请求), INCLUDE(应用于RequestDispatcher的include请求), FORWARD(应用于RequestDispatcher的forward请求), ERROR(应用于发生错误引起的转发请求)

1.6 配置处理器

(1) 处理器:servlet

(2) 处理器名:servlet-name

(3) 处理器类:servlet-class

(4) 处理器参数:init-param, param-name, param-value

(5) 处理器加载顺:load-on-startup // 不写或负数首次访问加载,0-10由小到大加载

(6) 处理器配置:servlet-mapping

(7) 处理器处理路径:url-pattern

1.7 配置会话

(1) 会话配置:session-config

(2) 会话超时时间:session-timeout // 单位分钟,负数或0永久有效。

注释:应用web.xml不设置默认执行的是tomcat的配置30分钟会话超时。

1.8 配置文件后缀

(1) 配置MIME:mime-mapping

(2) 文件后缀:extension 

(3) 传送方式:mime-type

注释:当浏览器访问服务器的文件时,根据文件后缀匹配extension找到mime-type,以该方式将文件传输给浏览器。text/plain和text/html是浏览器可识别直接能打开的类型。浏览器不识别的类型会下载该文件。tomcat默认配置了大部分类型的文件,应用内配置mime主要用于自定义文件后缀的识别。***注意修改mime-mapping配置后需要清空浏览器缓存才会生效

1.9 配置欢迎页

(1) 欢迎页列表:welcome-file-list  // 默认欢迎页,不指定servlet请求的默认显示页面

(2) 欢迎页: welcome-file // 配置默认显示页面,按定义的先后顺序,执行优先级表示

注释:不配置默认找 webapp根目录下的 index.html 没有则找 index.jsp,还没有报404错误

1.10 配置异常处理

(1) 异常配置:error-page

(2) 错误码:error-code // 404,配置错误码,拦截错误或response.sendError返回的错误码

(3) 异常类:exception-type // 异常类配置

(4) 异常处理页面:location //  值 /xxx.jsp,/servlet  要跳转的页面或请求

注释:jsp配置的是单个页面的错误页,优先级高。web.xml配置的是整个应用的错误页。

java.lang.Throwable是异常的根类,location必须以/开头,代表应用根目录 

1.11 配置JSP设置

详细在下一个jsp笔记中记录

jsp-config

  taglib

  jsp-property-group

    description 设置说明

    display-name 设定名称

    url-pattern 影响范围 例如:*.jsp

    el-ignored (true 不支持el , false 支持el)

    scripting-invalid (true 不支持脚本 <% src.. %>

    page-encoding (jsp网页编码 例如:GBK)

    include-prelude (jsp网页头)

    include-coda (jsp网页结尾)

2. 全局应用(application)

Web容器(tomcat)启动时为每个web应用创建唯一的ServletContext实例

2.1 获取ServletContext方式

(1) request.getServletContext() // Servlet,GenericServlet,HttpServlet,JSP

(2) request.getSession().getServletContext() // HttpServlet,JSP

(3) getServletConfig().getServletContext() // Servlet,GenericServlet,HttpServlet,JSP

(4) getServletContext() // GenericServlet,HttpServlet,JSP

 

2.2 获取Context-Param的值

(1) 获取参数value值:servletContext.getInitParameter("param1");

(2) 获取全部name值:servletContext.getInitParameterNames();

2.3 ServletContext域对象

(1) 获取全局域对象值:servletContext.getAttribute("key")

(2) 设置全局域对象值:servletContext.setAttribute("key","value")

(3) 删除全局域对象值:servletContext.removeAttribute("key");

(4) 获取全局域对象名:servletContext.getAttributeNames();

2.4 ServletContext转发 

全局转发:context.getRequestDispatcher("/WEB-INF/JSP/xx.jsp").forward(request, response);  // 省略了/应用名,只能转本应用下 /开头的应用根目录请求,不能跨应用。与请求转发不同必须以/开头。

2.5 获取配置文件内容

(1) 新建配置对象:Properties pro = new Properties();

(2) 取得ServletContext:ServletContext context = getServletContext();

(3) 取得文件流:InputStream in = context.getResourceAsStream("/WEB-INF/test.properties");

(4) 加载配置文件数据:pro.load(in);

(5) 关闭文件流:in.close();

(6) 取得配置文件内容:String name = (String)pro.getProperty("username");

2.6 ServletContext方法

(1) 获取应用请求路径:servletContext.getContextPath(); // 获取【/应用的请求】

(2) 获取配置的项目名:servletContext.getServletContextName(); // 获取应用名

(3) 获取服务器名:servletContext.getServerInfo(); // 获取 Apache Tomcat/版本号

(4) 获取项目盘符:servletContext.getRealPath("/"); // 获取 盘符:\路径...\应用名\

(5) 略 

3. 监听器(listener)

一共有8个监听器接口,随着技术变化只有ServletContextListener有用。

3.1 应用监听器

(1) 监听全局对象的创建与销毁:ServletContextListener // 服务器启动时创建,停止时销毁

 (2) 监听全局的域对象:ServletContextAttributeListener // 添加修改删除全局域时触发

3.2 请求监听器

(1) 监听请求的创建与销毁:ServletRequestListener // 请求开始创建,请求结束销毁

(2) 监听请求的域对象:ServletRequestAttributeListener // 添加修改删除请求域时触发

3.3 会话监听器

(1) 监听会话的创建与销毁:HttpSessionListener // 首次请求后创建,超时或退出销毁

(2) 监听会话的域对象:HttpSessionAttributeListener // 添加修改删除会话域时触发

(3) HttpSessionActivationListener

(4) HttpSessionBindingListener 

3.4 注解配置listener

(1) 注解配置:@WebListener

4. 过滤器(filter)

在后端处理请求之前拦截请求,在响应返回浏览器之前处理响应

4.1 创建过滤器

创建filter步骤:(1)实现filter接口,(2)重写dofilter方法,(3)配置xml文件

4.1.1 实现Filter接口

需重写doFilter方法

(1) 实现init方法:init // 项目启动加载方法初始化只调用1次,可获取filterConfig

(2) 实现doFilter方法:doFilter // (req, res, chain) 执行过滤chain.doFilter转下一个过滤器处理

(3) 实现destroy方法:destroy // 项目停止时,执行。

4.1.2 继承GenericFilter抽象类

GenericFilter实现了Filter接口,需重写doFilter方法

(1) 初始化:init

(2) 获取Filter名:getFilterName() // web.xml配置的filter-name

(3) 获取全局对象:getServletContext()

(4) 获取Filter对象:getFilterConfig()

(5) 获取Filter参数名:filterConfig.getInitParameterNames()

(6) 获取Filter参数值:filterConfig.getInitParameter("name")

4.1.3 继承HttpFilter抽象类

HttpFilter继承了GenericFilter,需重写doFilter方法

(1) 执行过滤器:doFilter // 过滤器处理完,要继续执行需要调用FilterChain的doFilter方法,不调用则不会执行后续filter或servlet,若过滤器拦截请求用return结束程序。

4.2 Filter执行顺序

(1) 第一优先级:url-pattern // 【/*】【*.do】由配置顺序从上到下先执行

(2) 第二优先级:servlet-name // 【web.xml配置的servlet-name】

4.3 注解配置Filter

执行优先级:urlPatterns或value【/*】【*.do】先执行,servlet-name后执行,

注释:同级的多个urlPatterns的过滤器,可能是按文件名的先后顺序执行的。

4.3.1 注解配置Filter的URL

(1) URL配置:@WebFilter(urlPatterns="/xxx")  // 等同于web.xml的<url-pattern>

(2) 默认属性:@WebFilter(value="/xxx")  // value与urlPatterns 作用相同

(3) 省略属性:@WebFilter("/xxx")  // 只有value一个属性时可以省略属性名

4.3.2 注解Filter的URL格式

(1) 多路径拦截:@WebFilter({"/xxx/*", "*.do"}) // 可指定拦截多种路径访问

(2) 精确拦截:@WebFilter("/xxx/xx") // 多层目录精确匹配

(3) 目录拦截:@WebFilter("/xxx/*") // 结尾/*任意匹配

(4) 扩展名匹配:@WebFilter("*.do") // 【任意.do】访问,前不加斜线

4.3.3 注解Filter的属性

(1) filterName等同于配置文件 <filter-name>

(2) valuevalue与urlPatterns等同于配置文件 <url-pattern>

(3) initParams等同与配置文件 <init-param>

(4) servletNames// 指定过滤的servlet名,取web.xml或@WebServlet配置的servlet名

(5) dispatcherTypes等同于配置文件 <dispatcher>

注释:@WebInitParam只能同 Webservlet 和WebFilter一起使用,只有name和value属性

4.4 Filter案例

4.4.1 请求字符集过滤

处理请求之前,统一设定字符集

4.4.2 浏览器不缓存页面过滤

4.4.3 请求资源过滤

设置允许访问的资源

4.4.4 用户登录过滤

判断用户是否登录,及登录用户访问权限

5. 处理器(servlet)

5.1 创建Servlet

创建servlet步骤:(1)继承Servlet接口,(2)重写抽象方法,(3)web.xml配置Servlet

5.1.1 实现Servlet接口

(1) init请求后判断没有servlet对象,则实例化一个对象,进行初始化init,只执行一次。

(2) getServletConfig用于获取servlet配置对象

(3) getServletInfo用于获取servlet的参数信息

(4) service浏览器发请求后(多次请求多次调用),创建req,res对象,开新线程,调用service

(5) destroy容器(tomcat)正常关闭时销毁处理,调用destroy

注释:获取ServletConfig的方式,1.init参数获取,2.Servlet子类中getServletConfig()获取

5.1.2 继承GenericServlet类

(1) 实现service方法:service // 处理请求,及响应 

5.1.3 继承HttpServlet类

(1) 实现doGet方法:doGet // 处理get请求

(2) 实现doPost方法:doPost // 处理post请求

注释:doPut处理put请求,doDelete处理delete请求,doHead:读web头,doOptions:查特点选项,doTrace:返回收到的请求

5.2 注解配置Servlet

Servlet3.0新增注解方式,无需配置servlet的web.xml文件,可不创建web.xml

5.2.1 注解配置Servlet的URL

(1) URL配置:@WebServlet(urlPatterns="/xxx")  // 等同于web.xml的<url-pattern>

(2) 默认属性:@WebServlet(value="/xxx")  // value与urlPatterns 作用相同

(3) 省略属性:@WebServlet("/xxx")  // 只有value一个属性时可以省略属性名

5.2.2 注解Servlet的URL格式

(1) 多路径请求:@WebServlet({"/xxx", "/xxx"}) // 可指定多种路径访问

(2) 精确匹配:@WebServlet("/xxx/xx") // 多层目录精确匹配

(3) 目录匹配:@WebServlet("/xxx/*") // 结尾/*任意匹配

(4) 扩展名匹配:@WebServlet("*.do") // 【任意.do】访问,前不加斜线

注释:url=主机(www.xx.com) +程序名(/webxx) + 处理器名(/xxservlet])+方法(/xx.do])+参数(?xx=xx)。uri=程序+servlet+方法。

5.2.3 注解Servlet的属性

(1) name等同于配置文件 <servlet-name>

(2) valuevalue与urlPatterns等同于配置文件 <url-pattern>

(3) initParams等同与配置文件 <init-param>

(4) loadOnStartup等同于配置文件 <load-on-startup>

注释:@WebInitParam只能同 Webservlet 和WebFilter一起使用,只有name和value属性

5.3. Servlet生命周期

(1) 实例和初始化:init

(2) 就绪:service

(3) 销毁:destroy

6. 请求(request)

6.1 表单请求

6.1.1 发送请求方式

(1) url回车  get方式

(2) 超链接  get方式

(3) 表单提交submit, js, ajax) get, post 等

6.1.2 提交表单方式

(1) 表单按钮提交:<input type="submit"> // 提交表单到form的action, 页面会刷新

(2) 按钮提交:<form> <button>提交</button> </form>  // form内的按钮默认是提交按钮

(3) JS事件提交:<input type="button" onClick="sub1"> <script> function sub1() { document.getElementById("formid").submit();</script>

(4) 修改form默认提交事件:页面加载后 document.getElementById("formid").onSubmit = function () { ... this.submit(); }

(5) ajax提交:

6.2 请求方式

(1) GET:参数在url中, 发送文本有限制225字符以内, 不安全数据url可见(url可缓存)

(2) POST:参数在请求体中,发文本或二进制长度没限制,相对安全url不可见(无缓存)

(3) PUT(4) DELETE(5) HEAD(6) OPTIONS(7) TRACE

注释:connect保留 

6.3  http请求数据格式

6.3.1 http请求格式

(1) 请求行:请求方式  请求uri  请求协议/版本get /xxx.html http/1.1

(2) 请求头(键:值):

(3) 请求空行

(4) 请求体:get没有请求体。post请求, 封装内容(name=value&name=value)格式

6.3.2 请求头

  user-Agent:        // 浏览器及版本信息

  accept: text/html  //浏览器接收的MIME类型(text/heml, application/xhtml+html, */*)

  accept-language:zh-CN  //浏览器首选语言, 支持的语言环境

  accept-encoding:   // 客户端处理编码类型(gzip, )

  Referer: http:localhost/xx.html  // 告诉服务器请求来源,防止盗取链接,可统计来源信息

  Connection:   // 连接信息,是否链接状态

  host:localhost:8080  // 服务器主机名和端口号

  cookie: 会话信息

  content-type:表单编码类型(text/plain, multipart/form-data(上传文件), application/x-www-form-urlencoded(默认格式))

6.4 处理请求(获取请求数据)

服务器封装请求的数据,作成request,response对象,传给service方法处理。

6.4.1 获取请求行

(1) 获取客户端主机名:servletRequest.getRemoteHost()

(2) 获取客户端IP:servletRequest.getRemoteAddr()

(3) 获取客户端端口号:servletRequest.getRemotePort()

(4) 获取URL:httpServletRequest.getRequestURL()

(5) 获取URI:httpServletRequest.getRequestURI()

(6) 获取Servlet请求路径:httpServletRequest.getServletPath()

(7) 获取请求方式:httpServletRequest.getMethod()

过滤普通权限访问管理路径

6.4.2 获取请求头

(1) request.getHeader("key")

6.4.3 获取post请求体

一般用不上这种方式

 (1) 获取字符输入流:BufferedReader r = request.getReader() // 只能操作字符数据

 (2) 获取内容:String line = nullwhile( (line=r.readLine() ) != null ) { ... } //line是&连接的参数,username=%E6%9D%8E%E5%9B%9B1&pwd=123&qx=0&ah=2&ah=3&zy=3

注释:此解析不出中文 

6.4.4 获取请求参数

(1) 获取表单参数值:getParameter("name") // text,password,hidden,radio,select,textarea

(2) 获取表单复数参数值:getParameterValues("name") // checkbox, select(multiple可多选)

(3) 取表单的所有请求名:getParameterNames() 

(3) 取表单的所有键值对:getParameterMap() 

6.4.5 请求域对象

(1) 获取请求域的值:request.getAttribute("key")

(2) 设置请求域的值:request.setAttribute("key", value)

(3) 删除请求域的值:request.removeAttribute("key")

(4) 获取请求域的名称:request.getAttributeNames()

6.4.6 请求转发

(1) 请求转发:req.getRequestDispatcher("/WEB-INF/JSP/xx.jsp").forward(request, response);  

注释:不能跨应用转发,只能访问当前应用内部项目资源,一次请求服务器内部转发,Url显示地址不变,/开头表示应用根目录,不以/开头表示servlet或jsp同级目录。

6.4.7 请求中文乱码解决

(1) 获取请求编码:request.getCharacterEncoding()

(2) tomcat7及以下(get,post)通用解决方案:

String reqstr = request.getParameter("name").getBytes("iso8859-1");

String str = new String(reqstr, "utf-8");

(3) tomcat8解决方案:

get解决对策:tomcat8默认解决了get的乱码问题

post解决对策: request.setCharacterEncodeing("UTF-8")

6.5 http协议

基于tcp/ip 端口80 一次请求一次响应,http无状态,请求之间独立。

版本 , 一次url访问图片,会产生多层请求,

版本1.0 每次请求建立新链接

版本1.1 复用链接

6.6 tcp协议

6.6.1 三次握手

第一次握手:SYN=1, seq=x(随机) //本地端口(50515) => 访问服务器端口(80)

第二次握手:SYN=1, ACK=1 (1有效,0无效), ack=x+1, seq=y(随机) // 服务器80=>本地50515

第三次握手:ACK=1, ack=y+1, seq=x+1 // 本地50515=>服务器80

注释:本地=>服务器(我要访问你, 我是x标识, 我可能有其他连接x1,x2,), 服务器=>本地(可以访问, 我将你的x访问标记为y, 要建立连接么), 本地=>服务器(我是x, 你通过y标识同意了我的请求,让我们建立连接)

6.6.2 四次挥手

第一次挥手FIN=1, seq=U // 本地端口50515 => 服务器端口80

第二次挥手ACK=1, ack=U+1, seq=V // 80 => 50515

第三次挥手FIN=1, ack=U+1, ACK=1, seq=W // 80 => 50515 

第四次挥手:ACK=1, ack=W+1, seq=U+1  // 50515 => 80

注释:本地=>服务器(我要断开连接, 我是U), 服务器=>本地(我知道了, U你这次请求我标记为V, 等我会, 看看数据都给你传完没),服务器=>本地(U, 你的数据传完了,你可以通过W来断开连接,若没收到第4步回复再次这个发送),本地=>服务器(我是U, 你标记为W的请求可以断开了)

服务器发送探测报文,一般默认2小时,在应用层做心跳机制

7. 响应(response)

7.1 http响应

7.1.1 响应格式

(1) 状态行:请求协议/版本  状态码  响应状态HTTP/1.1 200 OK

(2) 响应头(键:值):Date: sat 01 Aug 2023/10/25 23:52:59 GMT...Content-Type: text/html

(3) 响应空行

(4) 响应HTML:<html>...</html>

7.1.2 响应类型

(1) 响应类型:Content-Type // 设置服务器传送给浏览器数据的类型(MIME是因特网标准,用于识别文本,图片,声音,视频,程序专用数据等)

(2) 后端设置响应类型:res.setContenType("text/html; charset=UTF-8");  

(3) 设置下载文件名:res.setHeader("Content-Disposition", "attachment;filename="+file.getName()); // 当响应类型为下载文件时需要设置文件名

word文档(application/msword)AcrobatPDF(application/pdf)Excel(application/vnd.ms-excel)ZIP文件(application/zip)gif图片(image/gif)jpeg图片(image/jpeg)html文档(text/html)文本(text/plain)mpeg视频(video/mpeg)midi音频(audio/midi)

7.2 响应数据

字符流:res.getWriter().write("<html>xxx</html>"); // 返回html或字符数据

字符流:res.getWriter().print(97); // 返回html或字符数据,浏览器识别 ASCII为97的字符,显示a

字节流:res.getOutputStream().write("<html>...".getBytes());// html或文本或二进制文件

字节流:res.getOutputStream().print(FileInputStream.read()...);// html或文本或二进制文件

7.3 响应中文乱码

方案1:

(1) 设置服务器编码:servletRes.setCharacterEncodeing("utf-8); 

(2) 设置客户端编码:httpRes.setHeader("content-type", "text/html;charset=utf-8") 

方案2:

(1) 同时设置服务器和客户端编码:servletRes.setContentType("text/html;charset=utf-8") 

7.4 重定向

res.sendRedirect("Servlet20.do"); // 不以/开头为本应用目录,直接访问servlet

res.sendRedirect("/应用名/servlet"); // 以/开头为tomcat服务器目录,需指定应用名

res.sendRedirect("http://localhost:8080/应用名/servlet请求"); // 可重定向到其他网站

注释:重定向不能在响应out.flush(提交)之后进行,重定向不能请求WEB-INF下资源

7.5 响应异常

 res.sendError(异常状态码) // 返回一个异常code, 可通过web.xml拦截该异常 

8. 会话(session)

http请求是无状态的,跟踪客户端状态有4种方式

1.session, 2 cookie 3 url重写, 4隐藏表单域

8.1 获取session

(1) 获取session:HttpSession session = htttReq.getSession(); // 存在获取,不存在创建

(2) 获取session:httpReq.getSession(boolean); // true无对象则创建,false无对象返回null 

(2) 获取Session标识:String id =session.getId(); // JSESSIONID服务器存在浏览器的sessionid,浏览器访问不传或者服务器没有这个id则服务器新建sessionid传给浏览器保存。

8.2 session域对象

(1) 获取会话域的值:session.getAttribute("key")

(2) 设置会话域的值:session.setAttribute("key", value)

(3) 删除会话域的值:session.removeAttribut("key")

(4) 获取会话域所有名称:session.getAttrabuteNames()

8.3 会话销毁

8.3.1 设置会话超时时间

(1) session.setMaxInactiveInterval(秒数); //负数和0当前会话永久有效,web.xml对所有会话有效

(2) 程序的web.xml文件

(3) tomcat 的conf目录下 web.xml文件

注释:1.httpsession.set方法设置优先级最高,2 web.xml配置优先级第二,3tomcat conf 的web.xml配置最低

8.3.2 会话超时的方式

(1) 长时间不操作页面则会话失效。// 根据配置的时间(默认30分钟)操作后重新计时。

(2) 关闭浏览器 // 关闭浏览器会清除JSESSIONID, 下次请求就不会传id, 相当于session失效。

(3) 立即销毁:session.invalidate();

注释:JSESSIONID存在cookie里,服务器返回 响应头 set-Cookie: JSESSIONID = 123AB24C... (32位16进制)。客户端访问时,发送请求头 Cookie: JSESSIONID = 123AB24C...

9. cookie

Cookie 是存储在客户端计算机上的文本信息。(包:javax.servlet.http.Cookie )

(1) 服务器脚本向浏览器发送一组Cookie信息,浏览器将信息存在本地。

(2) 浏览器向服务器发送请求时,把本地Cookie信息一起发送给服务器,用来让服务器识别用户。

9.1 cookie创建设置获取

(1) 新建cookie对象:Cookie cookie = new Cookie("key", "value");

(2) 获取cookie名:cookie.getName(); // cookie名不可变更

(3) 获取cookie值:cookie.getValue(name);

(4) 设置cookie值:cookie.setValue("");

(5) 向客服端发送:response.addCookie(cookie);

(6) 获取cookie:Cookie[] cookies = request.getCookies(); // cookie只能从请求中获取,无法单独获取某一个cookie,只能全部获取if ( cookies != null && cookies.length > 0) {   for (Cookie cookie : cookies) {...

7.2 cookie到期时间

(1) 关闭cookie失效:cookie.setMaxAge(-1)  // 默认-1 关闭浏览器cookie失效

(2) 设置cookie失效时间:cookie.setMaxAge(正数) // 单位秒,超时浏览器自动删除该cookie

(3) 删除cookie: cookie.setMaxAge(0) // 0代表删除cookie

7.3 cookie存储中文信息

(1) 中文存储:tomcat7的cookie不能存中文。tomcat8的cookie可以存中文,不能存空格等特殊符号。

(2) 中文及特殊符号存储:URLEncoder.encode("这是 中文",Charset.forName("UTF-8"))

(3) 中文及特殊符号获取:URLDecoder.decode(cookie.getValue(),"UTF-8")

7.4 cookie路径

(1) 服务器cookie:cookie.setPath("/") // 当前服务器任意项目可获取

(2) 应用cookie:cookie.setPath("/项目名") // 只有当前项目可获取,默认设定。

(3) 请求cookie:cookie.setPath("/项目名/路径") // 只有指定的请求或路径可获取

 7.4 cookie安全

(1) http传送:cookie.setHttpOnly(true) // http传送

(2) 加密传送:cookie.setSecure(true) // https传送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/214597.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机场信息集成系统系列介绍(2):机场航班报文处理系统

本文介绍机场航班报文处理系统。#机场##sita##AFTN##航空# 一、定义 机场航班报文处理系统是一种基于计算机技术的自动化处理系统&#xff0c;用于接收、解析、处理和传递与航班相关的报文信息。这些报文可能包括航班计划、航班状态更新、旅客信息等&#xff0c;通常来源于航…

(C++)只出现一次的数字I--异或

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

【Linux】进程间通信之共享内存/消息队列/信号量

文章目录 一、共享内存的概念及原理二、共享内存相关接口说明1.shmget函数2.ftok函数3.shmat函数4.shmdt函数5.shmctl函数 三、用共享内存实现server&client通信1.shm_server.cc2.shm_client.cc3.comm.hpp4.查看ipc资源及其特征5.共享内存的优缺点6.共享内存的数据结构 四、…

【GIS】JDK版本升级到17后,GeoServer的图层无法通过openLayer预览

JDK版本升级到17后&#xff0c;图层无法通过openLayer预览 1. 错误图示 终端输出的错误 网页端无法显示图层&#xff0c;并且输出错误提示 2.原因猜测 估计可能是由于java17的模块化&#xff0c;Java被分成了多个独立部署和运行的模块&#xff0c;这使得Java应用能够更快…

Wireshark添加自定义协议解析

最终效果如下&#xff1a; 参考文档&#xff1a;https://mika-s.github.io/topics/ 此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议 安装Wireshark https://www.wireshark.org/上下载安装包安装即可。我的安装路径是D:\Install\Wireshark&#xff0c;在W…

kafka学习笔记--基础知识概述

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

IT新闻资讯系统,使用mysql作为后台数据库,此系统具有显示数据库中的所有信息和删除两大功能。

表的准备&#xff1a; -- MySQL Administrator dump 1.4 -- -- ------------------------------------------------------ -- Server version 5.1.40-community /*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */; /*!40101 SET OLD_CHARACTER_SET_RESULTSCHAR…

nodejs+vue+微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

考虑到实际生活中在个性化服装搭配方面的需要以及对该系统认真的分析,将app权限按管理员和用户这两类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有个人中心、用户管理、个性穿搭管理、我的衣橱管理、服饰分类管理、我的收藏管理、系统管理等功能。 …

Unity使用打成图集的Sprite作为模型贴图使用的问题

大家好&#xff0c;我是阿赵。   有时候用Unity引擎做项目的时候&#xff0c;会遇到这样的需求&#xff0c;美术做了一些模型或者特效&#xff0c;然后策划想在游戏运行的时候&#xff0c;读取一些游戏图标放在特效或者模型上面当做贴图使用。   这个需求实现起来很简单&am…

【Hive】启动beeline连接hive报错解决

1、解决报错2、在datagrip上连接hive 1、解决报错 刚开始一直报错&#xff1a;启动不起来 hive-site.xml需要配置hiveserver2相关的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bin…

DIP——边缘提取与分割

1.使用canny算法进行边缘提取 本实验比较简单&#xff0c;基本思路是对原图像进行一个高斯模糊处理&#xff0c;用于去噪&#xff0c;之后转换为灰度图&#xff0c;直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘&#xff0c;则通过按位与操作&#xff0c;将原始彩色…

【小沐学Python】Python实现TTS文本转语音(speech、pyttsx3、百度AI)

文章目录 1、简介2、Windows语音2.1 简介2.2 安装2.3 代码 3、pyttsx33.1 简介3.2 安装3.3 代码 4、ggts4.1 简介4.2 安装4.3 代码 5、SAPI6、SpeechLib7、百度AI8、百度飞桨结语 1、简介 TTS(Text To Speech) 译为从文本到语音&#xff0c;TTS是人工智能AI的一个模组&#xf…

Redis 持久化 —— 超详细操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB与AOF对比4.5 持久化技术转型 五、Redis 主从集群六、Redis 分布式系统七、Redis 缓存八、Lua脚本详解九、分布式锁 数据库系列文章&#xff1a; 关系型数据库: MySQL —— 基础语法大全…

ISNAS-DIP: Image-Specific Neural Architecture Search for Deep Image Prior

ISNAS-DIP&#xff1a;用于深度图像先验的图像特定神经架构搜索 论文链接&#xff1a;https://arxiv.org/abs/2111.15362v2 项目链接&#xff1a;https://github.com/ozgurkara99/ISNAS-DIP Abstract 最近的研究表明&#xff0c;卷积神经网络(CNN)架构在频谱上偏向较低频率&…

【IDEA】IntelliJ IDEA中进行Git版本控制

本篇文章主要记录一下自己在IntelliJ IDEA上使用git的操作&#xff0c;一个新项目如何使用git进行版本控制。文章使用的IDEA版本 IntelliJ IDEA Community Edition 2023.3&#xff0c;远程仓库为https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Git…

idea 本身快捷键ctrl+d复制 无法像eclipse快捷键ctrl+alt+上下键,自动换行格式问题解决

问题 例如我使用ctrld 想复制如下内容 复制效果如下&#xff0c;没有自动换行&#xff0c;还需要自己在进行调整 解决 让如下快捷键第一个删除 修改成如下&#xff0c;将第二个添加ctrld 提示&#xff1a;对应想要修改的item&#xff0c;直接右键&#xff0c;remove是删…

JVM进程缓存

引言 缓存在日常开发中启动至关重要的作用&#xff0c;由于是存储在内存中&#xff0c;数据的读取速度是非常快的&#xff0c;能大量减少对数据库的访问&#xff0c;减少数据库的压力。我们把缓存分为两类&#xff1a; 分布式缓存&#xff0c;例如Redis&#xff1a; 优点&…

Docker部署开源分布式任务调度平台DolphinScheduler并实现远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

解决electron修改主进程后需要重启才生效

nodemon 是一种工具&#xff0c;可在检测到目录中的文件更改时通过自动重新启动节点应用程序来帮助开发基于 node.js 的应用程序 nodemon 特性 自动重新启动应用程序。检测要监视的默认文件扩展名。默认支持 node&#xff0c;但易于运行任何可执行文件&#xff0c;如 python、…