• ASP.NET 学习笔记_07 图库权限设置


    1、通过一个实例来介绍图库权限,其中涉及到数据库的应用,在visual studio 2010 连接到数据库  中创建数据集及数据表可能会出现无法远程连接的错误,具体ide解决方案

    可以参考 http://www.cnblogs.com/daomul/archive/2013/04/01/2993646.html

    2、这个实例,是通过输入用户名和密码判断该用户是普通用户还是收费用户,然后进入下载图片列表,非用户点击下载是转到跳转页面提示,普通用户下载图片是带水印的

        试用图片,而收费用户下载图片是原始版图片。在登陆的时候,同时设置错误登陆次数限制以及尝试登陆时间间隔要求。

        这个过程需要建立数据表以及数据集:建一个DAl文件夹存放,数据集存放在APP_Date文件夹下,以确保数据的安全性

        建数据表如下:

               

       数据库语句如下:

      SELECT ID, sUserName, sPassword, iLevel, sErrorTime, sLastErrorTime  FROM T_userInfo

      SELECT ID, iLevel, sErrorTime, sLastErrorTime, sPassword, sUserName FROM T_userInfo WHERE (ID = @ID)

      SELECT ID, iLevel, sErrorTime, sLastErrorTime, sPassword, sUserName FROM T_userInfo WHERE (sUserName = @sUserName)

       UPDATE T_userInfo Set sErrorTime=IsNULL(sErrorTime,0)+1,sLastErrorTime=getdate() where ID=@ID

       UPDATE T_userInfo  Set  sErrorTime=0 where ID=@ID


    登陆页面:login.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="login.aspx.cs" Inherits="图片下载.login" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
        </div>
        <asp:Label ID="Label1" runat="server" Text="用户名:"></asp:Label>
        <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
        <asp:Label ID="lablwarn" runat="server" BackColor="#FF3300" 
            BorderColor="#FF3300" Visible="False"></asp:Label>
        <br />
        <asp:Label ID="Label2" runat="server" Text="密码  :   "></asp:Label>
        <asp:TextBox ID="txtPassword" runat="server" TextMode="Password" ></asp:TextBox>
        <br />
    &nbsp;&nbsp;&nbsp;&nbsp;
        <br />
    &nbsp;&nbsp;&nbsp;&nbsp;
        <asp:Button ID="btnLogin" runat="server" onclick="btnLogin_Click" Text="登陆" />
        </form>
    </body>
    </html>

    登陆页面:login.aspx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using 图片下载.DAL.DataSetPicTableAdapters;
    
    namespace 图片下载
    {
        public partial class login : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void btnLogin_Click(object sender, EventArgs e)
            {
                T_userInfoTableAdapter adapter = new T_userInfoTableAdapter();
                var data = adapter.GetDataByUserName(txtUserName.Text);
                if (data.Count <= 0)
                {
                    lablwarn.Text = "用户名不存在";
                    lablwarn.Visible = true;
                }
                else {
                    //LinQ的single的方法,返回为一条数据
                    //数据为0 或者或者多条,则抛出异常,把错误扼杀在摇篮中
                    var user = data.Single();
    
                    //判断错误时间和错误次数是否为空
                    //计算当前时间和和上次错误分钟差
                    if (!user.IssErrorTimeNull() && !user.IssLastErrorTimeNull()) {
                        double time = (DateTime.Now - user.sLastErrorTime).TotalMinutes;
                        if (time <= 30 && user.sErrorTime > 5)
                        {
    
                            lablwarn.Text = "输入密码错误次数过多,请等待30分钟再重新输入";
                            lablwarn.Visible = true;
                            return;
                        }
                    }
    
                    if (user.sPassword == txtPassword.Text)
                    {
                        Session["是否登陆"] = true;
                        Session["登陆的ID"] = user.ID;
    
                        lablwarn.Text = "登陆成功,欢迎回来";
                        lablwarn.Visible = true;
                        //清空错误次数
                        adapter.ResertTimeById(user.ID);
                        Context.Response.Redirect("Pic_list.htm");
                        //然后Redirect到其他页面
                    }
                    else {
                        adapter.IncErrorTimeById(user.ID);
                        lablwarn.Text = "密码错误,请重新输入";
                        lablwarn.Visible = true;
                    }
                }
            }
    
        }
    }
    /*出现错误:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。
     * 未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 
     * (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错) 
     * 
     * 解决:
    */

    下载列表页面:Pic_list.htm

    <a href="Pic_download.ashx?fileName=11.jpg">图片1</a>
    <a href="Pic_download.ashx?fileName=11.jpg">图片2</a>
    <a href="Pic_download.ashx?fileName=11.jpg">图片3</a>

    下载列表页面:Pic_download.ashx

    using System.Linq;
    using System.Web;
    using 图片下载.DAL.DataSetPicTableAdapters;
    using System.Web.SessionState;
    using System.Drawing;
    
    namespace 图片下载
    {
        /// <summary>
        /// Pic_download 的摘要说明
        /// </summary>
        public class Pic_download : IHttpHandler,IRequiresSessionState
        {
    
            public void ProcessRequest(HttpContext context)
            {
                if (context.Session["是否登陆"] == null)
                {
                    context.Response.Redirect("Target.htm");
                }
                else {
                    string fileName = context.Request["fileName"];
    
                    //报头
                    context.Response.ContentType="image/JPEG";
                    string newFileName = HttpUtility.UrlEncode(fileName);
                    context.Response.AddHeader("Content-Disposition", "attachment:filename=" + newFileName);
    
                    //根据ID获取数据
                    int user_id = (int)context.Session["登陆的ID"];
                    T_userInfoTableAdapter adapter = new T_userInfoTableAdapter();
                    var data = adapter.GetDataById(user_id);
                    var user = data.Single();
    
                    if (user.iLevel == 0) //普通用户
                    {
                        using (System.Drawing.Bitmap bitImage = new System.Drawing.Bitmap("image/" + fileName))
                        {
                            //设置画布
                            using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitImage))
                            {
                                g.DrawString("免费用户试用——"+user.sUserName, new System.Drawing.Font("宋体", 20),Brushes.Red, 0, 0);
                               }
                            //保存到输出流中
                            bitImage.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
    
                        }
                    }
                    else//收费用户 
                    {
                        context.Response.WriteFile("image/"+fileName);
                    }
                }
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }

    跳转页面:Target.htm

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>跳转中</title>
    </head>
    <body>
        请先登录,页面将在5秒以后转向登陆页面,如果
        您想立即进入登录界面,请<a href="login.aspx">点击这里</a>
        <br/> 还剩<div id="leftDiv"></div></body>
    </html>
    <script type="text/javascript">
        var leftSecond = 5;
        setInterval(function () {
            if (leftSecond <= 0) {
                window.location.href = "login.aspx";
            }
            document.getElementById("leftDiv").innerHTML = leftSecond;
            leftSecond--;
        }, 1000)
    </script>

    总结:

     (1、最大的问题就是遇到数据库远程连接的问题,不过通过了解才知道SQL server 2008不默认支持,需要一番设置,具体的流程:http://www.cnblogs.com/daomul/archive/2013/04/01/2993646.html

    (2、获取context.Request等需要解析IRequiresSessionState接口

  • 相关阅读:
    ****** 2019-2020-1 《数据结构与面向对象程序设计》第1周学习总结
    预备作业
    《数据结构与面向对象程序设计》第01周学习总结
    我太难了——00周作业
    作业二
    预备作业 作业一
    FIR滤波器设计
    第五章:相关分析
    通常来说分频电路用计数器来实现,奇数倍的话记得用上或门!
    HDLBits 刷题记录(5)
  • 原文地址:https://www.cnblogs.com/daomul/p/2994636.html
Copyright © 2020-2023  润新知