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将状态保存在服务器端,占用服务器内存,当用户量过大时,会严重影响服务器性能。

  • 相关阅读:
    转:裸接口防护,避免恶意盗刷和爬取
    oracle = : := 和变量绑定 oracle通配符和运算符
    169.254地址无网关信息 ----- 解决方案 启动DHCP服务
    NAS DAS SAN 磁带机 tco
    linux 权限详解
    转载:哈希加密算法 MD5,SHA-1,SHA-2,SHA-256,SHA-512,SHA-3,RIPEMD-160
    MD5,SHA1 都是哈希 摘要算法 MD5+SALT BCRYPT
    iOS开发JSON字符串和字典互转
    iOS开发线程之NSThread
    iOS开发NSMutableArray数组越界处理
  • 原文地址:https://www.cnblogs.com/baojiao/p/6007123.html
Copyright © 2011-2022 走看看