Java之Cookie与Session
2021/8/5 1:06:25
本文主要是介绍Java之Cookie与Session,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Cookie、Session
Cookie:服务端生成Cookie发给客户端用于认证
Session:服务端进行进行登记,每人有不同的Session
session与cookie的区别
Cookie:当用户打开浏览器访问网站,服务器端会生成一个cookie发给客户端,客户端访问网站就会携带cookie
Session:客户端请求服务端,服务端会生成一个sessionid,每个用户唯一,用类似于发给客户端cookie的方式发给客户端这个sessionid,用sessionid来辨别这次请求是那个客户端发来的。而在服务器端保存的session会存入很多东西,也是根据sessionid来辨别这些session中的内容是哪个用户的。
- cookie是将用户的数据写给用户的浏览器,用浏览器保存,可保存多个cookie
- session是将用户的数据,写给用户的session,服务器端保存,不建议保存太多
- session由服务器创建
cookie
一个web站点可以发多个cookie
常用方法
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一个cookie resp.addCookie(cookie); //响应给客户端cookie Cookie[] cookies = req.getCookies(); //获得cookie数组 cookie.setMaxAge(24*60*60); //设置cookie有效期 cookie.getName() //获得cookie名字 cookie.getValue() //获得cookie的值
服务端发送给客户端cookie
//服务端发给客户端cookie Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); resp.addCookie(cookie);
服务端获取客户端带来的cookie
//服务器端从客户端获取cookie Cookie[] cookies = req.getCookies(); //这里返回数组,可能存在多个cookie
设置cookie有效期,以秒为单位
cookie.setMaxAge(24*60*60);
例子:保存cookie上一次访问的时间
public class CookieDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); PrintWriter out = resp.getWriter(); //服务器端从客户端获取cookie Cookie[] cookies = req.getCookies(); //这里返回数组,可能存在多个cookie //判断cookie是否为空 if (cookies!=null){ out.write("上一次访问的时间是:"); for (int i = 0; i <cookies.length; i++) { //获取cookie Cookie cookie = cookies[i]; //获取cookie中的名字 if (cookie.getName().equals("lastLoginTime")){ //获取cookie中的值 long lastLoginTime = Long.parseLong(cookie.getValue()); Date date = new Date(lastLoginTime); out.write(date.toLocaleString()); } } }else { out.write("第一次访问"); } //服务端发给客户端cookie Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
删除cookie
不设置有效期,关闭浏览器自动失效
设置cookie有效期为0
创建一个cookie,名字必须和要删除的cookie名字一致
public class CookieDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie lastLoginTime = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //设置有效期为0 lastLoginTime.setMaxAge(0); resp.addCookie(lastLoginTime); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
URL编解码
URLEncoder.encode("str", "utf-8"); //str进行URL编码 URLDecoder.decode("str", "utf-8"); //str进行URL解码
session
session在浏览器一打开就存在了,会类似于发送给客户端cookie一样。但这只是SessionID的操作,Session还可以设置其他的属性。
之前Servlet文章有提过,Servlet之间本身是无法通信,例如分享数据的。但是可以通过ServletContext上下文实现,其实在Session中通过Attribute也可以实现Servlet之间的通信的。
Cookie cookie = new Cookie("JSESSIONID", sessionId); resp.addCookie(cookie);
常用方法
方法 | 作用 |
---|---|
req.getSession() | 获得一个session |
session.setAttribute("name", "Zh1z3ven") | 设置属性,value部分可以是一个对象 |
session.getAttribute("name") | 获取属性 |
session.removeAttribute("name"); | 删除属性 |
session.invalidate(); | 注销session |
session.getId() | 获取sessionid |
session.isNew() | 判断是否为新创建的session |
例子:创建session,获取sessionid,设置session属性
public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决编码问题 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); //得到session HttpSession session = req.getSession(); //设置session属性 session.setAttribute("name", "Zh1z3ven"); //获取sessionid String sessionId = session.getId(); //判断是否为新创建的session boolean aNew = session.isNew(); if (aNew){ resp.getWriter().write("session创建成功,sessionID为:" + sessionId); }else { resp.getWriter().write("session已经在服务器中存在, SessionID为:" + sessionId); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
获取sessin属性,新建一个person类
public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
修改前面demo中设置属性值的语句
session.setAttribute("name", new Person("Zh1z3ven", 18));
获取session属性中的person对象
public class SessionDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决编码问题 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); //得到session HttpSession session = req.getSession(); //获取Session信息 Person name = (Person) session.getAttribute("name"); System.out.println(name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
这里就实现了不同的Servlet之间数据共享。
注销Session
删除属性,注销session。但是注销了会马上生成一个新的session
HttpSession session = req.getSession(); session.removeAttribute("name"); session.invalidate();
也可以在web.xml设置session过期时间
<!-- 设置session配置--> <session-config> <!-- 设置session过期时间,以分钟为单位--> <session-timeout>2</session-timeout> </session-config>
这篇关于Java之Cookie与Session的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01后台管理开发学习:新手入门指南
- 2024-11-01后台管理系统开发学习:新手入门教程
- 2024-11-01后台开发学习:从入门到实践的简单教程
- 2024-11-01后台综合解决方案学习:从入门到初级实战教程
- 2024-11-01接口模块封装学习入门教程
- 2024-11-01请求动作封装学习:新手入门教程
- 2024-11-01登录鉴权入门:新手必读指南
- 2024-11-01动态面包屑入门:轻松掌握导航设计技巧
- 2024-11-01动态权限入门:新手必读指南
- 2024-11-01动态主题处理入门:新手必读指南