cookie和session的代码实现

Posted 冰柠檬不酸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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将状态保存在服务器端,占用服务器内存,当用户量过大时,会严重影响服务器性能。

以上是关于cookie和session的代码实现的主要内容,如果未能解决你的问题,请参考以下文章

使用session和cookie的功能实现用户登录状态的保存

会话技术知识点整理(Cookie和Session)

使用COOKIE实现登录 VS 使用SESSION实现登录

Cookie和Session的工作流程及区别(附代码案例)

Cookie&Session

关于Cookies和Session的有效时间分析