JavaWeb学习之会话跟踪技术

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重写技术去进行网页跳转

代码

  • useSession.jsp

<%@ 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>
  • UseSessionServlet


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>");
       }
   } } 
  • ShowMyname


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>");
        }
    } }

猜你喜欢

转载自blog.csdn.net/weixin_57663206/article/details/127222016