zoukankan      html  css  js  c++  java
  • cookie和session的代码实现

    cookie和session的代码实现

     1、设置cookie

      今天笔试题考的是cookie的设置,我竟然选了request也可以设置cookie,我的天呀。

      我们来看如何在response设置吧

    复制代码
    public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
            
            Cookie c = new Cookie("name","jenkins");
            resp.addCookie(c);
    
     } 
    复制代码

      这样子设置,实际上是在返回的消息头中加了一个key-value,key为Set-Cookie,value也是key-value的形式,上面的就是:name=jenkins,多个cookie用分号(;)隔开

      消息头中的样式是:Set-Cookie:name=jenkins;JSESSIONID=ERERE23343423

      其实如果要在request中把cookie返回到服务器端,我们可以在请求的消息头中加一个值:

    复制代码
    package servletbase;
    
    import java.io.IOException;
    import java.io.Writer;
    import java.util.ArrayList;
    import java.util.List;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.httpclient.Header;
    import org.apache.commons.httpclient.HttpClient;
    
    public class MyServlet01 extends HttpServlet{
        
        public void postCookieToServer(){
            HttpClient client = new HttpClient();
            List<Header> headers = new ArrayList<Header>();
            //把key为JSESSIONID的cookie上传到服务器,服务器会根据这个id来判断
            //发起该会话的用户是不是之前登录过,做鉴权
            headers.add(new Header("cookie","JSESSIONID=RERER3"));
         //设置消息头
            client.getHostConfiguration().getParams().setParameter("http.default-headers", headers);
        }
        
    }
    复制代码

    2、查询Cookie

      在请求对象中获取:

    复制代码
    public void getCookieFromRequest(HttpServletRequest request){
            //获取cookie数组
            Cookie[] cookies = request.getCookies();
            for(Cookie cookie:cookies){
                //获取cookie的key-value
                String name = cookie.getName();
                String value = cookie.getValue();
            }
        }
    复制代码

    3、修改Cookie 

    复制代码
    public void updateCookieFromRequest(HttpServletRequest request,HttpServletResponse response){
            //获取cookie数组
            Cookie[] cookies = request.getCookies();
            for(Cookie cookie:cookies){
                //修改cookie的value
                String name = cookie.getName();
                if(name.equals("city")){
                    cookie.setValue("guangzhou");
                    response.addCookie(cookie);
                }
            }
        }
    复制代码

    4、Cookie的编解码(value为中文时需要编码,否则访问时会报错)

    复制代码
         //编码
            Cookie c = new Cookie("city",URLEncoder.encode("广州","utf-8"));
            
            //解码
            String value = c.getValue();
            value = URLDecoder.decode(value,"utf-8");
    复制代码

    5、Cookie的其他方法

    复制代码
    //设置生存时间,单位是秒,默认小于零,保存在内存中。等于零是即刻删除
    cookie.setMaxAge(30)
    
    //设置路径,浏览器访问服务器时只向cookie路径或者子路径发送cookie,以下访问/web/index.html是会发cookie,但访问/myweb/index.html就不会了
    cookie.setPath("/web");
    复制代码

     6、Cookie的限制

      a、可以被用户限制

      b、保存在浏览器,不安全,敏感数据要进行加密

      c、只能保存少量数据,大约4k左右

      d、个数有限制

      e、只能保存字符串

    7、Session定义和工作原理

      简单来说Session就是服务器为每一个访问的浏览器分配的内存空间,它有一个唯一的id,并且会将这个jsessionid以cookie的形式发送到浏览器(服务器调用了getSession()方法才会返回jsessionid到浏览器,并不是每个请求过来都返回),浏览器再次访问时就会把这个jsessionid发送到服务器,服务器就能找到session对象。

      如果浏览器再次访问(请求消息头中带有jessionid)时,服务器能找到对应的sessionid,则服务器不再返回sessionid到浏览器。

    8、获取Session 

    复制代码
    //参数为true时一定会返回session对象
    HttpSession session = request.getSession(true);
    //不加参数默认是true
    HttpSession session = request.getSession();
    
    //参数为false时,则没有sessionid时返回null
    //有sessionid,但找不到session对象时也返回null,能找到session对象就返回该对象
    HttpSession session = request.getSession(false);
    复制代码

    9、使用Session绑定对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //绑定对象
    void session.setAttribute(String name,Object boj);
    //获取绑定对象
    Object session.getAttribute(String name);
    //移除绑定对象
    void session.removeAttribute(String name);
     
    //删除session对象
    session.invalidate();

    10、Session超时

    服务器会将空闲时间过长的session对象删除以节省内存空间资源,一般是30分钟 

    在tomcat的conf/web.xml文件夹设置(单位是分钟):

      <session-config>

        <session-timeout>30</session-timeout>

      </session-config>

    通过编程修改:

      void session.setMaxInactiveInterval(int seconds)

    11、浏览器禁用cookie后果及解决方法

      浏览器禁用cookie后,session就不能用了,因为jsessionid不能在浏览器保存。

      解决办法:使用URL重写方法解决,就是在重定向时在url中加sessionid参数,就不需要浏览器保存了。看以下的例子,假如登录验证过程了,需要重定向到首页 

    复制代码
    if(name.equals("admin") && pwd.equals("admin")){
                session.setAttribute("name",name);
                //重定向到首页
                //response.sendRedirect("index.jsp");
                 
                //改为,其会在路径后面加上jsessionid,
                //System.out.println("url:" + resp.encodeRedirectURL("index.html")); --> url:index.html;jsessionid=4E885D5D87247441F761C96ACA9A7B68
                response.sendRedirect( response.encodeRedirectURL("index.jsp"));              
            }
    复制代码

      登录之后我们就可以把sessionid保存到页面,访问时把它带上就好了,可以在url后面加上sessionid,如下:

      localhost:8080/testweb/servlet01;jsessionid=4E885D5D87247441F761C96ACA9A7B68

      另外如果在服务器端没有生成session对象,服务器是不会返回sessionid的cookie到浏览器的,即在服务器端要调用request.getSession()

    12、Session的优缺点

      优点:

      a、安全(状态保存在服务器端)

      b、能保存的数据类型更多,cookie只能是字符串

      c、能保存更多数据

      缺点:

      session将状态保存在服务器端,占用服务器内存,当用户量过大时,会严重影响服务器性能。

  • 相关阅读:
    BEM(Block–Element-Modifier)
    http://element.eleme.io/#/zh-CN/component/quickstart
    Commit message 的写法规范。本文介绍Angular 规范(
    好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
    代码管理
    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
    Martin Fowler’s Active Record design pattern.
    The Zen of Python
    Introspection in Python How to spy on your Python objects Guide to Python introspection
    Object-Oriented Metrics: LCOM 内聚性的度量
  • 原文地址:https://www.cnblogs.com/baojiao/p/6007123.html
Copyright © 2011-2022 走看看