目录
7.1 Cookie技术
7.1.1 技术介绍
Cookie技术是一种再客户端保持会话跟踪的解决方案。通过这个技术,服务器再接收到客户请求时,能够对其请求头的内容跟进行分析,动态生成与其相对应的内容。例如,在登录页面中记住密码。另外,一些网址根据用户的偏好,进行的一些个性化推荐也是运用了这门技术。
7.1.2 使用流程
- ① 根据属性和属性值生成对应的Cookie对象
- ② 设置最大存活时间(在重新关闭网站后不会消失,关闭服务器会消失)
- ③ 获取客户端浏览器获取的所有Cookie(用数组存储)
- ④ 对Cookie进行遍历,找到对应所需要的Cookie(一般通过属性去比较,然后获取属性值作为有用信息)
代码编写CookieTest
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; @WebServlet(name = "CookieTest", value = "/CookieTest") public class CookieTest extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); String nowTime=sdf.format(new Date()); String lastVistTime=""; int vistedCount=0; Cookie[] myCookies=request.getCookies(); if (myCookies!=null){ for (Cookie cookie:myCookies){ //判断是否为最近访问过的Cookie,Cookie中的属性名为lastVist //属性值为上次访问的时间 if ("lastVist".equals(cookie.getName())){ lastVistTime=cookie.getValue(); } //判断是否为记录访问次数的Cookie,Cookie中的属性名为VistedCount //属性值为上次访问的次数 if ("vistedCount".equals(cookie.getName())){ vistedCount=Integer.valueOf(cookie.getValue()); } } } //不是第一次访问,输出上次访问时间 if (!"".equals(lastVistTime)){ out.println("您上次访问的时间为:"+lastVistTime); } out.println("您是第:"+(vistedCount+1)+"个访问网站的用户"); //以本次访问时间创建同名Cookie Cookie lastVistTimeC = new Cookie("lastVist",nowTime); lastVistTimeC.setMaxAge(362*24*60*60); //以访问次数创建同名Cookie Cookie vistedCountC=new Cookie("vistedCount",(vistedCount+1)+""); //设置最大存活时间为一年 vistedCountC.setMaxAge(365*24*60*60); //将两个Cookie对象相应到客户端 response.addCookie(lastVistTimeC); response.addCookie(vistedCountC); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } ```
7.2 session技术
7.1.1 概念
session技术是指使用HttpSession对象实现会话跟踪技术,是一种在服务器端保持会话跟踪的解决方案。会在用户第一次访问服务器是由容器创建,在会话有效期间,都属于同一个会话。
7.3 URL重写技术
7.3.1 理解
在作者的理解中,作者把这个看成是实现页面跳转并保持会话的技术,因为如果我们通过一般的跳转方式,在浏览器不支持Cookie技术的情况下,无法保持会话,那么这个时候,就需要通过URL重写技术去进行网页跳转
代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>useSession.jsp</title> </head> <body> <form action="../UseSessionServlet" method="post"> 用户名:<input type="text" name="user"><br> <input type="submit" value="提交"> </form> </body> </html>
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "UseSessionServlet", value = "/UseSessionServlet") public class UseSessionServlet extends HttpServlet { private static final long serialVersionUID=1L; public void init(ServletConfig config)throws ServletException{ super.init(config); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); request.setCharacterEncoding("UTF-8"); String name=request.getParameter("user"); if (null==name||name.length()==0){ response.sendRedirect(response.encodeRedirectURL("jsp/useSession.jsp")); } else { HttpSession session=request.getSession(true); session.setAttribute("myname",name); out.println("<html><body>"); out.println("您请求的servlet对象是:"+getServletName()); out.println("<br>您的会话ID是:"+session.getId()); out.println("<br>请单机请求另一个servlet:"); out.println("<br><a href="+response.encodeRedirectURL("ShowMyname")+">请求另一个servlet</a>"); out.println("</body></html>"); } } }
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "ShowMyname", value = "/ShowMyname") public class ShowMyname extends HttpServlet { private static final long serialVersionUID=1L; public void init(ServletConfig config)throws ServletException{ super.init(config); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); HttpSession session=request.getSession(true); String name=(String) session.getAttribute("myname"); if (null==name||name.trim().length()==0){ response.sendRedirect(response.encodeRedirectURL("jsp/useSession.jsp")); }else { out.println("<html><body>"); out.println("您请求的servlet对象是:"+getServletName()); out.println("<br>您的会话ID是:"+session.getId()); out.println("<br>您会话中存储的用户名是:"+name); out.println("<br><a href="+response.encodeRedirectURL("jsp/useSession.jsp")+">重新登录</a>"); } } }