会话管理---Cookie与Session
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
保存会话数据的两种技术:Cookie,Session
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Cookie应用
//显示用户上次访问的时间 public class CookieDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.write("您上次访问时间是:"); //1.获取用户上次访问的时间,显示 Cookie cookies[] = request.getCookies(); for(int i=0;cookies!=null && i<cookies.length;i++){ Cookie cookie = cookies[i]; if(cookie.getName().equals("lastAccessTime")){ long time = Long.parseLong(cookie.getValue()); Date date = new Date(time); out.write(date.toLocaleString()); } } //2.把本次的时间以cookie的形式回写给客户机 (lastAccessTime) Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+""); cookie.setMaxAge(100);//设置有效期,cookie将写到硬盘上,不设置有效期,cookie的有效期是会话范围,cookie仅存储在浏览器缓存中,浏览器一关闭,cookie就没了。 response.addCookie(cookie); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Cookie细节:
1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
2. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
3. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
5. 注意,删除cookie时,path必须一致,否则不会删除
设置Session,与NET平台不同
String data = "abcd";
HttpSession session = request.getSession(); session.setAttribute("data", data);
取出Session
HttpSession session = request.getSession(); //session.invalidate(); 摧毁session String data = (String) session.getAttribute("data"); response.getWriter().write(data);
session实现会话过程数据共享的原理:
Session是基于Cookie的、服务器创建每个session的时候,会为每个session分配一个ID号,即 JSESSIONID,服务器会以cookie的方式把session 的id号写给浏览器、所以session是基于cookie的。当浏览器再次访问的时候,会带着session id号的cookie过来 ,这就是session实现共享的原理。服务器写这个cookie的时候,是没有写有效期的,所以当浏览器关闭的时候,cookie也就没了,session也就结束了,即会话过程。
多浏览器共享Session
由上面的分析可以,关闭浏览器后,session将消失,那么如何做到多浏览器共享一个session呢(即关闭浏览器后,再打开一个浏览器后session还存在)?
只要手动的写入cookie,并设置有效期即可。用这个cookie来覆盖服务器写给浏览器的。可以通过httpwatch来观察服务器写给浏览器的内容。
解决方案如下:名字必须是JSESSIONID,因为服务器写给浏览器的cookie的名字就是这个 。
HttpSession session = request.getSession(); Cookie cookie = new Cookie("JSESSIONID",session.getId()); cookie.setMaxAge(30*60); cookie.setPath("/day07");//因为服务器写给浏览器的也有设置path,所以要想自己写的cookie覆盖服务器写的,必须跟服务器写的一致。 response.addCookie(cookie);
Session是基于Cookie的,那如果浏览器禁用了cookie后怎么办? 会出现空指针异常。
因为禁用了cookie,服务器写cookie的时候,浏览器会拒绝,下次再来访问的时候是没有带cookie的,而在后台有使用这个cookie,所以会出现空指针异常。
解决方法:不以cookie的方式把JSESSIONID带给服务器,而是把JSESSIONID以url的方式带到服务器,
即URL重写:URL重写解决了禁用cookie后,Session的共享问题。
String url = response.encodeRedirectURL("/day07/servlet/ListCartServlet"); //实现 url重写 response.sendRedirect(url);
encodeRedirectURL方法会自动的在URL后面加上JSEEIONID的参数。
一般涉及到会话的超链接都要使用url重写,来解决浏览器禁用cookie的问题。
String url = "/day07/servlet/BuyServlet?id="+book.getId(); url = response.encodeURL(url); //得到重写后的url
encodeURL
encodeRedirectURL
上面两个都是url重写,重定向的url重写使用下面一个,其他的url重写使用上面一个。
response. encodeRedirectURL(java.lang.String url)
用于对sendRedirect方法后的url地址进行重写。
response. encodeURL(java.lang.String url)
用于对表单action和超链接的url地址进行重写
URL重写会自己判断浏览器是否禁用了cookie,如果没有禁用cookie,不会在超链接后面加上JSESSIONID的参数带给服务器,只有禁用了Cookie才会带。
Session的失效时间可以在web.xml文件中修改
<session-config>
<session-timeout>10</session-timeout> //10分钟
</session-config>
session在10分钟内没有在被使用,服务器就会摧毁session。
用户登录保存登录标记,存入session
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.getAttribute("username"); //从域中取username String username = request.getParameter("username"); String password = request.getParameter("password"); //检测用户名和密码在数据库中是否存在 List<User> list = DB.getAll(); for(User user : list){ if(user.getUsername().equals(username) && user.getPassword().equals(password)){ //从数据库中找到匹配用户,让用户登陆成功 request.getSession().setAttribute("user", user); response.sendRedirect("/day07/index.jsp"); return; } } response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("用户名或密码错误!!"); }
//注销登陆用户 public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if(session!=null){ session.removeAttribute("user"); } response.sendRedirect("/day07/index.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
两者区别:
request.getSession();如果服务器内存中没有session,服务器会创建一个session,如果有session,会返回该session
request.getSession(false);只检索服务器内存中有没有session,如果没有也不创建session了,如果有,则返回该session
会话管理---Cookie与Session的更多相关文章
- 管理Cookie和Session
管理Cookie和Session 前言 这几天中,一直再跟漏洞打交道,而在这些漏洞中,出现的最多的就是 Cookie 和 Session 了.这篇文章就简单的介绍一些 Cookie 中最常用的四个属性 ...
- 会话技术: Cookie 和 Session
会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保 ...
- Servlet 会话技术cookie和session
会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...
- 会话技术cookie和session详解
什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一 ...
- 会话跟踪Cookie与Session
会话跟踪用来跟踪用户的整个会话,常用的是Session和Cookie.Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie 1.1概念及使 ...
- JAVA基础之会话技术-Cookie及Session
至此,学习Servlet三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会 ...
- 会话技术cookie与session
目录 会话技术cookie 会话技术 cookie 服务器怎样把Cookie写 给客户端 服务器如何获取客户端携带的cookie session session简介 Session如何办到在一个ser ...
- Django之会话机制cookie、session使用
login视图函数: def login(request): if request.method == 'POST': username = request.POST.get('username') ...
- Java EE会话技术Cookie和Session
会话技术 一.定义 会话技术是帮助服务器记住客户端状态的(区分客户端的).将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术. 注意: 一次会话何时开始?从打开一个浏览器 ...
随机推荐
- uhttpd配置文件分析
文件位于 /etc/config/uhttpd. root@hbg:/etc/config# cat uhttpd config uhttpd 'main' list listen_ht ...
- Apache Zeppelin
介绍 用于做数据分析和可视化 一.二进制安装 1)下载二进制包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/incubator/zeppelin/0 ...
- 此 ObjectContext 实例已释放,不可再用于需要连接的操作
EF 查询包含导航属性的Model,经常会遇到 此 ObjectContext 实例已释放,不可再用于需要连接的操作 这种错误,解决方法如下: db.T_DailyRecord.Include(&qu ...
- bootstrop之模态框关闭
1.js中操作$('#myModal5').map(function() {//用id选择器选中要关闭的模态框 $(this).modal('hide'); //关闭 }); 2.用button在模态 ...
- java实现树型结构样式
import javax.swing.*; import javax.swing.event.*; import javax.swing.tree.*; public class Root exten ...
- Python 学习笔记4
我是一个艺术家. 今天继续学习python啊.争取看到python流程控制.
- tableview选择的时候不要cell的高亮显示样式
1.若用方法: //-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)ind ...
- [原]创建三个输入文本框,当光标离开文本框的时候如果文本框为空,则将文本框背景色设置为红色,如果不为空则为白色。提示:焦点进入控件的事件是onfocus,焦点离开控件的事件是onblur
window.onload = function () { var txts = document.getElementsByTagName('input'); ...
- ios UIApplocation 中APP启动方式
iOS app启动的方式有哪些: 自己启动(用户手动点击启动) urlscheme启动(关于urlScheme的详解)http://www.cnblogs.com/sunfuyou/p/6183064 ...
- 《Windows驱动开发技术详解》之分层驱动程序
分层驱动程序概念 分层的目的是将功能复杂的驱动程序分解成多个简单的驱动程序.一般来说,他们是指两个或两个 以上的驱动程序,它们分别创建设备对象,并且形成一个由高到低的设备对象栈.IRP请求一般会被传送 ...