SSL连接建立过程分析(2)

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn:  yfydz_no1@hotmail.com
来源: http://yfydz.cublog.cn

2.6 SSL_CTX_set_default_passwd_cb[_userdata]()

这个函数比较简单,就是设置SSL要加载的证书的口令,如果不设置的话加载证书时会出提示符要求输入口令的,这样在程序中使用就比较麻烦,该函数就是预先将口令保存,在读证书时自动使用。

实现该功能的有两个函数SSL_CTX_set_default_passwd_cb()和SSL_CTX_set_default_passwd_cb_userdata(),前者是定义一个口令回调函数,要获取口令时口令由该函数获取;后者是直接将口令设置好。

/* ssl/ssl_lib.c */
void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb)
 {
 ctx->default_passwd_callback=cb;
 }
void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u)
 {
 ctx->default_passwd_callback_userdata=u;
 }

举例:

static int
pass_cb(char *buf, int len, int verify, void *password)
{
    snprintf(buf,len, "123456");
    return strlen(buf);
}
SSL_CTX_set_default_passwd_cb(ctx, pass_cb);
等价于:
SSL_CTX_set_default_passwd_cb_userdata(ctx, "123456");
 
2.7 SSL_CTX_use_certificate_file()

该函数读取证书文件,证书文件通常都进行了加密保护。普及一下,证书文件里肯定是有公钥的,一般没私钥,某些情况会把私钥也包含进去,但那样作太不安全了,原则上私钥是永远不会给别人看到的,就算是进行了加密保护。
/* ssl/ssl_rsa.c */
int SSL_use_certificate_file(SSL *ssl, const char *file, int type)
 {
 int j;
 BIO *in;
 int ret=0;
 X509 *x=NULL;
 in=BIO_new(BIO_s_file_internal());
 if (in == NULL)
  {
  SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,ERR_R_BUF_LIB);
  goto end;
  }
 if (BIO_read_filename(in,file) <= 0)
  {
  SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,ERR_R_SYS_LIB);
  goto end;
  }
// 根据证书是PEM还是DER分别读取进行解码
// DER是二进制格式,PEM则是对DER用BASE64编码的后的文本格式
 if (type == SSL_FILETYPE_ASN1)
  {
  j=ERR_R_ASN1_LIB;
  x=d2i_X509_bio(in,NULL);
  }
 else if (type == SSL_FILETYPE_PEM)
  {
  j=ERR_R_PEM_LIB;
  x=PEM_read_bio_X509(in,NULL,ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
  }
 else
  {
  SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,SSL_R_BAD_SSL_FILETYPE);
  goto end;
  }
 if (x == NULL)
  {
  SSLerr(SSL_F_SSL_USE_CERTIFICATE_FILE,j);
  goto end;
  }
// 加载解码后后的证书
 ret=SSL_use_certificate(ssl,x);
end:
 if (x != NULL) X509_free(x);
 if (in != NULL) BIO_free(in);
 return(ret);
 }

2.8 SSL_CTX_use_PrivateKey_file()

该函数加载私钥文件,和SSL_CTX_use_certificate_file()是类似的,因为RSA算法的公钥私钥是对称的,刚生成密钥时谁作私钥都行。
SSL_CTX_use_PrivateKey_file()只加载PEM格式私钥,DER格式的用函数SSL_use_PrivateKey_ASN1()加载。

/* ssl/ssl_rsa.c */
int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type)
 {
 int j,ret=0;
 BIO *in;
 EVP_PKEY *pkey=NULL;
 in=BIO_new(BIO_s_file_internal());
 if (in == NULL)
  {
  SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,ERR_R_BUF_LIB);
  goto end;
  }
 if (BIO_read_filename(in,file) <= 0)
  {
  SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,ERR_R_SYS_LIB);
  goto end;
  }
// 私钥只支持PEM格式
 if (type == SSL_FILETYPE_PEM)
  {
  j=ERR_R_PEM_LIB;
  pkey=PEM_read_bio_PrivateKey(in,NULL,
   ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
  }
 else
  {
  SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE);
  goto end;
  }
 if (pkey == NULL)
  {
  SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,j);
  goto end;
  }
// 加载私钥
 ret=SSL_use_PrivateKey(ssl,pkey);
 EVP_PKEY_free(pkey);
end:
 if (in != NULL) BIO_free(in);
 return(ret);
 }

2.9 SSL_CTX_check_private_key()

该函数检查所用的公钥私钥是否是匹配的
int SSL_CTX_check_private_key(SSL_CTX *ctx)
 {
 if ( (ctx == NULL) ||
  (ctx->cert == NULL) ||
  (ctx->cert->key->x509 == NULL))
  {
  SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);
  return(0);
  }
 if  (ctx->cert->key->privatekey == NULL)
  {
  SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);
  return(0);
  }
// 这才是真正比较函数,在crypto/x509/x509_cmp.c中定义
 return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));
 }
2.10 SSL_new
该函数根据SSL_CTX实现一个SSL结构实例,SSL结构是个很复杂的结构,定义如下:

/* ssl/ssl.h */
typedef struct ssl_st SSL;
struct ssl_st
 {
 /* protocol version
  * (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION)
  */
 int version;
 int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */
 SSL_METHOD *method; /* SSLv3 */
 /* There are 2 BIO's even though they are normally both the
  * same.  This is so data can be read and written to different
  * handlers */
#ifndef OPENSSL_NO_BIO
 BIO *rbio; /* used by SSL_read */
 BIO *wbio; /* used by SSL_write */
 BIO *bbio; /* used during session-id reuse to concatenate
      * messages */
#else
 char *rbio; /* used by SSL_read */
 char *wbio; /* used by SSL_write */
 char *bbio;
#endif
 /* This holds a variable that indicates what we were doing
  * when a 0 or -1 is returned.  This is needed for
  * non-blocking IO so we know what request needs re-doing when
  * in SSL_accept or SSL_connect */
 int rwstate;
 /* true when we are actually in SSL_accept() or SSL_connect() */
 int in_handshake;
 int (*handshake_func)();
 /* Imagine that here's a boolean member "init" that is
  * switched as soon as SSL_set_{accept/connect}_state
  * is called for the first time, so that "state" and
  * "handshake_func" are properly initialized.  But as
  * handshake_func is == 0 until then, we use this
  * test instead of an "init" member.
  */
 int server; /* are we the server side? - mostly used by SSL_clear*/
 int new_session;/* 1 if we are to use a new session.
                  * 2 if we are a server and are inside a handshake
                  *   (i.e. not just sending a HelloRequest)
                  * NB: For servers, the 'new' session may actually be a previously
                  * cached session or even the previous session unless
                  * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
 int quiet_shutdown;/* don't send shutdown packets */
 int shutdown; /* we have shut things down, 0x01 sent, 0x02
    * for received */
 int state; /* where we are */
 int rstate; /* where we are when reading */
 BUF_MEM *init_buf; /* buffer used during init */
 void *init_msg;    /* pointer to handshake message body, set by ssl3_get_message() */
 int init_num;  /* amount read/written */
 int init_off;  /* amount read/written */
 /* used internally to point at a raw packet */
 unsigned char *packet;
 unsigned int packet_length;
 struct ssl2_state_st *s2; /* SSLv2 variables */
 struct ssl3_state_st *s3; /* SSLv3 variables */
 int read_ahead;  /* Read as many input bytes as possible
                    * (for non-blocking reads) */
 /* callback that allows applications to peek at protocol messages */
 void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
 void *msg_callback_arg;
 int hit;  /* reusing a previous session */
 int purpose;  /* Purpose setting */
 int trust;  /* Trust setting */
 /* crypto */
 STACK_OF(SSL_CIPHER) *cipher_list;
 STACK_OF(SSL_CIPHER) *cipher_list_by_id;
 /* These are the ones being used, the ones in SSL_SESSION are
  * the ones to be 'copied' into these ones */
 EVP_CIPHER_CTX *enc_read_ctx;  /* cryptographic state */
 const EVP_MD *read_hash;  /* used for mac generation */
#ifndef OPENSSL_NO_COMP
 COMP_CTX *expand;   /* uncompress */
#else
 char *expand;
#endif
 EVP_CIPHER_CTX *enc_write_ctx;  /* cryptographic state */
 const EVP_MD *write_hash;  /* used for mac generation */
#ifndef OPENSSL_NO_COMP
 COMP_CTX *compress;   /* compression */
#else
 char *compress; 
#endif
 /* session info */
 /* client cert? */
 /* This is used to hold the server certificate used */
 struct cert_st /* CERT */ *cert;
 /* the session_id_context is used to ensure sessions are only reused
  * in the appropriate context */
 unsigned int sid_ctx_length;
 unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
 /* This can also be in the session once a session is established */
 SSL_SESSION *session;
 /* Default generate session ID callback. */
 GEN_SESSION_CB generate_session_id;
 /* Used in SSL2 and SSL3 */
 int verify_mode; /* 0 don't care about verify failure.
     * 1 fail if verify fails */
 int verify_depth;
 int (*verify_callback)(int ok,X509_STORE_CTX *ctx); /* fail if callback returns 0 */
 void (*info_callback)(const SSL *ssl,int type,int val); /* optional informational callback */
 int error;  /* error bytes to be written */
 int error_code;  /* actual code */
#ifndef OPENSSL_NO_KRB5
 KSSL_CTX *kssl_ctx;     /* Kerberos 5 context */
#endif /* OPENSSL_NO_KRB5 */
 SSL_CTX *ctx;
 /* set this flag to 1 and a sleep(1) is put into all SSL_read()
  * and SSL_write() calls, good for nbio debuging :-) */
 int debug; 
 /* extra application data */
 long verify_result;
 CRYPTO_EX_DATA ex_data;
 /* for server side, keep the list of CA_dn we can use */
 STACK_OF(X509_NAME) *client_CA;
 int references;
 unsigned long options; /* protocol behaviour */
 unsigned long mode; /* API behaviour */
 long max_cert_list;
 int first_packet;
 int client_version; /* what was passed, used for
     * SSLv3/TLS rollback check */
 };

/* ssl/ssl_lib.c */
SSL *SSL_new(SSL_CTX *ctx)
 {
 SSL *s;
// 一些必要检查
 if (ctx == NULL)
  {
  SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX);
  return(NULL);
  }
 if (ctx->method == NULL)
  {
  SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION);
  return(NULL);
  }
// 分配SSL实例的空间
 s=(SSL *)OPENSSL_malloc(sizeof(SSL));
 if (s == NULL) goto err;
 memset(s,0,sizeof(SSL));
// 初始化SSL结构参数
#ifndef OPENSSL_NO_KRB5
 s->kssl_ctx = kssl_ctx_new();
#endif /* OPENSSL_NO_KRB5 */
 s->options=ctx->options;
 s->mode=ctx->mode;
 s->max_cert_list=ctx->max_cert_list;
 if (ctx->cert != NULL)
  {
  /* Earlier library versions used to copy the pointer to
   * the CERT, not its contents; only when setting new
   * parameters for the per-SSL copy, ssl_cert_new would be
   * called (and the direct reference to the per-SSL_CTX
   * settings would be lost, but those still were indirectly
   * accessed for various purposes, and for that reason they
   * used to be known as s->ctx->default_cert).
   * Now we don't look at the SSL_CTX's CERT after having
   * duplicated it once. */
  s->cert = ssl_cert_dup(ctx->cert);
  if (s->cert == NULL)
   goto err;
  }
 else
  s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */
 s->read_ahead=ctx->read_ahead;
 s->msg_callback=ctx->msg_callback;
 s->msg_callback_arg=ctx->msg_callback_arg;
 s->verify_mode=ctx->verify_mode;
 s->verify_depth=ctx->verify_depth;
 s->sid_ctx_length=ctx->sid_ctx_length;
 OPENSSL_assert(s->sid_ctx_length <= sizeof s->sid_ctx);
 memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx));
 s->verify_callback=ctx->default_verify_callback;
 s->generate_session_id=ctx->generate_session_id;
 s->purpose = ctx->purpose;
 s->trust = ctx->trust;
 s->quiet_shutdown=ctx->quiet_shutdown;
 CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX);
 s->ctx=ctx;
 s->verify_result=X509_V_OK;
 s->method=ctx->method;
 if (!s->method->ssl_new(s))
  goto err;
 s->references=1;
 s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1;
 SSL_clear(s);
 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL, s, &s->ex_data);
 return(s);
err:
 if (s != NULL)
  {
  if (s->cert != NULL)
   ssl_cert_free(s->cert);
  if (s->ctx != NULL)
   SSL_CTX_free(s->ctx); /* decrement reference count */
  OPENSSL_free(s);
  }
 SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE);
 return(NULL);
 }
 

2.11 SSL_set_fd

SSL_set_fd()函数将建立的SSL结构与TCP套接字联系,使SSL结构对套接字中的TCP数据进行SSL封装。
/* ssl/ssl_lib.c */
int SSL_set_fd(SSL *s,int fd)
 {
 int ret=0;
 BIO *bio=NULL;
// 建立一个BIO,BIO是OpenSSL提供的用来进行算法封装的处理结构,还可以将多个算法
// 串联起来,这样可以很方便地实现数据的封装
 bio=BIO_new(BIO_s_socket());
 if (bio == NULL)
  {
  SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
  goto err;
  }
// 把套接字和BIO联系
 BIO_set_fd(bio,fd,BIO_NOCLOSE);
// 把SSL和BIO联系起来,包括读写操作
 SSL_set_bio(s,bio,bio);
 ret=1;
err:
 return(ret);
 }

void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio)
 {
 /* If the output buffering BIO is still in place, remove it
  */
 if (s->bbio != NULL)
  {
  if (s->wbio == s->bbio)
   {
   s->wbio=s->wbio->next_bio;
   s->bbio->next_bio=NULL;
   }
  }
 if ((s->rbio != NULL) && (s->rbio != rbio))
  BIO_free_all(s->rbio);
 if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
  BIO_free_all(s->wbio);
// 设置SSL读写BIO
 s->rbio=rbio;
 s->wbio=wbio;
 }

SSL_set_fd()还有两个类似函数:
SSL_set_wfd():对写的数据进行SSL封装
SSL_set_rfd():对都的数据进行SSL封装
不过一般情况下用得比较少。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
147 第四章 网络安全协议 1 第四章 网络安全协议 SSL协议 SET协议 IPSec协议 2 因特网与TCP/IP安全-1TCP/IP协议栈 TCP/IP是一组通信协议的缩写 ISO/OSI模型及其与TCP/IP的关系 3 因特网与TCP/IP安全-IP协议 IP数据包中含有源地址和目的地址 不可靠协议,没有做任何事情来确认数据包是否按顺序或是未被破坏 而高层在接受服务时通常假设源地址是有效的 IP地址成为认证的基础 IP协议存在的安全问题不少 4 IP欺骗 攻击者通过伪造一个可信任地址的数据包以使一台机器认证另一台机器的复杂技术 攻击是利用应用程序之间基于IP地址的认证机制,攻击者通过IP地址欺骗获得远程系统的非法授权访问。 5 IP欺骗 过程描述: 1、X->B: SYN(序列号为M),IP=A 2、B->A: SYN(序列号为N),ACK(应答序号=M+1) 此时A没有同B发起连接,当A收到B的包后,会发送RST置位的包给B,从而断开连接 此时攻击者事先让A无法对来自B的任何数据包进行应答。 3、X->B: ACK(应答序号=N+1) IP=A 攻击者猜测B发送给A的序列号。若猜测成功则,X将获得主机B赋予A的权利。 6 IP欺骗 辅助技术1:如何阻止A响应B的包- SYN 淹没 7 IP欺骗 辅助技术2:序列号预测 攻击者事先要进行连接试验: (1)同目标主机进行连接 (2)目标主机应答 (3)记录应答包所含的序列号,继续步骤1测试 分析序列号产生的模式 8 攻击检测 上述攻击过程中,攻击者必须依照一定的顺序来完成网络入侵,这往往是攻击的一种先兆。可安装一个网络嗅探器。 (1)最初,会检测到大量的TCP SYN从某个主机发往A的登录端口。 (2)大量的TCP SYN包将从主机X经过网络发往主机B,相应的有SYN+ACK包从主机B发往X,然后主机X用RST作应答 9 其他措施 配置路由器和网关,使他们拒绝网络外部与本网内具有相同IP地址的连接请求 当包的源IP地址不在本地子网内时,路由器和网关不应该把本网主机的包发出去,以阻止内部用户去破坏他人网络 10 因特网与TCP/IP安全-TCP协议 TCP安全缺陷-TCP连接的可靠性 初始化连接:三次握手,确保双方做好传输准备,统一序列号。 SYN, SEQ = x 主机 B SYN, ACK, SEQ = y, ACK= x 1 ACK, SEQ = x + 1, ACK = y 1 确认 确认 主机 A 连接请求 11 TCP安全缺陷-没有任何认证机制 TCP会话劫持 所谓会话,就是两台主机之间的一次通讯。 例如Telnet到某台主机,这就是一次Telnet会话; 浏览某个网站,这就是一次HTTP会话。 12 会话劫持(Session Hijack),就是在一次正常的会话过程当中,攻击者作为第三方参与到其中,他可以在正常数据包中插入恶意数据,也可以在双方的会话当中进行监听,甚至可以是代替某一方主机接管会话。 原因: TCP假定只要接受到的数据包含有正确的序列号就认为数据是可以接受的。 一旦连接建立,服务器无法确定进入的数据包是否来自真实的机器。 13 会话劫持防范 防范会话劫持是一个比较大的工程。 最根本的解决办法是采用加密通讯,使用SSH代替Telnet、使用SSL加强HTTP,或者干脆使用IPSec/VPN。 其次,监视网络流量,如发现网络中出现大量的ACK包,则有可能已被进行了会话劫持攻击。 完善认证措施,不仅仅在建立会话时进行认证 14 SSL协议—1 概况 SSL协议(Security Socket Layer)是Netscape公司于1994年提出的基于web应用的安全协议。主要介绍SSLv3. SSL主要采用公开密钥体制和x.509数字证书技术。 15 16 SSL协议—1 概况 协议的位置: SSL介于TCP和应用层协议之间。 SSL可以用于任何面向连接的安全通信,但通常用于安全web应用的HTTP协议。 SMTP IP SSL TCP HTTP FTP 17 SSL协议—1 概况 SSL提供一个安全的"握手"来初始化一个TCP/IP连接 建立TCP"连接" SSL握手,建立SSL会话 完成客户端和服务器之间关于安全等级、密码算法、通信密钥的协商,以及执行对连接端身份的认证工作。 SSL连接上所传送的应用层协议数据都会被加密,从而保证通信的机密性。 18 SSL协议—1 概况 提供的安全保护 SSL 服务器鉴别 允许用户证实服务器的身份。具有 SS L功能的浏览器维持一个表,上面有一些可信赖的认证中心 CA (Certificate Authority)和它们的公开密钥。 (2) 加密的 SSL 会话 客户和服务器交互的所有数据都在发送方加密,在接收
因pdf的容量过大分4个压缩包打包,还有一个源码另外下载。 《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习路线。本书既考虑到实际开发中经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发中不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、中级开发人员参考学习,特别有助于.NET从业者进入实战层次,也可作为相关培训机构的参考教材,还可以作为高等院校相关专业师生的参考书。 目录 第1篇 技术基础总结 第1章 .NET,你真的知道了吗 3 1.1 搞清自己是干什么的 4 1.2 .NET的几个特性 7 1.3 万丈高楼平地起:面试者必会 9 1.3.1 C#介绍 10 1.3.2 命名空间 10 1.3.3 C#语法格式要点 10 1.3.4 变量 12 1.3.5 类型推断 12 1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 1.3.9 字符串常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 .NET开发几把小刀 52 1.5.1 using之多变身 52 1.5.2 @符号的妙用 54 1.5.3 预处理指令,有你更轻松 55 1.6 Visual Studio.NET 2008 实战 58 1.6.1 如何创建ASP.NET项目 58 1.6.2 如何创建Windows项目 61 1.6.3 Visual Studio.NET 2008 操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试前的准备 76 本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运算符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 abstract class与interface 91 2.6 公共变量与属性的区别 93 2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和Release版本的 区别 108 本章常见技术面试题 111 常见面试技巧之细节决定成败 111 本章小结 112 第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 3.1.1 独立页面生命周期事件顺序 114 3.1.2 具有Master页的生命周期事件顺序 116 3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2 HtmlInputHidden隐藏域 123 3.2.3 ViewState 123 3.2.4 查询字符串Request 124 3.2.5 Aplication对象 125 3.2.6 Session对象 125 3.2.7 示例项目:在线用户列表统计 128 3.3 服务器和客户端数据交互 131 3.3.1 页面数据绑定全攻略 131 3.3.2 Bind和Eval的区别 140 3.4 ASP.NET编程中的技巧 142 3.4.1 页面之间传值的7种方法 142 3.4.2 get与post方法的区别 146 3.4.3 ASP.NET服务器控件和 HTML控件的区别 146 3.4.4 Server.Transfer和Response.Redirect的区别 148 3.4.5 刷新页面的方法汇总 149 3.4.6 页面事件控制 150 3.4.7 在URL中传递中文的解决方案 152 3.4.8 增强用户体验的一些技巧 153 3.4.9 XHTML与HTML的区别 156 3.5 打造自己的页面基类PageBase 161 本章常见技术面试题 164 常见面试技巧之如何做好自我介绍 164 本章小结 165 第4章 Windows窗体编程你也行 167 4.1 创建简单的WinForm项目 168 4.2 创建MDI窗体应用 170 4.3 获取应用程序路径信息 174 4.4 回车跳转控件焦点 175 4.5 窗体间传递复杂数据 176 4.5.1 构造传递 176 4.5.2 公有字段传递 177 4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 4.12.5 模态窗口和非模态窗口 196 4.12.6 屏蔽窗口右上角的关闭 操作 196 4.12.7 调用执行外部的程序 197 本章常见技术面试题 197 常见面试技巧之经典问题巧回答 198 本章小结 198 第5章 数据库开发 199 5.1 ADO.NET与抽水的故事 200 5.1.1 ADO.NET的定义 200 5.1.2 趣味理解ADO.NET对象模型 202 5.1.3 进水笼头——建立Connection 204 5.1.4 抽水机——Command 206 5.1.5 输水管——DataAdapter 209 5.1.6 输水管——DataReader 210 5.1.7 随用随关,释放资源 212 5.1.8 水库管理——DataSet 212 5.1.9 水池子——DataTable 214 5.2 数据库操作类的封装详解 217 5.2.1 执行命令方法的封装 217 5.2.2 查询数据方法的封装 220 5.2.3 数据统计方法的封装 221 5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 Oracle和SQL Server的常用函数对比 240 5.5.2 Oracle和SQL Server的语句区别 244 5.5.3 ASP.NET连接Oracle失败的解决方法 245 本章常见技术面试题 246 常见面试技巧之经典问题巧回答 246 本章小结 247 第6章 关于XML 249 6.1 XML概述 250 6.1.1 XML和HTML有什么区别 250 6.1.2 XML的优势 250 6.2 文档结构与基本语法 251 6.3 XML操作 253 6.3.1 XmlDocument创建XML文档 253 6.3.2 XmlTextWriter创建XML文档 254 6.3.3 XmlDocument读取XML文档 256 6.3.4 XmlTextReader读取XML文档 257 6.3.5 在HTML中显示XML中的数据 258 6.3.6 JavaScript获取XML内容 259 6.3.7 项目案例:通用自定义XML配置类 263 6.4 ADO.NET与XML 266 6.4.1 读XML文档到DataSet 266 6.4.2 DataSet转为XML文档 267 6.5 项目案例1:实现网站的RSS应用 267 6.6 项目案例2:在线实现RSS阅读器 270 本章常见技术面试题 275 常见面试技巧之经典问题巧回答 275 本章小结 276 第7章 Web Service开发详解 277 7.1 Web Service基本概念 278 7.2 Web Service的应用场景 278 7.3 创建简单的Web Service项目应用 280 7.4 Web Service属性介绍 282 7.5 ASP.NET如何调用Web Service 286 7.6 JavaScript如何调用Web Service 288 7.6.1 通过webbehavior.htc调用Web Service 288 7.6.2 通过Microsoft.XMLDOM调用Web Service 291 7.6.3 XMLHTTP POST调用Web Service 293 7.6.4 SOAP调用Web Service 293 7.7 WinForm如何调用Web Service 295 7.7.1 .NET的WinForm调用Web Service 295 7.7.2 手动发送HTTP请求调用Web Service 295 7.8 实现异步调用Web Service 297 7.9 如何保证Web Service的安全 299 7.9.1 通过SoapHeader来增强 Web Service的安全性 299 7.9.2 采用SSL实现加密传输 302 7.9.3 访问IP限制 315 7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax 324 8.1.2 Ajax技术的核心 325 8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 333 8.2.1 安装ASP.NET 2.0 Ajax Extensions 333 8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新 338 8.2.6 Ajax错误处理 341 8.2.7 告诉用户你正在做什么—— UpdateProgress控件 342 8.2.8 ASP.NET AjaxControToolKit简介 345 8.3 使用第三方组件 Ajax.dll 开发 347 8.4 使用第三方组件AjaxPro的开发 351 8.5 使用第三方组件MagicAjax的开发 351 8.6 Ajax开发原则 352 本章常见技术面试题 353 常见面试技巧之经典问题巧回答 353 本章小结 354 第9章 系统与文件操作 355 9.1 获取系统信息 356 9.1.1 用SystemInformation类获取系统信息 356 9.1.2 用Environment 类获取系统信息 357 9.1.3 通过WMI获取系统信息 358 9.1.4 用RegistryKey 类读取系统信息 361 9.1.5 用API函数获取系统信息 363 9.1.6 获取系统服务信息 365 9.2 文件操作 368 9.2.1 StreamWriter类实现写文件 368 9.2.2 通过File类创建文件 369 9.2.3 通过FileStream类创建文件 370 9.2.4 通过FileInfo类创建文件 370 9.2.5 追加文本 370 9.2.6 读取文本文件 371 9.2.7 读写二进制文件 372 9.2.8 文件复制、移动、删除 374 9.3 文件夹目录操作 375 9.4 读写INI文件 376 9.5 读写注册表 379 本章常见技术面试题 381 常见面试技巧之经典问题巧回答 381 本章小结 382 第10章 网络应用开发 383 10.1 Socket基本编程 384 10.1.1 Socket基本知识 384 10.1.2 Socket服务端开发步骤 386 10.1.3 Socket客户端开发步骤 388 10.2 异步Socket通信——实现MSN机器人 390 10.2.1 机器人服务端 390 10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399 本章常见技术面试题 401 常见面试技巧之经典问题巧回答 401 本章小结 402 第11章 Windows Service开发 403 11.1 什么是Windows服务 404 11.2 创建Windows服务 404 11.3 Windows服务开发常见问题 408 11.4 安装/卸载Windows服务 409 11.4.1 安装Windows服务 409 11.4.2 卸载Windows服务 410 11.4.3 Windows服务应用程序体系结构 411 11.5 调试Windows服务 414 11.5.1 日志调试法 414 11.5.2 附加进程断点调试法 414 本章常见技术面试题 416 职场智慧之初入江湖 416 本章小结 418 第12章 新技术初探 419 12.1 WPF 421 12.1.1 WPF简介 421 12.1.2 WPF何以令人佩服 422 12.1.3 XAML概述 422 12.1.4 WPF开发环境配置 423 12.1.5 项目示例:开发一个简单的WPF应用程序 424 12.2 WCF 427 12.2.1 SOA是什么 427 12.2.2 WCF是什么 428 12.2.3 WCF的优势是什么 428 12.2.4 WCF开发环境 431 12.2.5 项目示例:订票服务WCF开发步骤 431 12.3 LINQ 440 12.3.1 LINQ的架构 441 12.3.2 传统的查询 441 12.3.3 LINQ查询实例 444 12.3.4 LINQ查询语法 448 本章常见技术面试题 449 职场智慧之学习方法 449 本章小结 450 第2篇 系统架构设计思想 第13章 面向对象思想 453 13.1 为什么要面向对象 454 13.2 什么是面向对象 456 13.3 面向对象的特点 458 13.3.1 封装 459 13.3.2 继承 459 13.3.3 多态 460 13.4 面向对象设计和开发实例 466 13.4.1 传统过程化设计实现播放器功能 466 13.4.2 基于面向对象设计实现播放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法 475 13.6 面向对象设计的原则 478 13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一职责原则(SRP) 486 13.6.6 依赖倒置原则(DIP) 486 13.6.7 接口分离原则(ISP) 489 13.6.8 面向对象设计时需要注意的 问题 490 本章常见技术面试题 491 本章小结 491 第14章 三层架构项目开发 493 14.1 什么是三层架构 494 14.1.1 常用的三层架构设计 494 14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 504 14.3.5 业务逻辑层的实现 509 14.3.6 表示层的实现 510 14.4 实现基于工厂模式的三层架构 512 14.4.1 扩展新增数据访问层 512 14.4.2 IDAL抽象接口的实现 513 14.4.3 创建DAL对象的封装 517 14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面(HTML)优化的方法 534 15.3 ASP.NET开发性能优化 540 15.3.1 如没必要,尽量使用静态HTML页面 540 15.3.2 避免不必要的回送操作 541 15.3.3 尽量在客户端进行用户输入验证 541 15.3.4 关闭不必要的Session状态 542 15.3.5 优先使用HTML控件,而非服务器控件 542 15.3.6 不必要时关闭ViewState 542 15.3.7 禁用调试模式 543 15.4 系统缓存管理 543 15.4.1 缓存的分类 544 15.4.2 传统缓存方式 545 15.4.3 页面输出缓存 545 15.4.4 页面输出缓存API 548 15.4.5 页面局部缓存 549 15.4.6 应用程序数据缓存 554 15.4.7 文件缓存依赖 555 15.4.8 数据库缓存依赖 557 15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5.7 数据的绑定DataBinder 568 15.5.8 使用DataReader的注意事项 568 15.5.9 Command对象的使用 569 15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量避免大事务操作 572 15.5.16 尽量避免使用游标 573 15.5.17 为你的表建立适当的索引 573 15.6 网站安全防护 573 15.6.1 什么是SQL注入式攻击 573 15.6.2 如何防范SQL注入式攻击 574 15.6.3 实现页面验证码 575 15.6.4 实现文件防盗链 579 15.6.5 采用HTTPS进行访问 584 15.7 IIS优化 584 15.7.1 如何监测IIS服务器并发数 584 15.7.2 采用Gzip压缩页面优化 585 15.7.3 网站应用程序池配置 588 15.8 网站架构优化策略 593 本章常见技术面试题 596 职场智慧之独善其身 596 本章小结 599 第16章 系统设计的原则和技巧 601 16.1 系统设计的一些原则 602 16.1.1 最适合的才是最好的 602 16.1.2 以不变应万变 603 16.1.3 可扩展性 603 16.1.4 可复用性 604 16.2 系统设计的常用方法 604 16.3 敏捷软件开发12条原则 608 16.4 系统架构师成长之路 611 本章常见技术面试题 615 职场智慧之职场政治 615 本章小结 616 第3篇 项目实战解析 第17章 权限角色管理项目解析 619 17.1 权限角色管理概述 620 17.2 项目概述 623 17.3 数据库设计 624 17.3.1 数据库实体关系模型 624 17.3.2 表结构设计 625 17.4 数据访问层 627 17.4.1 类设计 627 17.4.2 代码实现 629 17.5 业务逻辑层 629 17.5.1 类设计 630 17.5.2 扩展.NET Framework用户处理机制 632 17.6 接口调用与Web管理实现 638 17.6.1 Web.config配置 638 17.6.2 用户身份和权限验证 638 17.6.3 用户验证接口方式:权限验证用户控件 640 17.6.4 用户验证接口方式:页面基类 642 17.6.5 用户和角色权限的后台管理 644 职场智慧之如何提升自己在公司的价值 652 本章小结 653 第18章 单点登录系统的设计与实现 655 18.1 项目概述 656 18.1.1 名词定义 656 18.1.2 项目需求描述 656 18.2 业务流程设计 657 18.2.1 用户认证流程 657 18.2.2 安全验证流程 658 18.3 功能与接口设计 659 18.3.1 接口交互设计 659 18.3.2 应用系统接口 660 18.3.3 认证服务器功能和接口 660 18.4 数据库设计 660 18.4.1 数据库实体关系模型 661 18.4.2 表结构设计 661 18.5 实现认证服务器 662 18.5.1 SSO解决方案 663 18.5.2 系统管理后台 664 18.5.3 用户通行证管理中心 665 18.5.4 认证服务器接口开发 673 18.6 应用系统接入接口开发 675 18.6.1 用户身份认证 675 18.6.2 接收状态同步 676 18.6.3 用户注销 678 18.6.4 更新认证服务器状态 679 18.7 接口封装及调用 679职场智慧之晋升之道 682 本章小结 684 第19章 常用.NET开发工具介绍 685 19.1 源码版本管理: Visual SourceSafe 2005 686 19.1.1 安装和配置VSS 2005服务端 686 19.1.2 安装和配置VSS客户端 691 19.1.3 将项目加入VSS版本控制 692 19.1.4 客户端连接VSS 服务器获取源代码 694 19.1.5 设置VSS支持通过 Internet访问 696 19.1.6 版本控制的几个概念 701 19.1.7 VSS项目权限管理 703 19.1.8 VSS数据备份 705 19.1.9 VSS 2005的使用规范 707 19.2 单元测试工具:NUnit 708 19.2.1 NUnit简介 708 19.2.2 手把手教你在.NET中应用NUnit 708 19.3 日志工具——Log4net 714 19.3.1 Log4net简介 714 19.3.2 使用步骤 717 19.3.3 单独配置文件的使用 719 19.4 代码规范检查工具: Microsoft Source Analysis for C# 721 19.5 生成文档注释工具:GhostDoc 723 19.6 反编译工具:Reflector for .NET 732 19.7 动软.NET代码生成器 733 19.8 帮助文档生成工具:Sandcastle 737 19.8.1 Sandcastle介绍 737 19.8.2 生成方式 738 19.8.3 具体生成步骤 740 本章小结 748 附录A 软件编码规范 A.1 概述 750 A.1.1 规范基本原则 750 A.1.2 术语定义 750 A.1.3 文件命名组织 750 A.2 代码外观 751 A.2.1 列宽 751 A.2.2 换行 751 A.2.3 缩进 751 A.2.4 空行 751 A.2.5 空格 752 A.2.6 括号——() 753 A.2.7 花括号——{} 753 A.3 程序注释 754 A.3.1 注释概述 754 A.3.2 文档型注释 755 A.3.3 类注释 755 A.3.4 单行注释 755 A.3.5 注释标签 756 A.4 声明 758 A.4.1 每行声明数 758 A.4.2 初始化 758 A.4.3 位置 758 A.4.4 类和接口的声明 759 A.4.5 字段的声明 759 A.5 命名规范 759 A.5.1 命名概述 759 A.5.2 大写规则 760 A.5.3 缩写 761 A.5.4 命名空间 761 A.5.5 类 762 A.5.6 接口 762 A.5.7 属性(Attribute) 763 A.5.8 枚举(Enum) 763 A.5.9 参数 763 A.5.10 方法 764 A.5.11 属性(property) 764 A.5.12 事件 765 A.5.13 常量(const) 766 A.5.14 字段 767 A.5.15 静态字段 768 A.5.16 集合 768 A.5.17 措词 768 A.6 语句 769 A.6.1 每行一个语句 769 A.6.2 复合语句 769 A.6.3 return语句 769 A.6.4 if、if-else、if else-if语句 770 A.6.5 for、foreach 语句 770 A.6.6 while语句 771 A.6.7 do-while语句 771 A.6.8 switch-case语句 771 A.6.9 try-catch语句 772 A.6.10 using块语句 772 A.6.11 goto语句 772 A.7 其他 773 A.7.1 表达式 773 A.7.2 类型转换 773 A.8 匈牙利命名法 773 A.9 控件命名规则 774 A.9.1 一般命名方法 774 A.9.2 主要控件名简写对照表 774 ……
一、首先你要确认你的鉴别模式: WIN NT鉴别模式呢还是混合模式,其中混合模式包括WIN NT鉴别模式和SQL SERVER 鉴别模式 实施鉴别模式的步骤 1、核实采用了可信连接 2、设置鉴别模式 3、关闭和重启MSSQLServer服务程序 4、创建WIN NT分组和用户 5、授权WIN NT分组和用户可存取SQL Server 6、为用非可信任连接的用户创建SQL Server登录帐号 二、为用户和角色分配登录帐号 三、给角色分配登录权 四、为用户和角色分配许可权限 在改进SQL Server 7.0系列所实现的安全机制的过程中,Microsoft建立了一种既灵活又强大的安全管理 机制,它能够对用户访问SQL Server服务器系统和数据库的安全进行全面地管理。按照本文介绍的步骤,你 可以为SQL Server 7.0(或2000)构造出一个灵活的、可管理的安全策略,而且它的安全性经得起考验。 一、验证方法选择 本文对验证(authentication)和授权(authorization)这两个概念作不同的解释。验证是指检验用户 的身份标识;授权是指允许用户做些什么。在本文的讨论中,验证过程在用户登录SQL Server的时候出现, 授权过程在用户试图访问数据或执行命令的时候出现。 构造安全策略的第一个步骤是确定SQL Server用哪种方式验证用户。SQL Server的验证是把一组帐户、密 码与Master数据库Sysxlogins表中的一个清单进行匹配。Windows NT/2000的验证是请求域控制器检查用户身 份的合法性。一般地,如果服务器可以访问域控制器,我们应该使用Windows NT/2000验证。域控制器可以是 Win2K服务器,也可以是NT服务器。无论在哪种情况下,SQL Server都接收到一个访问标记(Access Token)。 访问标记是在验证过程中构造出来的一个特殊列表,其中包含了用户的SID(安全标识号)以及一系列用户所 在组的SID。正如本文后面所介绍的,SQL Server以这些SID为基础授予访问权限。注意,操作系统如何构造访 问标记并不重要,SQL Server只使用访问标记中的SID。也就是说,不论你使用SQL Server 2000、SQL Server 7.0、Win2K还是NT进行验证都无关紧要,结果都一样。 如果使用SQL Server验证的登录,它最大的好处是很容易通过Enterprise Manager实现,最大的缺点在于 SQL Server验证的登录只对特定的服务器有效,也就是说,在一个多服务器的环境中管理比较困难。使用SQL Server进行验证的第二个重要的缺点是,对于每一个数据库,我们必须分别地为它管理权限。如果某个用户 对两个数据库有相同的权限要求,我们必须手工设置两个数据库的权限,或者编写脚本设置权限。如果用户数 量较少,比如25个以下,而且这些用户的权限变化不是很频繁,SQL Server验证的登录或许适用。但是,在几 乎所有的其他情况下(有一些例外情况,例如直接管理安全问题的应用),这种登录方式的管理负担将超过它 的优点。 二、Web环境中的验证 即使最好的安全策略也常常在一种情形前屈服,这种情形就是在Web应用中使用SQL Server的数据。在这 种情形下,进行验证的典型方法是把一组SQL Server登录名称和密码嵌入到Web服务器上运行的程序,比如 ASP页面或者CGI脚本;然后,由Web服务器负责验证用户,应用程序则使用它自己的登录帐户(或者是系统管 理员sa帐户,或者为了方便起见,使用Sysadmin服务器角色中的登录帐户)为用户访问数据。 这种安排有几个缺点,其中最重要的包括:它不具备对用户在服务器上的活动进行审核的能力,完全依 赖于Web应用程序实现用户验证,当SQL Server需要限定用户权限时不同的用户之间不易区别。如果你使用的 是IIS 5.0或者IIS 4.0,你可以用四种方法验证用户。第一种方法是为每一个网站和每一个虚拟目录创建一 个匿名用户的NT帐户。此后,所有应用程序登录SQL Server时都使用该安全环境。我们可以通过授予NT匿名 帐户合适的权限,改进审核和验证功能。 第二种方法是让所有网站使用Basic验证。此时,只有当用户在对话框中输入了合法的帐户和密码,IIS 才会允许他们访问页面。IIS依靠一个NT安全数据库实现登录身份验证,NT安全数据库既可以在本地服务器 上,也可以在域控制器上。当用户运行一个访问SQL Server数据库的程序或者脚本时,IIS把用户为了浏览 页面而提供的身份信息发送给服务器。如果你使用这种方法,应该记住:在通常情况下,浏览器与
全书一共被压缩为5个rar,这是第二个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.   本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解上,本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。.. 本书语言生动、通俗易懂、讲解细致,大部分章节都提供了多个例子,而且很多例子都是目前web开发中经常使用的功能,具有相当的实用价值。本书不仅可以作为java web开发的学习用书,还可以作为从事java web开发的程序员的参考用书和必备手册。此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml与dtd 2 1.1 xml的产生 2 1.2 w3c介绍 2 1.3 关于xml的几个问题 3 1.4 xml与html的比较 4 1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释 15 1.6.5 处理指令 15 1.6.6 空白处理 16 1.6.7 行尾处理 16 1.6.8 语言标识 16 1.7 格式良好的xml 17 .1.8 dtd 18 1.8.1 在xml文档中引入dtd 18 1.8.2 dtd的结构 21 1.9 有效的xml 35 1.10 xml处理器/解析器 35 1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd 43 2.4 小结 45 第3章 对xml文档进行分析 46 3.1 dom、sax和jaxp 46 3.2 使用dom解析xml文档 47 3.2.1 dom结构模型 47 3.2.2 dom解析器工厂 50 3.2.3 jaxp的错误类和异常类 52 3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 3.6 解析名称空间 96 3.6.1 dom和名称空间 96 3.6.2 sax和名称空间 97 3.6.3 jdom和名称空间 98 3.6.4 dom4j和名称空间 98 3.7 小结 99 第4章 xsl转换 101 4.1 xslt概述 101 4.2 xalan处理器 105 4.3 模板规则 106 4.4 [xsl:apply-templates]元素 107 4.5 [xsl:value-of]元素 108 4.6 [xsl:for-each]元素 110 4.7 匹配节点的模式 111 4.8 mode属性 113 4.9 内置的模板规则 114 4.10 对空白的处理 115 4.11 xpath语言 116 4.11.1 xpath上下文 116 4.11.2 位置路径 117 4.11.3 表达式 121 4.11.4 核心函数库 123 4.12 创建结果树 126 4.12.1 创建元素和属性 127 4.12.2 创建文本 131 4.12.3 创建处理指令 133 4.12.4 创建注释 133 4.12.5 复制节点 134 4.12.6 输出格式化的数字 135 4.13 条件处理 144 4.13.1 [xsl:if] 144 4.13.2 [xsl:choose] 145 4.14 排序 146 4.15 变量和参数 150 4.15.1 变量 150 4.15.2 参数 152 4.16 命名模板 153 4.17 合并样式表 154 4.17.1 导入样式表 154 4.17.2 包含样式表 155 4.18 模板规则冲突的解决 156 4.19 [xsl:output]元素 157 4.19.1 指定输出文档的格式 158 4.19.2 输出xml声明 158 4.19.3 输出文档类型定义 159 4.19.4 输出cdata段 160 4.19.5 指定文档缩进 161 4.19.6 指定媒体类型 161 4.20 xslt中的函数 162 4.21 数字格式化 162 4.22 查询和分组 164 4.23 处理多个输入文档 172 4.24 jaxp中的xslt api 175 4.24.1 转换器工厂 175 4.24.2 transformer和templates 176 4.24.3 一个例子 178 4.25 小结 179 第2部分 servlet篇 第5章 servlet与tomcat 182 5.1 servlet与servlet容器 182 5.2 servlet容器的分类 183 5.3 servlet和其他技术的比较 183 5.4 tomcat介绍 183 5.5 tomcat的安装与配置 184 5.5.1 安装tomcat 185 5.5.2 运行tomcat 186 5.5.3 tomcat启动分析 189 5.5.4 tomcat的体系结构 191 5.6 tomcat的管理程序 193 5.6.1 admin web应用程序 193 5.6.2 manager web应用程序 194 5.7 小结 195 第6章 servlet技术 196 6.1 servlet api 196 6.1.1 servlet接口 196 6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 6.3.1 servletexception类 224 6.3.2 unavailableexception类 224 6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 6.6.3 请求转发的实例 233 6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet配置相关的元素 247 7.4.1 [servlet]元素及其子元素 247 7.4.2 [servlet-mapping]元素及其子元素 249 7.5 一个实例 250 7.6 小结 253 第8章 数据库访问 254 8.1 驱动程序的类型 254 8.1.1 jdbc-odbc桥 254 8.1.2 部分本地api java驱动程序 255 8.1.3 jdbc网络纯java驱动程序 255 8.1.4 本地协议的纯java驱动程序 256 8.2 安装数据库 256 8.3 jdbc api 260 8.3.1 加载并注册数据库驱动 261 8.3.2 建立到数据库的连接 263 8.3.3 访问数据库 264 8.3.4 事务处理 289 8.3.5 可滚动和可更新的结果集 296 8.4 jdbc数据源和连接池 299 8.5 mysql对中文的处理 302 8.6 小结 302 第9章 会话跟踪 303 9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话跟踪 306 9.2.1 httpsession接口 306 9.2.2 session的生命周期 307 9.2.3 cookie的应用 319 9.2.4 httpsessionbindinglistener接口 328 9.2.5 在线人数统计程序 329 9.3 小结 335 第10章 servlet的异常处理机制 337 10.1 声明式异常处理 338 10.1.1 http错误代码的处理 338 10.1.2 java异常的处理 341 10.2 程序式异常处理 343 10.2.1 在try-catch语句中处理异常 343 10.2.2 使用requestdispatcher来处理异常 346 10.3 小结 349 第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 思考题 363 第3部分 jsp篇 第12章 jsp技术 366 12.1 jsp简介 366 12.2 jsp的运行机制 366 12.3 jsp的语法 371 12.3.1 指令元素(directive elements) 371 12.3.2 脚本元素(scripting elements) 374 12.3.3 动作元素(action elements) 376 12.3.4 注释 383 12.4 jsp的隐含对象 383 12.4.1 pagecontext 384 12.4.2 out 385 12.4.3 page 385 12.4.4 exception 386 12.5 对象和范围 387 12.6 留言板程序 389 12.7 留言板管理程序 397 12.8 jsp文档 402 12.8.1 jsp文档的标识 404 12.8.2 jsp文档中的元素语法 404 12.9 小结 407 第13章 jsp与javabean 409 13.1 javabean简介 409 13.1.1 属性的命名 409 13.1.2 属性的类型 411 13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:getproperty] 414 13.2.4 示例 414 13.3 网上书店程序 418 13.4 小结 440 第14章 jsp开发的两种模型 441 14.1 模型1 441 14.2 模型2 445 14.3 小结 449 第15章 标签库(tag library) 450 15.1 标签库api 450 15.1.1 标签的形式 451 15.1.2 tag接口 451 15.1.3 iterationtag接口 453 15.1.4 bodytag接口 454 15.2 标签库描述符 455 15.2.1 [taglib]元素 456 15.2.2 [validator]元素 457 15.2.3 [listener]元素 457 15.2.4 [tag]元素 458 15.2.5 [tag-file]元素 460 15.2.6 [function]元素 461 15.3 传统标签的开发 462 15.3.1 实例一:[hello]标签 462 15.3.2 实例二:[max]标签 465 15.3.3 实例三:[greet]标签 467 15.3.4 实例四:[switch]标签 469 15.3.5 实例五:[iterate]标签 473 15.4 简单标签的开发 479 15.4.1 simpletag接口 479 15.4.2 实例一:[welcome]标签 480 15.4.3 实例二:[max_ex]标签 481 15.5 小结 483 第16章 表达式语言(el) 484 16.1 语法 484 16.1.1 “[ ]”和“.”操作符 484 16.1.2 算术操作符 484 16.1.3 关系操作符 485 16.1.4 逻辑操作符 485 16.1.5 empty操作符 485 16.1.6 条件操作符 485 16.1.7 圆括号 486 16.1.8 操作符的优先级 486 16.2 隐含对象 486 16.3 命名变量 487 16.4 保留的关键字 488 16.5 函数 488 16.6 小结 489 第17章 jsp标准标签库(jstl) 490 17.1 jstl简介 490 17.2 配置jstl 491 17.3 core标签库 491 17.3.1 一般用途的标签 492 17.3.2 条件标签 496 17.3.3 迭代标签 498 17.3.4 url相关的标签 501 17.4 i18n标签库 506 17.4.1 国际化标签 506 17.4.2 格式化标签 511 17.5 sql标签库 520 17.5.1 [sql:setdatasource] 520 17.5.2 [sql:query] 521 17.5.3 [sql:param] 524 17.5.4 [sql:dateparam] 525 17.5.5 [sql:update] 526 17.5.6 [sql:transaction] 527 17.6 xml标签库 529 17.6.1 核心操作 529 17.6.2 流程控制 532 17.6.3 转换操作 536 17.7 functions标签库 539 17.7.1 fn:contains 539 17.7.2 fn:containsignorecase 539 17.7.3 fn:startswith 540 17.7.4 fn:endswith 541 17.7.5 fn:indexof 541 17.7.6 fn:replace 542 17.7.7 fn:substring 543 17.7.8 fn:substringbefore 544 17.7.9 fn:substringafter 544 17.7.10 fn:split 545 17.7.11 fn:join 546 17.7.12 fn:tolowercase 547 17.7.13 fn:touppercase 547 17.7.14 fn:trim 548 17.7.15 fn:escapexml 548 17.7.16 fn:length 549 17.8 小结 549 第18章 标签文件(tag files) 551 18.1 标签文件的语法 551 18.2 一个简单的标签文件 551 18.3 标签文件的隐含对象 554 18.4 标签文件的指令 555 18.4.1 tag指令 555 18.4.2 attribute指令 556 18.4.3 variable指令 557 18.5 标签文件实例讲解 558 18.5.1 实例一:[welcome]标签 558 18.5.2 实例二:[tohtml]标签 559 18.6 [jsp:invoke]动作元素 561 18.7 [jsp:dobody]动作元素 562 18.8 小结 562 第4部分 应用篇 第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 587 第20章 filter在web开发中的应用 588 20.1 过滤器概述 588 20.2 filter api 589 20.2.1 filter接口 589 20.2.2 filterconfig接口 590 20.2.3 filterchain接口 590 20.3 过滤器的部署 591 20.4 过滤器的开发 592 20.5 对用户进行统一验证的过滤器 594 20.6 对请求和响应数据进行替换的 20.6 过滤器 600 20.7 小结 609 第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 21.5.3 编写国际化的web应用程序 625 21.6 小结 629 第22章 使用jbuilder2005开发web 第22章 应用程序 630 22.1 jbuilder2005简介 630 22.2 集成开发环境介绍 631 22.2.1 菜单栏 631 22.2.2 主工具栏 632 22.2.3 工程工具栏和工程窗口 632 22.2.4 结构窗口 633 22.2.5 文件标签和内容窗口 634 22.2.6 文件视图标签 634 22.2.7 消息窗口 637 22.3 jbuilder2005的基本配置 638 22.3.1 配置jdk 638 22.3.2 配置web服务器 640 22.4 文件的上传和下载 642 22.4.1 基于表单的文件上传 642 22.4.2 文件上传格式分析 643 22.4.3 commons-fileupload组件 644 22.4.4 文件上传实例 646 22.4.5 文件下载实例 656 22.5 给图片添加水印和文字 664 22.6 小结 667 第23章 开发安全的web应用程序 668 23.1 概述 668 23.2 理解验证机制 669 23.2.1 http basic authentication 669 23.2.2 http digest authentication 670 23.2.3 https client authentication 670 23.2.4 form based authentication 671 23.3 声明式安全 671 23.3.1 [security-constraint]元素 671 23.3.2 [login-config]元素 673 23.3.3 基本验证的实现 674 23.3.4 基于表单验证的实现 676 23.3.5 使用数据库保存用户名和密码 678 23.4 程序式安全 682 23.5 sql注入攻击的防范 685 23.6 小结 687 第24章 web应用程序开发实例 688 24.1 图像的缩放 688 24.2 如何动态生成验证码 692 24.3 如何避免表单的重复提交 696 24.3.1 在客户端避免表单的重复提交 697 24.3.2 在服务器端避免表单的重复 24.3.2 提交 700 24.4 小结 706 第25章 使用ant辅助web应用程序 第25章 开发 707 25.1 ant介绍 707 25.2 安装并配置ant 708 25.2.1 下载并安装ant 708 25.2.2 设置ant的运行环境 708 25.3 编写ant的构建文件 709 25.3.1 准备工作 709 25.3.2 工程([project]) 712 25.3.3 目标([target]) 713 25.3.4 任务 714 25.3.5 path-like structures 728 25.3.6 引用(references) 729 25.4 部署到tomcat 730 25.5 运行ant 732 25.6 小结 732 第26章 xml和xslt在web开发中的 第26章 应用 733 26.1 功能概述 733 26.2 程序设计 733 26.2.1 软件架构 733 26.2.2 页面设计 735 26.2.3 数据库设计 747 26.3 程序实现 749 26.3.1 org.sunxin.guestbook 749 26.3.2 org.sunxin.guestbook.beans 750 26.3.3 org.sunxin.guestbook.util 758 26.3.4 org.sunxin.guestbook.parser 762 26.3.5 org.sunxin.guestbook.controller 765 26.3.6 org.sunxin.guestbook.view 787 26.3.7 page.xsl 791 26.3.8 web.xml 797 26.3.9 context.xml 798 26.4 小结 798 附录a 快速掌握html 799 附录b 解析http 820 附录c server.xml文件 833 附录d web.xml文件 840 索引 852...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值