码迷,mamicode.com
首页 > 其他好文 > 详细

cookie和session

时间:2017-10-24 20:43:37      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:post   method   val   for   明细表   als   blog   equals   注册   

  对于cookie和session,作为程序员我们都听说过或者接触过,老生常谈了。不过不细谈还真不好把他们俩搞清楚。把cookie放在前面,是因为它出生的早,没有cookie,就没有session。但是有了session后,大家都不喜欢cookie了。为啥呢?接下聊。

  首先,cookie和session都是客户端和服务端之间的沟通,而且都是服务端利用了客户端。当服务端需要区分不同的客户端时,在消息头里设置了cookie相关信息,主要是一个map来放cookie的名称和具体对象,客户端收到后就存放在本地。下一次客户端再次请求服务端时,把cookie信息带上消息头,服务端取到cookie就能识别客户端了,也能取到之前寄存在客户端的货物了。cookie就是一张通行证,不同的客户端有不同的通行证,通行证上有用户名和密码。服务端拿到通行证就能认出不同的客户端。比如我现在要做登陆,那么用户名和密码我都放在客户端寄存,通过cookie货物输送到了服务端,这时服务端得到了用户名和密码,再拿去跟原有的注册用户列表一比较,就知道给该用户能不能放行了。

  session的原理跟cookie是一样的,也是寄存货物在客户端,不同的是寄存的是一个ID字符串而已,而真正的货物实际上还在服务端。还拿上面的登陆举例,这次我放在客户端的就是一串用户的身份证号码,通过session把这串身份证号码带到了服务端,然后服务端拿着这张身份证到自己的客户明细表里一查,找到了对应的客户信息,就能拿到用户名和密码了。

  cookie的生命周期默认是随着客户端的打开而生、关闭而死的。cookie可以通过设置失效时间来延长寿命,这样就不用随着浏览器关闭而死亡了。既然session实际上也是个cookie,那么sessionID也是如此。但我们关心的不是身份证,而是session的值,这些货物存放的地方不是客户端,而是服务端,所以session的失效时间针对的是服务端。但是有一点比较坑,每次新打开浏览器都会实例化一个新session出来,就算你的服务端帮你存在原来的货物也没用,新的浏览器存放的是新的货物了。

  回来开篇的问题,有了session,大家都不用cookie了,这是为啥?两个方面,一个是cookie在每次请求时都会传送,这会加大网络传输的压力;一个是cookie是放在消息头的,大小一般不能超过4KB,有了大小限制就不爽了。而这两个问题session都不存在,因为人家是存在服务端的,消息头只要一个字符串就够了。还有一个问题,cookie是可以禁用的,被禁了就玩完了?还有后门,URL重写,拼接到url后面作为参数传过去。这时session只要一个身份证号字符串,而cookie就麻烦了,拼对象吧。

  说了半天,看个例子吧,还是拿登陆说事:

  登陆的action:

/**
     * 执行登陆行为
     *
     * @author wulinfeng
     * @param request
     * @param user
     * @return
     * @throws ServletException
     * @throws IOException
     */
    @RequestMapping(value = "/loginAction.html", method = RequestMethod.POST)
    public @ResponseBody void loginAction(HttpServletRequest request, HttpServletResponse response,
        @RequestBody UserBean user)
        throws ServletException, IOException
    {
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        // 验证码校验
        String validateCode = (String)request.getSession().getAttribute("randomString");
        if (StringUtils.isEmpty(validateCode) || !validateCode.equals(user.getValidate().toUpperCase()))
        {
            out.print(PropertiesConfigUtil.getProperty("verify_code_error"));
            out.flush();
            return;
        }
        
        // 用户名密码校验
        String result = testPillingService.login(user.getUsername(), user.getPassword());
        
        // 校验通过,创建token并放入session中;校验失败,返回错误描述
        if ("success".equals(result))
        {
            String tokenId = UUID.randomUUID().toString();
            
            // 登陆成功后是使用cookie还是session来存放tokenId
            if (IS_COOKIE.equals("1"))
            {
                Cookie cookie = new Cookie("tokenId", tokenId);
                cookie.setMaxAge(3 * 24 * 60 * 60); // 3天过期
                response.addCookie(cookie);
            }
            else
            {
                request.getSession(true).setAttribute("tokenId", tokenId);
            }
            
            if (user.getUsername().toUpperCase().equals("ADMIN"))
            {
                response.getWriter().print("register");
                return;
            }
        }
        out.print(result);
        out.flush();
    }

  过滤器:

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 登陆拦截
 *
 * @author wulinfeng
 * @version C10 2017年10月11日
 * @since SDP V300R003C10
 */
public class InterceptorUtil implements HandlerInterceptor
{
    /** 日志对象 */
    private static Logger logger = LogManager.getLogger(InterceptorUtil.class.getName());
    
    /** 是否启用cookie */
    private static final String IS_COOKIE = PropertiesConfigUtil.getProperty("iscookie");
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception
    {
        logger.debug("InterceptorUtil.doFilter requesturl: " + request.getRequestURL());
        
        String tokenId = null;
        
        if (IS_COOKIE.equals("1"))
        {
            Cookie[] cookies = request.getCookies();
            if (cookies != null)
            {
                for (Cookie cookie : cookies)
                {
                    if (cookie == null)
                    {
                        continue;
                    }
                    if (cookie.getName().equals("tokenId"))
                    {
                        tokenId = cookie.getValue();
                        break;
                    }
                }
            }
        }
        else
        {
            if (request.getSession() != null)
            {
                tokenId = (String)request.getSession().getAttribute("tokenId");
            }
        }
        
        if (StringUtils.isEmpty(tokenId))
        {
            response.sendRedirect("/login.html");
        }
        
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView)
        throws Exception
    {
        // TODO Auto-generated method stub
        
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception
    {
        // TODO Auto-generated method stub
        
    }
    
}

 

cookie和session

标签:post   method   val   for   明细表   als   blog   equals   注册   

原文地址:http://www.cnblogs.com/wuxun1997/p/7725413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!