首页 > 代码库 > Seesion
Seesion
1.服务器端保持HTTp状态信息的方案,通过SeesionID表示客户端
2.保存Seesion 两种方式 cookie 和URL重定向
Cookie机制可以保存sessionID,在其响应信息中回送一个sessionID,如果cookies被禁用的话 不得不把SeesionID附加到URL路径后面------URL重写:1.作为URL的路径附加信息 2.查询字符串附加到URL后面
seesioncookie 不同于普通cookie,session cookie 用来标识客户端与服务器之间的一次会话,当会话结束之后Seesion cookie消失
persisten cookie 存在于硬盘上的一段文本
3.seesion 的生命周期:session 保持客户端与服务器之间的一次会话
1.创建:是否浏览器访问服务器的任何一个JSP会产生一个session对象吗:
不一定,在访问并没有让服务器产生一个Seesion,
1).当前JSP是客户端访问的第一个资源对象但是页面属性上 Seesion=false,服务器不会JSP创建Seesion
2).当前JSP不是访问的第一个资源,并且其他页面已经创建HttpSeesion对象,访问当前页面不会创建新的 Seesion,使用之前已经创建session(表示同一个会话)
3).servlet :若servlet 客户端浏览器访问第一个WEB应用资源,则只有调用request.getSeesion(true)才会 创建Seesion对象
2.销毁:
session.invalidate() ;
2).超过设定session时间:session.setMaxInactiveInterval(5) 单位S
web.xml 设定HttpSeesion :appach/config/web.xml
在Session中最重要属性是 setAttribute() 和getAttribute() 这两个属性,set属性让多个JSP在一个会话中共用一个SessionID,不需要在URL后面添加SessionID(URL重写)
4. response.encodeURL()--将Jssion写入URL中
5. 开发时候建议编写“绝定路径”,写绝对路径一般没有问题,相对路径有可能会出现问题
相对路径,a.jsp 是b,c.jsp的上级目录中,有时候不能通过超链接,通过Servlet转发到JSP,在转发过程出现问题(MVC方式),不建议在JSP中直接连接SQL,在Servlet中只能使用转发 功能转到其他目录下JSP
A.jsp--href---》Servlet---转发--》b.jsp ----href-->c.jsp b和c在同一路径不在根目录下
分析:在转发过程中,服务器内部转发,在客户端显示还是/testServlet 根目录下路径,如果b.jsp中c.jsp 不在根目录下在根子目录下,查找时候出现问题。
解决方案:所以在b.JSP超链接修改成 <a href="http://www.mamicode.com//path/c.jsp"> 去C.JSP</a>
在这里重定向的话必须加上绝对路径 response.sendRedirect(request.getContextPath()+"path/b.jsp")
明显Servlet使用重定向爆出 严重的安全隐患,将服务器根目录直接爆了,使用访问SQL结果显示给JSP时候只能采用转发方式
2). / 问题:
1.当前WEB的根路径: 请求转发request.sendDispatcher("/path/b.jsp").forward(request,response);
WEB中web.xml文件中映射testServlet <url-pattern>/TestServlet</url-pattern>
2.当前WEB站点路径:超链接 ,action ,请求重定向response.sendRedirect
若/ 需要容器Tomcat处理表示根目录,;若/交由浏览器处理当前站点 站点表示当前客户端所处目录
6.Session 避免保单重复提交:
1. Servelet使用转发策越,时候浏览器保存之前URL,在成功页面上 刷新时候会再一次提交数据
2.在响应没有到达时,登录页面上重复点击提交按钮
3.提交成功后点击返回到登录页面,在点击提交
不是重复提交:点击返回,在刷新相当于开了一个新页面,不算重复提交,相当于开新页面。
2).如何避免:
给保单做标记与提交Servlet时候,检查标记是否一致,若一致受理请求,并且销毁标记,不一致没有标记,响应提示信息重复提交
如下:是第一种情况
1 <form action="<%= request.getContextPath()%>/tokenServlet" method="post"> 2 name:<input type="text" name="username"/> 3 <input type="submit" value="http://www.mamicode.com/Submit"/> 4 </form>
Servlet中请求转发的情况:
1 String name=request.getParameter("username"); 2 System.out.println("username"+name); 3 //app_1下success.jsp 4 request.getRequestDispatcher("/app_1/success.jsp").forward(request,response);
重定向客户重定向到成功页面,不会出现重复提交
解决方法:只能通过Session进行避免标单重复,使用request进行标记时候在submit提交JSP会刷新,导致request被销毁在Servlet无法得到其中属性:
1 <form action="<%= request.getContextPath()%>/tokenServlet" method="post"> 2 <!-- <input type="hidden" name="token" value="http://www.mamicode.com/atug">--> 3 <% 4 // request.setAttribute("token","tokenvalue"); 5 //这里设定属性,在submit之后直接进入到 重复提交页面 6 //原因:表单提交相当于刷新,原来request被销毁了,直接进入到null 7 8 //将标记放在session中 9 session.setAttribute("token", "tokenvalue"); 10 %> 11 12 name:<input type="text" name="username"/> 13 <input type="submit" value="http://www.mamicode.com/Submit"/> 14 </form>
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 // TODO Auto-generated method stub 3 String name=request.getParameter("username"); 4 5 HttpSession session=request.getSession(); 6 7 String token=(String) session.getAttribute("token"); 8 9 System.out.println("token: "+token); 10 if(token!=null ) 11 { 12 session.removeAttribute("token"); 13 } 14 else 15 { 16 response.sendRedirect(request.getContextPath()+"/app_1/took.jsp"); 17 return; 18 } 19 20 //app_1下success.jsp 21 //request.getRequestDispatcher("/app_1/success.jsp").forward(request,response); 22 response.sendRedirect(request.getContextPath()+"/app_1/success.jsp"); 23 }
修改:利用session 防止表单重复提交时候, 原表单中生成随机数,将原表单页面放入隐藏中
1 <% 2 String tokenvalue=http://www.mamicode.com/new Date().getTime()+""; 3 session.setAttribute("token", tokenvalue); 4 %> 5 <form action="<%= request.getContextPath()%>/tokenServlet" method="post"> 6 <!-- 隐藏的值,传输随机生成值与之前的进行对比 --> 7 <input type="hidden" name="token" value=http://www.mamicode.com/>"color: #008080"> 8 9 name:<input type="text" name="username"/> 10 <input type="submit" value="http://www.mamicode.com/Submit"/> 11 </form>
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 // TODO Auto-generated method stub 3 String name=request.getParameter("username"); 4 5 HttpSession session=request.getSession(); 6 7 String token=(String) session.getAttribute("token"); 8 String tokenvalue=http://www.mamicode.com/request.getParameter("token"); 9 System.out.println("token: "+token); 10 11 // s使用隐藏标签 获取随机的值 12 if(token!=null && token.equals(tokenvalue) ) 13 { 14 session.removeAttribute("token"); 15 } 16 else 17 { 18 response.sendRedirect(request.getContextPath()+"/app_1/took.jsp"); 19 return; 20 } 21 22 //app_1下success.jsp 23 //request.getRequestDispatcher("/app_1/success.jsp").forward(request,response); 24 response.sendRedirect(request.getContextPath()+"/app_1/success.jsp"); 25 }
7.利用Session实现一次性验证码:
实现步骤与防止重复提交一致:
--> 在原表单中图片中字符串先放入到session
---> 原表单中定义文本域,用于输入验证码
----> 将Session字符串与文本域中字符相比较,相同受理请求同时去除原来属性
Seesion