首页 > 代码库 > 【实习记】2014-08-16向cgicc拿cookie无果只能自己来
【实习记】2014-08-16向cgicc拿cookie无果只能自己来
功能:
登录时检验从数据库取出的帐号密码,生成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 objectstypedef std::vector<cgicc::HTTPCookie>::iterator cookie_iterator;//! A vector of const HTTPCookie objectstypedef 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是最灵活的语言,改变增加小功能,代码小改动时考虑它。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。