Servlet(4)

1.为什么需要会话跟踪?

 

        使用浏览器发送的http请求http请求使用的是http协议,而http协议是一种无状态的协议,它不会去主动记录使用这个http协议的用户是谁,一旦请求发送成功,服务器做出响应以后,那么此时浏览器与服务器之间的链接就会消失,这时服务器就不知道请求来自哪里,是谁发送来的。所以这时我们就需要记录/保存请求/链接的状态,实现这个记录记录/保存请求/链接的状态的过程就叫会话跟踪

2.什么是会话跟踪?

服务器处理程序实现记录/保存请求/链接的状态的过程就叫会话跟踪

会话:同一个用户与服务器之间的一组请求和响应

跟踪:保存记录

3.四种会话跟踪技术有那些,它们各自的优缺点?

  1. URL重写:将该用户Session的id信息重写到URL地址中,以便在服务器端进行识别不同的用户。

会话跟踪技术的四种实现方法及特点整理_贝西晨的博客-优快云博客_会话跟踪技术

URL重写能够在客户端停用cookies或者不支持cookies的时候仍然能够发挥作用。

  1. 隐藏表单域:将用户Session的id信息添加到HTML表单元素<input type="hidden" name="" value=""/>中提交到服务器,此表单元素并不在客户端显示,浏览时看不到,源代码中有。
  2. Cookie:Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。服务器创建保存于浏览器端,不可跨域名性,大小及数量有限。客户端可以采用两种方式来保存这个Cookie对象,一种方式是 保存在 客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。 这样就实现了对客户的跟踪。Cookie是可以被禁止的。
  3. Session每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。保存在服务器端。需要解决多台服务器间共享问题。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。

当用户第一次发送http请求到服务器,服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次发送http请求到服务器时,http请求会连同第一次得到的sessionID会发送到服务器,在服务器端进行识别不同的用户。

 

上面的会话跟踪的过程与我们去超市的时候,在超市门口的储物柜中保存物品的过程相似。

4.Session和Cookie区别?

Cookie

Session

数据由服务器创建保存于浏览器端

数据放在服务器上

cookie不是很安全

Session很安全

减轻服务器性能应当使用cookie

不考虑减轻服务器性能。可以使用Session

单个cookie保存的数据不能超过4K

没有限制

Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。

5.HttpSession接口的常用方法

Servlet中的HttpSession接口

  1. 通过HttpServletRequest对象的getSession()方法得到HttpSession接口对象
  2. HttpSession接口对象常用方法

方法声明

功能描述

String  getId()

该方法用于得到sessionID

long  getCreationTime()

该方法用于得到session对象的创建时间[毫秒]

long getLastAccessedTime()

该方法用于得到session的最后访问时间[毫秒]       

int getMaxInactiveInterval()

该方法用于得到session的最大不活动时间[]

boolean isNew()

该方法用于session对象是否是一个新的session对象

void setAttribute(String args0, Object  args1);

该方法用于向创建的session对象中保存数据

Object getAttribute(String args0);

该方法用于获取session对象中保存的指定数据

void

removeAttribute(String args0);

该方法用于移除保存在session对象中的指定数据

void invalidate()

该方法用于销毁session对象

web.xml配置

<web-app>

  <display-name>Archetype Created Web Application</display-name>

  <servlet>

    <servlet-name>LoginServlet</servlet-name>

    <servlet-class>com.weiwei.servletdemo5.LoginServlet</servlet-class>

  </servlet>

  <servlet>

    <servlet-name>CheckloginServlet</servlet-name>

    <servlet-class>com.weiwei.servletdemo5.CheckloginServlet</servlet-class>

  </servlet>

  <servlet>

    <servlet-name>success</servlet-name>

    <servlet-class>com.weiwei.servletdemo5.SuccessServlet</servlet-class>

  </servlet>

  <servlet>

    <servlet-name>exit</servlet-name>

    <servlet-class>com.weiwei.servletdemo5.ExitLoginServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>LoginServlet</servlet-name>

    <url-pattern>/login</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

    <servlet-name>CheckloginServlet</servlet-name>

    <url-pattern>/checklogin</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

    <servlet-name>success</servlet-name>

    <url-pattern>/success</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

    <servlet-name>exit</servlet-name>

    <url-pattern>/exit</url-pattern>

  </servlet-mapping>

</web-app>
/**

 * 创建登录页面的servlet

 */

public class LoginServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doPost(req, resp);

    }



    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");

        resp.setCharacterEncoding("utf-8");

        PrintWriter out = resp.getWriter();

        out.println("<!DOCTYPE html>");

        out.println("<html>");

        out.println("<head>");

        out.println("<meta charset=\"UTF-8\">");

        out.println("<title>用户登录</title>");

        out.println("</head>");

        out.println("<body>");

        //得到session对象

        HttpSession session = req.getSession();

        //显示session的基本信息

        showSessionInfo(out,session);

        //得到错误提示信息

        Object obj=session.getAttribute("errortip");

        if(obj!=null){

            String errortip=(String)obj;

            out.println("<font color=\"red\">"+errortip+"</font>");

        }

        out.println("<form action=\"checklogin\" method=\"post\">");

        out.println("<table>");

        out.println("<tr align=\"center\"><td colspan=\"2\">用户登录</td></tr>");

        out.println("<tr align=\"center\"><td>用户名:</td><td><input type=\"text\" name=\"username\"></td></tr>");

        out.println("<tr align=\"center\"><td>密码:</td><td><input type=\"password\" name=\"password\"></td></tr>");

        out.println("<tr align=\"center\"><td colspan=\"2\"><input type=\"submit\" value=\"登录\"></td></tr>");

        out.println("</table>");

        out.println("</form>");

        out.println("</body>");

        out.println("</html>");

        out.close();

    }



    private void showSessionInfo(PrintWriter out, HttpSession session) {

        //得到session基本信息

        //得到session的ID

        String sessionid = session.getId();

        //得到session对象的创建时间[毫秒]

        long creationTime = session.getCreationTime();

        //得到session的最后访问时间[毫秒]

        long lastAccessedTime = session.getLastAccessedTime();

        //得到session的最大不活动时间[秒]

        int maxInactiveInterval = session.getMaxInactiveInterval();

        //对时间进行格式化

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");

        String creationtime = simpleDateFormat.format(new Date(creationTime));

        String lastaccessedtime = simpleDateFormat.format(new Date(lastAccessedTime));

        //session对象是否是一个新的session对象

        boolean sessionnew=session.isNew();

        out.println("<table border=\"1px\">");

        out.println("<tr>");

        out.println("<td>sessionID</td>");

        out.println("<td>"+sessionid+"</td>");

        out.println("</tr>");

        out.println("<tr>");

        out.println("<td>session对象的创建时间</td>");

        out.println("<td>"+creationtime+"</td>");

        out.println("</tr>");

        out.println("<tr>");

        out.println("<td>session的最后访问时间[毫秒]</td>");

        out.println("<td>"+lastaccessedtime+"</td>");

        out.println("</tr>");

        out.println("<tr>");

        out.println("<td>session的最大不活动时间[秒]</td>");

        out.println("<td>"+maxInactiveInterval+"</td>");

        out.println("</tr>");

        out.println("<tr>");

        out.println("<td>是否是一个新的session对象</td>");

        out.println("<td>"+sessionnew+"</td>");

        out.println("</tr>");

        out.println("</table>");


    }

}

/**

 * 检验登录账号和密码的servlet

 */

public class CheckloginServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doPost(req, resp);

    }



    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");

        resp.setCharacterEncoding("utf-8");

        String username = req.getParameter("username");

        String password = req.getParameter("password");

        //得到session对象

        HttpSession session = req.getSession();

        if ("zhangsan".equals(username) && "123456".equals(password)){

            //跳转到成功页面

            //利用session对象的方法传递数据

            session.setAttribute("username",username);

            resp.sendRedirect("success");//sendRedirect不能传递数据

        }else{

            req.getRequestDispatcher("/login").forward(req,resp);

        }

    }

}

/**

 * 登录成功的servlet

 */

public class SuccessServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doPost(req, resp);

    }



    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");

        resp.setCharacterEncoding("utf-8");

        //得到session对象

        HttpSession session = req.getSession();

        Object obj = session.getAttribute("username");

        if(obj==null){

            resp.sendRedirect("login");

        }else{

           String username=(String)obj;

            //得到输出流对象

            PrintWriter out=resp.getWriter();

            //输出一个登陆页面

            out.println("<!DOCTYPE html>");

            out.println("<html>");

            out.println("<head>");

            out.println("<meta charset=\"utf-8\">");

            out.println("<title>登陆成功</title>");

            out.println("</head>");

            out.println("<body>");

            out.println("<h1>"+username+",登陆成功!!!</h1>");

            out.println("<a href=\"exit\">安全退出</a>");

            out.println("</body>");

            out.println("</html>");

            out.close();

        }

    }

}

/**

 * 安全退出的servlet

 */

public class ExitLoginServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doPost(req, resp);

    }



    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");

        resp.setCharacterEncoding("utf-8");

        //得到session对象

        HttpSession session = req.getSession();

        //void invalidate()   该方法用于销毁session对象

        session.invalidate();

        //回到登录页面

        resp.sendRedirect("login");

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java-请多指教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值