16-cookie&session&JSP
一、cookie
客户端会话技术,将数据保存到客户端。
1.1、cookie方法
1)创建Cookie对象,绑定数据 new Cookie(String name, String value) 2)发送Cookie对象 response.addCookie(Cookie cookie) 3)获取Cookie,拿到数据 Cookie[] request.getCookies()
1.2、cookie原理
服务器创建,客户端浏览器进行保存。
通过响应消息头
set-cookie : msg=hello;服务器传输到客户端浏览器。
通过请求消息头
cookie : msg =hello;客户端浏览器传输到服务器。
IDEA自带的cookie
Idea-35b35af8=0c115b08-11d8-4061-91ce-8077ddbcdd93
访问同一服务器都会带cookie过去。
数量限制:
浏览器不同不同。
1.3、 cookie的细节
1、一次可以发送多个cookie
创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
20个cookie一个web应用。
2、cookie在浏览器中保存多长时间?
1)默认情况下,当浏览器关闭后,Cookie数据被销毁
2)持久化存储:
setMaxAge(int seconds)
正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
负数:默认值
零:删除cookie信息
3、cookie能不能存中文?
在tomcat 8 之前 cookie中不能直接存储中文数据。
对于tomcat8之前版本,在需要将中文数据转码--->一般采用URL编码(%E3)。
tomcat一般支持对应JDK版本,支持度最高。
在tomcat 8 之后,cookie支持中文数据。特殊字符()还是不支持,建议使用URL编码存储,URL解码解析
4、cookie共享问题?==>提升用户体验
1)假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
默认情况下cookie不能共享
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
如果要共享,则可以将path设置为"/" (只能是在同一 个tomcat服务器的不同web项目之间进行共享)
2)不同的tomcat服务器间cookie共享问题?
setDomain(String path): 如果设置一级域名相同,那么多个服务器之间cookie可以共享.
setDomain(".baidu.com"), 那么tieba.baidu.com和news.baidu.com中cookie可以共享。(.baidu.com)表示一级域名。
关于URL编码:
A %41
你好--%E4%BD%A0 %E5%A5%BD
1.4、Cookie的特点和作用
1)cookie存储数据在客户端浏览器
2)浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)。
作用:
1)cookie一般用于存出少量的不太敏感的数据。
2)在不登录的情况下,完成服务器对客户端的身份识别。
>JSP
1、概念:
* Java Server Pages: java服务器端页面
* 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
* 用于简化书写!!!
servlet服务器小程序。
一个java类要想被外界访问到必须是一个servlet。
index_jsp.java中index_jsp
继承org.apache.jasper.runtime.HttpJspBase 继承了HttpServlet
_jspService()中实现out.write等的一些方法。
2、原理
* JSP本质上就是一个Servlet
3、JSP的脚本:JSP定义Java代码的方式
1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
4. JSP的内置对象:
* 在jsp页面中不需要获取和创建(已经在xx_jsp.java中创建好了),可以直接使用的对象
* jsp一共有9个内置对象。
* 今天学习3个:
* request
* response
* out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
* response.getWriter()和out.write()的区别:
* 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
* response.getWriter()(尽量不适用此方法在jsp页面上进行输出)数据输出永远在out.write()之前==>不然会影响布局。
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/8.5.31 * Generated at: 2018-12-04 06:47:37 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { int i=3; //由<%! int i=3;%>创建的局部变量 private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static { _jspx_imports_packages = new java.util.HashSet<>(); _jspx_imports_packages.add("javax.servlet"); _jspx_imports_packages.add("javax.servlet.http"); _jspx_imports_packages.add("javax.servlet.jsp"); _jspx_imports_classes = null; } private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public java.util.Set<java.lang.String> getPackageImports() { return _jspx_imports_packages; } public java.util.Set<java.lang.String> getClassImports() { return _jspx_imports_classes; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod(); if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD"); return; } final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; try { response.setContentType("text/html;charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("\n"); out.write("\n"); out.write("<html>\n"); out.write(" <head>\n"); out.write(" <title>$Title$</title>\n"); out.write(" </head>\n"); out.write(" <body>\n"); out.write(" $END$\n"); out.write(" \n"); out.write(" <h1>hahhahaha哈哈哈</h1>\n"); out.write(" \n"); out.write(" "); System.out.println(); int i=5; out.write("\n"); out.write(" \n"); out.write('\n'); out.write(' '); out.write(' '); out.write("\n"); out.write(" \n"); out.write(" "); out.print( i); out.write("\n"); out.write(" \n"); out.write(" </body>\n"); out.write("</html>\n"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }
>session
1、概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
2、session方法
1)获取HttpSession对象:
HttpSession session = request.getSession();
2)使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
3、原理
通过响应消息头Set-Cookie:JSESSIONID=7BE58E34014A5C964DFAF05E4FE1914D; Path=/day16; HttpOnly 服务器传输到客户端浏览器。
通过请求消息头cookie : JSESSIONID=7BE58E34014A5C964DFAF05E4FE1914D;客户端浏览器传输到服务器。
4、细节
1)当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
* 默认情况下。不是。
* 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2)客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
* 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
* session的钝化:
* 在服务器正常关闭之前,将session对象系列化到硬盘上
* session的活化:
* 在服务器启动后,将session文件转化为内存中的session对象即可。
3)session什么时候被销毁?
1. 服务器关闭
2. session对象调用invalidate() 。
3. session默认失效时间 30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5、session的特点
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
* session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
4.session可以存储任意对象,cookie存储的是字符串对象。
Tomcat的work目录存储钝化的session
在IDEA中重启服务器的话。它的work目录能进行钝化。
但是重启work目录会被删除在新建。不能活化。
钝化也叫序列化(将一个对象转换为文件)。活化-反序列化
session服务器端的一个域对象。
个性化的浏览cookie中。

浙公网安备 33010602011771号