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

【实习记】2014-08-16向cgicc拿cookie无果只能自己来

时间:2014-08-17 11:37:12      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   使用   os   io   文件   数据   

 
 

功能:
登录时检验从数据库取出的帐号密码,生成token放到数据库中,最后设置cookie实现登录。

在操作cookie过程中cgicc方面有太重的stl感,具体来说,太抽象了。

源码有关demo文件夹有官方示例:

    const_cookie_iterator iter;
    for(iter = env.getCookieList().begin();
    iter != env.getCookieList().end();
    ++iter) {
      cout << tr().set("class","data") << td(iter->getName())
       << td(iter->getValue()) << tr() << endl;
    }
    cout << table() << cgicc::div() << endl;

 



这看起来玄乎的用法不是关键问题,关键是没有根据cookie-name拿cookie-value的函数!
要知道post数据看key-value都可以了,cookie却没有。

于是自己尝试封装一下CgiEnv.h

#ifndef _CGIENV_H
#define _CGIENV_H_ 1

#include <algorithm>
#include "cgicc/CgiEnvironment.h"
 
//! A vector of HTTPCookie objects
typedef std::vector<cgicc::HTTPCookie>::iterator     cookie_iterator;
//! A vector of const HTTPCookie objects
typedef std::vector<cgicc::HTTPCookie>::const_iterator const_cookie_iterator;

class CK_nameCompare : public std::unary_function<cgicc::HTTPCookie, bool>
{
public:
 
    inline explicit CK_nameCompare(const std::string& name)
      : fName(name) {}
    
    inline bool operator() (const argument_type& c)     const
    { return c.getName()==fName;}
 
private:
    std::string fName;
};

class CgiEnv: public cgicc::CgiEnvironment
{
    inline const_cookie_iterator getCookie(std::string& name)                 const
    {
        return std::find_if(getCookieList().begin(), getCookieList().end(), CK_nameCompare(name));
    }
};

#endif /* #define _CGIENV_H_ 1 */

 



CgiEnv.cpp为空。
命令:g++ -c CgiEnv.h编译通过的。


本以为可以,实现时却

CgiEnvironment env = cgi.getEnvironment();

 



这表示没那么简单,除非基于cgicc库个类都封装上层子类,即使用cgicc库写自己的库才行。工程有点大,果断绕路。


纵然C++的方式失败了,C的方式却简单易行:

// 函数对象
class CK_nameCompare : public std::unary_function<cgicc::HTTPCookie, bool>
{
public:
 
    inline explicit CK_nameCompare(const std::string& name)
      : fName(name) {}
    
    inline bool operator() (const argument_type& c)     const
    { return c.getName()==fName;}
 
private:
    std::string fName;
};

const string& getCookie(Cgicc &cgi, const string &name){
    const CgiEnvironment& env = cgi.getEnvironment();
    std::vector<cgicc::HTTPCookie>::const_iterator
        begin   = env.getCookieList().begin(),
        end     = env.getCookieList().end(),
        findit;
    findit = std::find_if(begin, end, CK_nameCompare(name));
    if (findit == end)
        return "";
    return findit->getValue();
}

int if_login(Cgicc &cgi){
    char buf_send[MAXLINE]="\0", buf_recv[MAXLINE]="\0";
    if (cgi.getEnvironment().getCookies().empty())
        return 0;
    string  type = getCookie(cgi, "type"),
            name = getCookie(cgi, "name"),
            token= getCookie(cgi, "token");
    if (type.empty() || name.empty() || token.empty())
        return 0;
    string  cmd  = "token|" + type + ‘|‘ + name + ‘|‘ + token;
    send_reci(cmd.c_str(), cmd.size()+10, buf_recv, MAXLINE);
    int err = -1;
    char note[32] = "\0";
    sscanf(buf_recv, "error:%d,note:%s", &err, note);
    return err == 0;
}

 


上面的都已经编译测试过的代码。

感悟:
1、cgicc这个库不够好用,cookie操作太惨白。某天也许我把它封装成更好用的库。
2、C++要用好,必须复杂的用,抽象的用,比如这次必须整库提升。而C是最灵活的语言,改变增加小功能,代码小改动时考虑它。

 

【实习记】2014-08-16向cgicc拿cookie无果只能自己来,布布扣,bubuko.com

【实习记】2014-08-16向cgicc拿cookie无果只能自己来

标签:style   blog   http   使用   os   io   文件   数据   

原文地址:http://www.cnblogs.com/weishun/p/tencent-shixi-2014-08-16-cgicc-weak-cookie.html

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