Cookie、Session
Cookie和Session都是为了克服HTTP协议无状态的缺陷而诞生的技术,它们主要用于保存用户的状态信息。
- Cookie:Cookie是服务器发送到用户浏览器并保存在本地的一小块数据(可以保存多个),下次访问同一站点时,浏览器会将该数据发送回服务器。通过这种方式,服务器能够记住不同用户之间的状态。例如,当你登录一个网站,服务器会将你的用户ID和密码存储在cookie中,下一次打开这个网站时,服务器就能够辨认出你。
- Session:Session的工作机制是在服务器端生成一个Session ID,然后保存在本地(默认保存在内存中),访问者的每一次访问,都会将这个Session ID传递到服务器,服务器根据Session ID查找对应的Session,从而知道访问者的身份。可见,Session可以保存更多的数据,并且在关闭浏览器后,Session直到一定时间过后(默认30分钟)才会失效。
Cookie和Session的主要区别是,Cookie保存在客户端,而Session保存在服务器端。所以,如果你想保存大量的数据,并且不特别担心安全问题,那么Session可能是一个较好的选择。如果是保存一些小量的、对安全性要求较高的数据,那么可能Cookie会更好。
Cookie
Cookie[] cookies = req.getCookies(); //获得cookie
cookie.getName() //获得cookie中的key
cookie.getValue() //获得cookie中的value
Cookie cookie = new Cookie("lastTime",System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
- 一个Cookie只能保存一个信息
- 一个web站点可以给多个浏览器发送多个cookie,最多存放20个
- cookie大小限制4kb
删除cookie:
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期为0
Session
HttpSession session = req.getSession();
session.setAttribute("name","吴家昊");
String id = session.getId();
if (session.isNew()) {
resp.getWriter().write("session创建成功,id:"+id);
}else {
resp.getWriter().write("session已经在服务器中存在了。id:"+id);
}
// session创建时做了什么
Cookie cookie = new Cookie("JSESSIONID",id);
resp.addCookie(cookie);
<!-- 设置session失效时间-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
JSP
Java Server Pages:Java服务器端页面,和Servlet一样,用于动态Web技术!
浏览器向服务器发送请求,无论访问什么资源,其实都是在访问Servlet,Jsp也会转化为Java类
JSP本质上就是一个servlet
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//Jsp服务
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
-
判断请求
-
内置一些对象
final javax.servlet.jsp.PageContext pageContext; //页面上下文 javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; //applicarionContext final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWriter out = null; //out final java.lang.Object page = this; //page:当前 HttpServletRequest request //请求 HttpServletResponse response //响应
-
输出前增加的代码
response.setContentType("text/html; charset=UTF-8"); //设置页面响应类型 pageContext = _jspxFactory.getPageContext(this, request, response, null, false, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); out = pageContext.getOut(); _jspx_out = out;
-
在JSP页面中
-
Java代码原封不动的输出
-
如果是HTML代码,就会被转换之后再输出
out.write("<!DOCTYPE html>\r\n"); out.write("<html lang=\"en\">\r\n"); out.write(" <head>\r\n");
-
9大内置对象
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例 |
response | HttpServletResponse 接口的实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
pageContext.setAttribute("name1","小吴"); //保存的数据只在一个页面中有效
session.setAttribute("name2","小吴"); //保存的数据只在一次会话中有效,从打开浏览器到关闭
request.setAttribute("name3","小吴"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
application.setAttribute("name4","小吴"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器