• 新申请的blog 第一天 把自己以前开发的一个系统的开发日记贴上来 见笑了


     

    计算机系基础教研室网络教育平台开发日记

    作者:余昭辉

    20050516

    今日阅《道法自然------面向对象实践指南》有感:

    书曰:只实现你需要的,不要实现你认为你需要的

    是的,作为一个程序设计者,总想自己的程序优美,总想用最优秀的技术实现自己的程序,

    殊不知,外界环境总是在变化,一个软件不可能在设计之初多么完美,但是只要你不断的维护,更新,这个软件就会变得越来越优秀!

     

    20050517

    今天完成了新闻发布部分,在这个部分我使用了一个免费的服务器控件,使用后,本来很难实现的文章编辑器就很轻松的完成了,而且还非常漂亮.完成后舒了一口气,想到:

    作为一个程序设计者是非常崇拜原创,希望自己的软件是自己个人功劳,但在软件行业高速发展的今天,这种想法是大错特错的。一个程序员不仅要会编写自己的代码,还要会利用别人的代码,相比,别人的代码,大多通过了良好的测试,而如果自己原创话,首先不一定作的比别人的好,而且需要大量的时间测试。有现成的,可用的代码为什么不用?而且这也就是面向对象程序设计的初衷-------------代码重用。

    会偷懒的程序员才是优秀的程序员,因为当初计算机就是为了偷懒而设计的!

     

    20050518

    我要将一个文件夹只能让一个用户组访问怎么办?

    可否在网站根目录下的weh.config里这样设置:

    <location path="admin">

        <system.web>

          <authorization>

            <allow roles="adminer">

            </allow>

            <deny users="*">

            </deny>

          </authorization>

        </system.web>

      </location>

    (注:最后经过测试,这样是可以的,这里只是为了说明web.config是分层,可覆盖的)

    最后我想到,在每个文件夹下加一个web.config重写

    <authorization/>部分

    如:

    a文件夹下web.config

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration> 

      <system.web>

          <authorization>

                <allow  roles = "admin"/>

                <deny   user  = "?"/>

        </authorization>

     </system.web>

    </configuration>

    b文件夹下的web.congfig

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration> 

      <system.web>

          <authorization>

                <allow  roles="teacher"/>

                  <deny users = "?" roles = "student,admin"/>

        </authorization>

     </system.web>

    </configuration>

    这样就对不同的文件夹实现不同的授权了

     

     

    20050520日凌晨120

    基于角色的验证终于完成了

    如下实现方法:

    1.web.config里这样设置:

    <system.web>

           <authorization>

                  <allow = “roleslist”

                  <deny users = “?”/>

           </authorization>

    </system.webconfig>

    登陆成功以后生成一个票据,票据里存储有用户的用户名和角色等信息,将票据发送到客户端,并跳转到请求的页面。

    如:

    //如果通过验证

    if (IsPass)

                  {

                       FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,studentinfo.userid,DateTime.Now,DateTime.Now.AddMinutes(30),false,studentinfo.role,"/");

                       string CodeTicket = FormsAuthentication.Encrypt(ticket);

                       HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,CodeTicket);

                       Context.Response.Cookies.Add(cookie);

                       Context.Response.Redirect(RedirectTarget);

                  }

    2.Gloabal.asa.cs里的Application_AuthenticateRequest中获取客户端的cookie中的role信息,并生成GenericPrincipal对象保存在Application.Conext.User

    如:

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)

             {

                  HttpApplication App = (HttpApplication) sender;

                  HttpContext Ctx = App.Context ; //获取本次Http请求相关的HttpContext对象

                  if (Ctx.Request.IsAuthenticated == true) //验证过的用户才进行role的处理

                  {

                       FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ;

                       FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票

                       string[] Roles = Ticket.UserData.Split (',') ; //将身份验证票中的role数据//转成字符串数组

                       Ctx.User = new GenericPrincipal (Id, Roles) ; //将原有的Identity加上角色信//息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息

                  }

             }

     

    200505202313

    完成了一个类似于microsoftIE Control中的TreeView

    微软的那个东西太难使用,而且更新麻烦!

    这是一个用户控件,主要是JavaScript,而且这个控件扩展性能差,只能建两层目录!

    我希望以后有时间时,开发一个更优等的可视化服务器组件来!

     

    200505211431

    跨站脚本攻击!

    ASP.NET编写页面时,向服务器提交数据时,如果提交了非法字符,将会出错,微软的理由是:这可能发生跨站脚本攻击!这相较于ASP来说有很大的进步!但是有时后我们确实要提交一些格式信息,这将包括非法字符,怎么办,有人很快想到HtmlEncode。这不行,应该在@page指令中加入:

     

    validateRequest=false

    除非特殊情况,一般不要加!以免真的发生跨站脚本攻击!

    200505212108

    ASP.NET将三层结构发挥到了及至!三层结构确实好,它将使你在某个时候只关注一层,而且你只要保证某一层是正确的,以后就可以放心使用该层!

    但是我认为三层结构也有它的缺点:

    不易调试!如果代码发生错误,到底是哪一层出错!因为你在编写数据层和业务层时是不能运行测试的,只有等到界面层编好后才能运行!但如果这时程序出现错误该怎么办?特别是逻辑错误,编译器不给出错误提示!

    今天我碰到了这样的问题!我的解决方法是:编一个小控制台测试程序,编写一层后用控制台测试程序测试,而控制台程序是非常容易编写的!这样就可以编一步,测一步!虽然有点耗费时间,但我觉得绝对“磨刀不误砍柴工”!不知这是不是所谓的“单元测试”?

     

    200505212227

    碰到一个奇怪的现象!

    在做新闻模块时,碰到如下问题:

    新闻模块可以插入新闻,但更新时遇到问题了,打开该页面(第一次加载时)编辑新闻,新闻可以更新然后跳到新闻列表的页面,再次更新新闻就不能成功了,我编了一个控制台程序来测试,发现数据层和业务层都正常!这是什么原因呢?暂且放一下吧!

    200505221117

    昨天的问题终于解决了(见上面)!

    我用catch(Excption e)捕捉到的异常如下:

    System.IndexOutOfRangeException:

    索引超出了数组界限。

    at Edot.yzhh.jsj.DAL.News.SetUpdateParams(SqlParameter[] paras, NewsInfo newsinfo)

    in e:\jsj\dal\news.cs:

    line 168

     at Edot.yzhh.jsj.DAL.News.Update(NewsInfo newsinfo)

    in e:\jsj\dal\news.cs:line 43

    at Edot.yzhh.jsj.BUL.News.Update(Int32 id, String title, String content, String editer)

    in e:\jsj\bul\news.cs:line 67

    其中SetUpdateParams方法的代码如下:

             private  void SetUpdateParams(SqlParameter[] paras,NewsInfo newsinfo)

             {

                  paras[0].Value = newsinfo.id;

                  paras[1].Value = newsinfo.title;

                  paras[2].Value = newsinfo.content;

                  paras[3].Value = newsinfo.editer;

             }

    为什么说索引超出了数组界限。

    而且第一次又不出错?还有,这个SqlParameter 参数paras我用哈希表缓存了!

    我的解决方法很狼狈:就是不用GetUpdateParamsSetUpdateParams设置参数,而是直接输入(如下):

    SqlParameter[] paras;

                  paras = new SqlParameter[]{

                                                     new SqlParameter("@id",SqlDbType.Int,4),

                                                     new SqlParameter("@title",SqlDbType.NVarChar,50),

                                                     new SqlParameter("@content",SqlDbType.NText,5000),

                                                     new SqlParameter("@editer",SqlDbType.Char,12)

                                                        

                                                };

                  // = GetUpdateParams();

                  //SetUpdateParams(paras,newsinfo);

                  paras[0].Value = newsinfo.id;

                  paras[1].Value = newsinfo.title;

                  paras[2].Value = newsinfo.content;

                  paras[3].Value = newsinfo.editer;

    也就是这个问题我实际上并没有弄明白!哎!遗憾!羞愧!

     

    200505221143

    相同的问题又出现在插入数据时,连续插入数据总是出错!

    这肯定是那个缓存参数的哈希表的问题!看来不要死套别人的代码啊!

    我准备重新设计了!-_-

     

    200505221424

    用静态变量是否会提升性能?

    如下:

    paras是存储过程的参数,我将其设为静态的,那么在对象的整个生命周期paras将存在于内存中,这样是不是会提升性能?)

    private static SqlParameter[] _paras;

    private SqlParameter[]paras

             {

                  get

                  {

                       if (_paras == null)

                           _paras = new SqlParameter[]{

                       new SqlParameter("@courseid",SqlDbType.Char,20),

                       new SqlParameter("@coursename",SqlDbType.Char,20),

                       new SqlParameter("@description",SqlDbType.NText,500)

                                                                   };

                       return _paras;

                  }

             }

     

    200505231421

    一行一行的编写着代码!犹豫了一下,这些代码好象都似曾相识啊!我看了一下其他模块的代码,简直就是一样。比如:哪个什么插入、更新等操作就是几个参数改了,其实实质是一样的!我重复又重复了代码,这有什么意义,一点提高都没有!看来还是系统没有作深入的分析!等我有时间时再考虑吧!

     

    200505241235

    怎样根据另一个表中的字段删除本表中的数据。

    比如:有一个TeacherInfo表和一个Secure

    TeacherInfo表中的userid字段和Secure表中的userid字段是相同的,我要根据Secure表中的status字段删除TeacherInfo表和Secure中的信息,这该怎么办?是不是要建立表之间的关系?

     

    20050526043

    关于throw;

    这个throw还真有作用,今天又有了进一步认识:

    1.throw不在catch语句内使用时,要参数:

    throw(exc);其中exc要是从System.Exception中继承而来的!

    2.程序执行到throw时将终止,有点象return

    我觉得可以将throw看作另一种return

    1. 使用return时方法将返回,throw亦是如此,只是是异常退出,方法将不返回参数。
    2. 使用return返回的参数可接收,同样对于throw抛出的异常我们也可以通过cathc(e)获取!

     

    20050526052

    网站我有重写了一些基础类!

     

    20050526200

    数据层中的Student类通过测试,单元测试!

    测试代码:

    //这个文件是我进行测试时使用的!

    using System;

    using Edot.yzhh.jsj.Model;

    using Edot.yzhh.jsj.DAL;

    public class test

    {

    //测试学生注册方法--通过

    public static void testinsert()

    {

    string userid = "yuyijqq";

    string userpwd = "yuyijq851025";

    char sex = '';

    string name = "余昭辉";

    string classid = "030413";

    string studentid = "03041317";

    string email = "yuyijq@yahoo.com.cn";

    StudentInfo studentinfo = new StudentInfo(userid,userpwd,"",sex,name,classid,studentid,email);

    Edot.yzhh.jsj.DAL.Student student = new Edot.yzhh.jsj.DAL.Student();

    student.Insert(studentinfo);

    }

     

    //测试学生登陆验证方法--通过

    public static void testSign()

    {

    string userid = "yuyijqq";

    string userpwd = "yuyijq851025";

    Edot.yzhh.jsj.DAL.Student student = new Edot.yzhh.jsj.DAL.Student();

    Edot.yzhh.jsj.Model.StudentInfo studentinfo = student.SignIn(userid,userpwd);

    if (studentinfo == null)return;

    Console.WriteLine(studentinfo.sex);

    Console.Read();

    }

    //测试学生被审核时的方法--通过

    public static void testalterstatus()

    {

    string studentid = "03041317";

    string status = "pass";

    string classpath = @"e:\jsj\webui\exercise\030413";

    string studentpath = @"e:\jsj\webui\exercise\030413\03041317";

    Edot.yzhh.jsj.DAL.Student student = new Edot.yzhh.jsj.DAL.Student();

    student.AlterStatus(studentid,status,classpath,studentpath);

    }

    //测试修改密码的方法--通过

    public static void testupdatepwd()

    {

    string userid = "yuyijqq";

    string newpwd = "yuyijq851025";

    string oldpwd = "123456789";

    Edot.yzhh.jsj.DAL.Student student = new Edot.yzhh.jsj.DAL.Student();

    student.UpdatePwd(userid,oldpwd,newpwd);

    }

    //删除学生--通过

    public static void testdelete()

    {

        string studentid = "03041317";

        string path = @"e:\jsj\webui\exercise\030413\03041317";

        Edot.yzhh.jsj.DAL.Student student = new Edot.yzhh.jsj.DAL.Student();

        student.Delete(studentid,path);

        }

    public static void Main()

    {

    //try

    //{

    //testinsert();

    //}

    //catch(Exception e)

    //{

    //Console.WriteLine(e.ToString());

    //}

     

    //testSign();

    //testalterstatus();

    //testupdatepwd();

    testdelete();

    }

     

    }

     

    20050526202

    发现一个“奇怪的现象”:

    SQL Server 2000中,我将一个字段的内容在表中直接修改,但修改后字符个数不超出范围,但SQL Server还是报错:输入的值与列的数据类型或长度不一致,或者超出网格缓冲区限制。

    不知所云?我无意中将光标移至字段值后面,然后按下Delete键,ok问题解决!原来SQL Server将后面的空格也计入啊!

     

    2005529日星期日 11:22

    asp.net1.1惊现巨大漏洞,昨天在网上看到这篇文章,我心里一惊,我得网站是否也有这个漏洞,看了以后,测试了一下,还真的存在,赶快修补

    漏洞原文:

    NT-Bugtraq的邮件列表上首先报告的Security bug in .NET Forms Authentication适用于ASP.NET 1.0 (RTM, SP1, SP2, SP3)ASP.NET 1.1 (RTM, SP1).

    Form Authentication被使用时,匿名用户在试图访问被保护的页面如http://localhost/WebApplication2/secret.aspx时会被redirect到登录

    网页如

    http://localhost/WebApplication2/login.aspx?ReturnUrl=%2fWebApplication2%2fsecret.aspx

    但是如果使用Mozilla,匿名用户可以这样未经认证就访问被保护的页面:http://localhost/WebApplication2\secret.aspx;对IE,可以使用%5C达到类似的效果:http://localhost/WebApplication2%5Csecret.aspx

    微软在105日发布了What You Should Know About a Reported Vulnerability in Microsoft ASP.NET网页以提供针对此安全漏洞的对策。当前的对策主要是如KB887459所描述的那样在Global.asax或其Code-Behind中在Application_BeginRequest中增加检查

    if (Request.Path.IndexOf('\\') >= 0 ||        System.IO.Path.GetFullPath(Request.PhysicalPath) != Request.PhysicalPath)     {        throw new HttpException(404, "not found");    }

    显然每个Application都需要有这样的检查以应对此安全漏洞。微软还会提供其他的对策,请关注What You Should Know About a Reported Vulnerability in Microsoft ASP.NET网页更新。

    ASP.NET 2.0 Beta1,并没有此漏洞而是得到404错误。

    看来新技术并不是都完美!

     

    2005529日星期日 22:19

    UserControl中的Session不能在Page中访问?

    我在一个用户控件设置了会话变量Session[teacherinfo],在一个页面访问他是却为空!难道UserControl中的Session不能在Page中访问?

    也许是我设置的有问题,我再测试一下!

    这个问题我一测试了,可以共享啊,为什么?为什么?为什么?为什么?测试有误还是不可以!可以共享,是程序的逻辑错误,看来要小心啊!

  • 相关阅读:
    python:返回函数,闭包
    对象的行为和数组
    类、对象和包
    Java语言中的程序流程控制
    初识Java,Java语言概述
    有限广播地址与直接广播地址
    H3C模拟器HCL注意事项
    HDLC协议
    NETBIOS的作用
    HP DL380G7 RAID配置
  • 原文地址:https://www.cnblogs.com/yuyijq/p/206045.html
Copyright © 2020-2023  润新知