博客日历
2024年05月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
29 | 30 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
存档
2024年03月 04月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
跨服务器,跨ASP.Net与ASP的Session共享
对于一个大型网站,常常不止一台服务器/站点,这些不同的服务器/站点可能同时运行着ASP,ASP.Net,PHP等多种Web应用程序,这些Web应用程序的域名,IP地址可能不同。这时候如果需要单点登录,就需要使用跨服务器,跨ASP.Net与ASP的Session共享技术。
本方案通过使用数据库、httpHandler、跨域Cookie等技术,实现了在尽量不修改原有代码的基础上,实现多个服务器之间共享Session。
关键技术如下:
1.用数据库存储序列化后的Session数据
2.用跨域Cookie实现多个Web应用程序对一个Cookie的访问(这个Cookie用来标记当前的客户端)
3.通过httpHandler,实现ASP.Net页面中的Session控制
4.通过在ASP文件中包含头文件,实现ASP页面中的Session控制
目前该方案已在某某局的系统上稳定运行一年多时间。
下面是该“跨服务器,跨ASP.Net与ASP的Session共享技术”方案的部署说明:
跨服务器,跨ASP.Net与ASP的Session共享技术.pdf
如果您的项目中正好需要这项技术,可与我联系。
分类:Web开发 查看次数:7875 发布时间:2010/2/7 19:01:19
Antlr.1 语法分析工具Antlr简介,表达式计算器的实现
1.ANTLR简介
http://www.antlr.org/download/antlrworks-1.3.1.jar
可以将antlr-3.2.jar的路径加入到classpath中,通过命令java antlr.Tool来调用。
4.08/2.0+2*(3.2E-3+9.6); //不支持负数,计算结果为:21.2464
// Expr.g// 语法的名称要与文件名一致grammar Expr;//语法选项options{//输出C代码language=C;//生成抽象语法树output=AST;//语法树的类型为pANTLR3_BASE_TREEASTLabelType=pANTLR3_BASE_TREE;}tokens{PLUS = '+';MINUS = '-';MULT = '*';DIV = '/';}//表达式语句statments :expr ';'! //"!"表示将此节点在语法树中忽略;//加法和减法
//"^"表示将当前节点作为语法树的根节点
expr :mult_div_expr ((PLUS^ | MINUS^) mult_div_expr)*;//乘法与除法mult_div_expr :item ((MULT^ | DIV^) item)*;//表达式的因子item :INT| DOUBLE| '('! expr ')'!;//整数INT :'0'..'9'+;//浮点数DOUBLE :('0'..'9')+ '.' ('0'..'9')* EXPONENT?| '.' ('0'..'9')+ EXPONENT?| ('0'..'9')+ EXPONENT;//片段:指数fragmentEXPONENT :('e'|'E') ('+'|'-')? ('0'..'9')+;//空白WHITESPACE :(' '|'\t'|'\n'|'\r')+ {$channel=HIDDEN;};
这里我们使用了C语言作为我们生成的目标代码。相应的C运行时源码(需要使用VS2008编译)下载地址:
http://antlr.org/download/C/libantlr3c-3.1.tar.gz首先创建一个控制台应用程序(使用VS2008),注意:不要使用预编译头。将output目录中生成的文件添加到项目中,并在编译和连接选项中附加antlr的运行时(也可以通过VC++的include,lib目录选项来设置)。源代码如下:
// Expr.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <stack>using namespace std;#include <antlr3.h>#include "output/ExprLexer.h"#include "output/ExprParser.h"#pragma comment(lib,"antlr3c.lib")
//递归显示语法树void DisplayTree(pANTLR3_BASE_TREE tree){static int Level=0;Level++;int k = Level;while ((--k) > 0){cout<<"│";}cout<<"├" << tree->getText(tree)->chars<< endl;for (unsigned int i = 0; i < tree->getChildCount(tree); i++){pANTLR3_BASE_TREE tmp_tree = (pANTLR3_BASE_TREE)tree->getChild(tree,i);DisplayTree(tmp_tree);}Level--;}//存放中间结果的栈stack<double> numbers;
//计算void OP(UINT opType,double num1,double num2){double resault=0.0;switch(opType){case PLUS:{resault = num2 + num1;cout<<num2<<"+"<<num1<<"="<<resault<<";"<<endl;break;}case MINUS:{resault = num2 - num1;cout<<num2<<"-"<<num1<<"="<<resault<<";"<<endl;break;}case MULT:{resault = num2 * num1;cout<<num2<<"*"<<num1<<"="<<resault<<";"<<endl;break;}case DIV:{resault = num2 / num1;cout<<num2<<"/"<<num1<<"="<<resault<<";"<<endl;break;}default:break;}numbers.push(resault);}void CalcTree(pANTLR3_BASE_TREE tree){//cout<<(tree.Text);for (unsigned int i = 0; i < tree->getChildCount(tree); i++){pANTLR3_BASE_TREE tmp_tree = (pANTLR3_BASE_TREE)tree->getChild(tree,i);CalcTree(tmp_tree);}double resault=0;//当前节点类型switch (tree->getType(tree)){case PLUS:case MINUS:case MULT:case DIV:{double a1=numbers.top();numbers.pop();double a2=numbers.top();numbers.pop();OP(tree->getType(tree),a1,a2);break;}case INT:{numbers.push(atoi((char*)tree->getText(tree)->chars));break;}case DOUBLE:{numbers.push(atof((char*)tree->getText(tree)->chars));break;}default:{break;}}}int _tmain(int argc, _TCHAR* argv[]){//char *szExp="(4.08e-3)+6/(2.0+2*(4.6E+2-6+2)*5.15362)+1;";//1.00536//cout<<(4.08e-3)+6/(2.0+2*(4.6E+2-6+2)*5.15362)+1<<endl;char szBuf[512];cin>>szBuf;strcat(szBuf,";");//输入pANTLR3_INPUT_STREAM input= antlr3NewAsciiStringInPlaceStream((pANTLR3_UINT8)szBuf,strlen(szBuf),0);if ( input == NULL ){ANTLR3_FPRINTF(stderr,"Error to load Expression.");return -1;}//生成的词法分析器pExprLexer lexer=ExprLexerNew(input);if ( lexer == NULL ){ANTLR3_FPRINTF(stderr, "Unable to create the lexer due to malloc() failure1\n");return -1;}/*cout<<"\n---------tokens-------------------\n";pANTLR3_COMMON_TOKEN t;//合法的词法元素int i=1;do{t = TOKENSOURCE(lexer)->nextToken(TOKENSOURCE(lexer));if (t != NULL){if (t->channel!=HIDDEN &&
strcmp((char *)(t->getText(t)->chars),"<EOF>")!=0){cout<<i++<<": \t"<<t->type
<<"\t"<<t->getText(t)->chars<<endl;}}}while (t == NULL || t->getType(t) != ANTLR3_TOKEN_EOF);*///token流pANTLR3_COMMON_TOKEN_STREAM tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lexer));if (tstream == NULL){ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate token stream\n");return -1;}pExprParser parser = ExprParserNew(tstream); // CParserNew is generated by ANTLR3if (parser == NULL){ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate parser\n");return -1;}ExprParser_statments_return statments = (ExprParser_statments_return)(parser->statments(parser));if(parser->pParser->rec->state->errorCount>0){ANTLR3_FPRINTF(stderr, "The parser returned %d errors, tree walking aborted.\n",parser->pParser->rec->state->errorCount);return -1;}pANTLR3_BASE_TREE tree=(pANTLR3_BASE_TREE)statments.tree;if (tree == NULL){ANTLR3_FPRINTF(stderr, "tree error.\n");return -1;}cout<<"\n---------Tree-------------------\n";DisplayTree(tree);cout<<"\n---------Calc-------------------\n";CalcTree(tree);return 0;}
输入:
4.08/2.0+2*(3.2E-3+9.6);输出:---------Tree-------------------
├ +
│├ /
││├ 4.08
││├ 2.0
│├ *
││├ 2
││├ +
│││├ 3.2E-3
│││├ 9.6
---------Calc-------------------4.08/2=2.04;0.0032+9.6=9.6032;2*9.6032=19.2064;2.04+19.2064=21.2464;
4.源文件下载
分类:Win32/C++ 查看次数:14759 发布时间:2010/2/7 11:45:31