zoukankan      html  css  js  c++  java
  • Servlet具体解释

    Servlet具体解释

    基本概述

        Session在计算机中,尤其是在网络应用中,称为“会话控制”。在计算机专业术语中。Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注冊进入系统到注销退出系统之间所经过的时间。详细到Web中的Session指的就是用户在浏览某个站点时,从进入站点到关闭这个站点所经过的这段时间,也就是用户浏览这个站点所花费的时间。因此从上述的定义中能够看到。Session实际上是一个特定的时间概念。

    參考文档:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

    Session工作原理图



        Tomcat默认是30分钟。

    Tomcat主文件夹的conf文件夹中的web.xml文件能够进行设置全局默认会话生命周期时间。


    3种设置session生命周期的方法

    1tomcat/conf/web.xml

        如上图所看到的。将数字进行更改则行,单位为分钟。

    2、在web应用下的web.xml

        直接在<web-app></web-app>中增加如图所看到的代码则行。

    3、通过request.getSession().setMaxInactiveInterval(time)

        time是以秒为单位的。

    time为正数表示用户未操作多少秒后会话失效,0为马上失效,负数代表永不失效。

    PSsession的生命周期的时间是指用户未操作时间,也就是说当用户未操作多少秒后失效。而cookie的生命周期的时间指得是累积的时间。也就说不管用户訪问否。仅仅要累积过去了多少秒后就失效了。


    案例:

    package com.pc;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    public class Servlet12 extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// 字符编码
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		response.setCharacterEncoding("utf-8");
    		PrintWriter out = response.getWriter();
    
    		// 訪问session [当发现没用session时,就会自己主动创建session]
    		HttpSession session = request.getSession();
    
    		// 给该session放入属性。能够增加对象
    		String val = URLEncoder.encode("张三", "utf-8");
    		session.setAttribute("name", val);
    		session.setAttribute("age", 20);
    
    		// session的生命周期(默认30min,能够改动)
    		// time指的是等待时间,假设超过这个时间,则会自己主动释放该会话
    		// session.setMaxInactiveInterval(time);
    
    		out.println("创建session并放入属性");
    		out.flush();
    		out.close();
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    }

    package com.pc;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLDecoder;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    public class Servlet13 extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// 字符编码
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		response.setCharacterEncoding("utf-8");
    		PrintWriter out = response.getWriter();
    
    		// 获取Session
    		HttpSession session = request.getSession();
    
    		// 获取属性
    		String name = (String) session.getAttribute("name");
    		Integer age = (Integer) session.getAttribute("age");
    		
    		// 删除name属性
    		//session.removeAttribute("name");
    		
    		if (name != null && age != null) {
    			out.println(URLDecoder.decode(name, "utf-8") + " " + age);
    		}
    		out.flush();
    		out.close();
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    }

    小结

    1session存在server的内存中

    2一个用户浏览器,独享一个session域对象

    3session中的属性的默认生命周期是30min 。你能够通过 web.xml来改动

    4session中能够存放多个属性

    5session 能够存放对象

    6假设 request.getSession().setAttribute(name,val) , 假设名字反复,则会替换该属性.

    7、生命周期设置优先级顺序为setMaxInactiveInterval > web应用下的web.xml设置 > tomcat/conf/web.xml下的设置

    81,2两种方法之所以不能是秒级的一个关键原因是由于太耗费资源。3能是秒级的原因是由于它是对单个Session进行监控。

    9session生命周期时间指得是用户未操作时间,当用户訪问后,有从新计时。能够採取例如以下几种方式使session或者当中属性失效。

        1、重新启动、reload应用、关机。session会全然失效。

        2、通过request.getSession().invalidate()session中全部属性失效。

        3、通过request.getSession().removeAttribute()session中某一属性失效、


    Session工作原理更深入的理解

    PSJSESSIONIDSession自己主动生成的用于唯一表示Session对象的一个ID号,通过该ID号server能够对每个浏览器进行标识。


    JSESSION控制session销毁时间

        当关闭浏览器之后,由于session默认返回的Cookie是会话级别的,所以即使server那端session并没有失效,再打开浏览器也无法使用之前的会话了。

    只是能够通过重设JSESSIONID这个Cookie来实现有效期持续到session生命周期完。

    案例:

    	public void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		HttpSession session = request.getSession();
    		session.setAttribute("name", "张三");
    		out.println("创一个session并放入姓名属性");
    		//把该session id保存cookie,在id时。一定要依照规范命名,这里区分大写和小写
    		Cookie cookie = new Cookie("JSESSIONID", session.getId());
    		cookie.setMaxAge(60*30);
    		response.addCookie(cookie);
    	}

    		public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		HttpSession httpSession = request.getSession();
    		String name = (String) httpSession.getAttribute("name");
    		out.println("name = "+name);
    	}

    Cookie禁用后使用Session的方法

        cookie禁用后能够使用URL重写的方法,来实现Session

    基本的语法:

    response.encodeRedirectURL(java.lang.String url) 

        用于对sendRedirect方法后的url地址进行重写

    response.encodeURL(java.lang.String url)

        用于对表单action和超链接的url地址进行重写


    encodeURL (String url)方法的实现机制为: 

        先推断当前的 Web 组件是否启用 Session,假设没有启用 Session,直接返回參数 url,再推断client浏览器是否支持 Cookie,假设支持 Cookie,直接返回參数 url。假设不支持 Cookie。就在參数 url 中增加 Session ID 信息。然后返回改动后的 url。


    cookiesession的比較

    1存在的位置

        cookie:存在client的暂时目录

        session:存在server内存中,一个session域对象为一个用户浏览器服务

    2安全性

        cookie:是以明文的方式放在client的,安全性弱。能够通过(MD5)加密再存放。

        session:是存放在server内存中。全部安全性好

    3网络传输

        cookie属性值会传递信息给server 

        session:属性值不会给client

    4生命周期

        cookie的生命周期:是累计时间,即假设我们给cookie设置setMaxAge30),则30秒后失效。

        session的生命周期:是间隔时间。如我们设置session 20min,指在20min内。假设没有訪问session。则session失效(session失效是指无法读取session属性),

    在下面情况session也会失效

      (1)关闭tomcat  2reload  web应用  (3)时间到  (4) 调用invalidate方法

    5、作用范围

        cookie:可以被多个浏览器共享

        session:仅仅能一个浏览器使用

    6使用原则

        session由于session会占用server的内存,因此不要向session中存放过多过大的对象。会影响性能。

        cookie:不要将太多数据放置在cookie中,这样会使用大量带宽。

    ----------參考《韩顺平.细说Servlet


  • 相关阅读:
    为什么java使用对象序列化到文件,打开之后是乱码,而且更换编码格式查看也不能正常显示呢
    String类能够导入IDEA,但是里面的构造方法无法使用,一直显示报错
    IDEA不能提示导入java.io.File类,但是自己手写import没问题,最后找到了问题所在
    扑克牌发牌,排序的功能实现
    TFS 生成定义
    Git-tfs工具
    日期和时间
    调用惯例
    优化查找和排序
    使用更好的库
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6994174.html
Copyright © 2011-2022 走看看