一:Cookie是在客户端保存信息。在发请求时将Cookie传到request头部。用于区分是否为同一个浏览器
二:session:用来在客户端与服务器之间保持状态的解决方案(就是能使用同一个session)。有时候Session也用来指解决方案的存储结构。
啥时创建session对象,啥时销毁session对象
啥时创建HttpSession对象?
Jsp:
是否浏览器访问服务端的任何一个jsp或者Servlet,服务器都会创建一个HttpSession对象呢?
不一定,若当前的jsp是客户端访问的当前WEB应用的第一个资源且jsp的page指定的session属性值为false
则服务器不会为当前jsp创建一个HttpSession对象。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"; session=""false"%>
Insert title here
<%=session.getId() %> //会报错
若当前的jsp不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession对象
则服务器不会为当前jsp创建一个HttpSession对象,而会把和当前会话关联的那个HttpSession对象返回给当前的jsp页面
Servlet:
若Servlet是客户端访问的第一个WEB应用的资源,则只有调用request.getSession()或者request.getSsssion(true)
才会创建HttpSession对象,若为request.getSession(false)则无法创建HttpSession对象。
String arr2 = (String) req.getSession().getAttribute("arr");
System.out.println("aqswd"+ arr2);
第二种情况与jsp的第二种情况一致
session="false"到底是啥意思?
表示当前jsp页面禁用session隐含对象,但可以用其他的显示的HttpSession对象.
request.getSession(false)是指如果存在session就返回session,如果不存在就返回一个null值,
getSession(true)的话就是不存在就创建一个新的session.
在Servlet中如何获取HttpSession对象
request.getSession(boolean create);
create为false,则若没有和当前jsp页面相关联的HttpSession对象,则返回null;若有,则返回true
create为true,一定返回一个HttpSession对象,若没有和当前jsp页面相关联的HttpSession对象,则服务器创建一个新的
HttpSession对象返回,若有则直接返回关联。
request.getSession()等同于request.getSession(true);
啥时销毁session对象
①直接调用HttpSession对象.invalidate();//使当前的session对象失效
session.invalidate();
②服务器卸载了当前WEB应用
③.超过HttpSession的过期时间 --> 单位是秒
out.println("
"+session.getMaxInactiveInterval());
修改HttpSession的过期时间 单位是秒
session.setMaxInactiveInterval(5);
在tomcat的web.xml下修改
30 -->(30分钟)
④并不是关闭了浏览器就销毁了HttpSession
有两中方法
第一种:url重写 http://192.168.1.102:8080/sessionx/sessionx.jsp
第二种:持久化Cookie
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String x = (String)session.getAttribute("name");
%>
Insert title here
SessionId : <%=session.getId() %>
<!--
如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话 标识号,则认为这个HttpSession对象不是新建的。
-->
isNew : <%=session.isNew() %>
MaxInactiveInterval : <%=session.getMaxInactiveInterval() %>
CreationTime : <%=session.getCreationTime() %>
getLastAccessedTime : <%=session.getLastAccessedTime() %>
1)开发时建议编写"绝对路径":写绝对路径绝对不会有问题但写相对路径肯定有问题。
在由Servlet转发到jsp页面,此时浏览器地址栏上显示的是Servlet的路径,而若jsp页面的超链接还是
相对于该jsp页面的地址,则可能会出现路径混乱的问题。
成功的案例 a.jsp和path下的b.jsp和c.jsp
错误案例 a.jsp和path2下的b.jsp和c.jsp和PathServlet
a.jsp --> PathServlet --> b.jsp (报错404)
| |
http://localhost:8080/sessionx/a.jsp http://localhost:8080/path3/b.jsp
成功的案例 a.jsp和path下的b.jsp和c.jsp
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
AAA page
to BBB
to BBB
to BBB
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
BBB page
to CCC
c.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
CCC page
to AAA
错误案例 的PathServlet
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello.s")
public class PathServlet extends BasicServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println(req.getContextPath());
String[] s = new String[]{"asd","sdf","dfg"};
req.setAttribute("name", s);
//先说明WEB应用的根目录为sessionx
//则如下请求响应的url地址为 http://localhost:8080/path3/b.jsp
//而不是http://localhost:8080/sessionx/path3/b.jsp
resp.sendRedirect("/path3/b.jsp");
}
}
2)编写绝对路径可以避免一些问题
①在javaWEB中啥叫"绝对路径":相对于当前WEB应用的根路径的路径
当前WEB应用的根路径:http://localhost:8080/sessionx
当前WEB应用的站点路径:http://localhost:8080
http://localhost:8080/sessionx/a.jsp-->是绝对路径
http://localhost:8080/a.jsp -->不是绝对路径
②如何完成编写
若/表示站点的根目录在其前面加上contextPath就可以了
to BBB
resp.sendRedirect(req.getContextPath()+"/path3/b.jsp");
3)javaWEB开发中的/到底表示啥 req.getContextPath()-->/sessionx
①当前WEB应用的根路径-->http://localhost:8080/sessionx:若/需要交给Servlet容器来处理则表示当前WEB应用的根路径
>请求转方法时
req.getRequestDispatcher("/path3/b.jsp").forward(req, resp); --> 不是url时要跳转到 http://localhost:8080/sessionx/path3/b.jsp
>web.xml中
ff
/hello.s -->表示的是http://localhost:8080/sessionx/hello.s
>各种定制标签的/ (例如jstl中的URL操作 https://blog.csdn.net/qq_35654259/article/details/86605271)
②WEB应用的根路径-->http://localhost:8080 :若/交给浏览器来处理
>超链接
to CCC -->表http://localhost:8080/sessionx/path3/c.jsp
>表单中的action
>做请求重定向response.sendRedirect:
response.sendRedirect("/a.jsp"); -->http://localhost:8080/a.jsp