欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET笔记之 图库权限设置的方法

程序员文章站 2024-03-01 22:08:28
1、通过一个实例来介绍图库权限,其中涉及到数据库的应用,在visual studio 2010 连接到数据库  中创建数据集及数据表可能会出现无法远程连接的错误,...

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

可以参考 sql server 2008 r2:error 26 开启远程连接详解

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

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

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

    建数据表如下:

           ASP.NET笔记之 图库权限设置的方法

   数据库语句如下:

  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 />
    
    <br />
    
    <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不默认支持,需要一番设置,具体的流程:sql server 2008 r2:error 26 开启远程连接详解
详细出处参考:sql server 2008 r2:error 26 开启远程连接详解
(2、获取context.request等需要解析irequiressessionstate接口