Session的使用(登录例案+其它页面访问)

本程序功能是使用Session将用户输入的用户名保存在Session中(登录成功情况下,登录失败不会有Session值),其它页面想访问时会先判断是否有之前存的Session值。

登录Login.htm页面:

<head>
    <title></title>
    <script type="text/javascript">
        //刷新验证码
        function refreshYZM() {
            var imgYZM = document.getElementById("imgYZM");
            imgYZM.src = "YanZhengMa.ashx?t="+new Date();
        }
    </script>
</head>
<body>
    <form action="Login.ashx" method="post">
        <table>
            <tr><td>用户名</td><td><input type="text" name="username" /></td></tr>
            <tr><td>密码</td><td><input type="password" name="password" /></td></tr>
            <tr>
                <td>
                    <img src="YanZhengMa.ashx" id="imgYZM" onclick="refreshYZM()" />
                    </td><td><input type="text" name="yzm" />
                </td>
            </tr>
            <tr><td><input type="submit" name="btnLogin" value="登录" /></td><td>@msg</td></tr>
        </table>
    </form>
</body>
</html>

生成验证码YanZhengMa.ashx:

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "image/jpeg";
    Random rand = new Random();
    int num = rand.Next(1000, 10000);//生成4位随机数
    string code = num.ToString();
    context.Session[Login.YZM] = code;
    using (Bitmap bmp = new Bitmap(45, 25))
    {
        using (Graphics g = Graphics.FromImage(bmp))
        using (Font font = new Font(FontFamily.GenericSerif, 15))
        {
            g.DrawString(code, font, Brushes.Red, new PointF(0, 0));
        }
        bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    }
}

登录Login.ashx页在(必须实现IRequiresSessionState接口,在using System.Data.SqlClient;命名空间下):

public const string YZM = "YZM";//存储验证码
public const string LOGINUSERNAME = "LoginUserName";//将登录用户名存到Session,供多个页面访问
public const string LOGINURL = "LoginUrl";//尝试登录的时候的页面地址

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/html";
    string btnLogin = context.Request["btnLogin"];//获取点击按钮
    string html = CommonHelper.ReadHtml("~/Login.htm");//获取Login.htm页面内容
    if (string.IsNullOrEmpty(btnLogin))//判断按钮是否点击
    {
        html = html.Replace("@msg", "");
        context.Response.Write(html);
    }
    else
    {
        string yzm = context.Request["yzm"];//获取用户输入的验证码
        string yzmInServer = (string)context.Session[YZM];//获取服务器的验证码
        if (yzm != yzmInServer)//判断用户输入与服务器的验证码
        {
            html = html.Replace("@msg","<font color=red>验证验错误</font>");
            context.Response.Write(html);
            return;
        }
        string username = context.Request["username"];
        string password = context.Request["password"];
        int r = (int)SQLHelper.ExecuteScalar("select count(*) from Users where [email protected] and [email protected]",
            new SqlParameter { ParameterName = "@name", Value = username },
            new SqlParameter { ParameterName = "@password", Value = password });
        if (r <= 0)
        {
            html = html.Replace("@msg", "<font color=red>用户名或密码错误</font>");
            context.Response.Write(html);
            return;
        }
        else
        {
            //如果登录成功
            context.Session[LOGINUSERNAME] = username;//把当前登录的用户名写到Session中
            //获取上一次访问网址的Session值,在QueryYuE.ashx和ChangePassword.ashx中已作判断,
            //当没登录时,就设置Session值"LOGINURL"为要访问的页面
            string navUrl = (string)context.Session[LOGINURL];
            if (navUrl != null)
            {
                context.Response.Redirect(navUrl);//重定向回到上一次访问的页面,动态获取
            }
            else
            {
                context.Response.Write("看,美丽的图片。。。。。");
            }
        }

    }
}

修改密码ChangePassword.ashx(须实现IRequiresSessionState):

public void ProcessRequest(HttpContext context)
{
    string username = (string)context.Session[Login.LOGINUSERNAME];//获取登录时存入的Session值
    if (username == null)//如果没登录强制性的访问此页面,则重定向到登陆页面
    {
        context.Session[Login.LOGINURL] = context.Request.Url.ToString();//把当前地址存到Session中
        context.Response.Redirect("Login.ashx");
    }
    else
    {
        context.Response.Write("修改密码。。。,当前登录用户<a href=‘Loginout.ashx‘>退出登录</a>" + username);
    }
}

余额查询QueryYuE.ashx(须实现IRequiresSessionState):

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/html";
    string username = (string)context.Session[Login.LOGINUSERNAME];
    if (username == null)//如果没登录强制性的访问此页面,则重定向到登陆页面
    {
        context.Session[Login.LOGINURL] = context.Request.Url.ToString();//把当前地址存到Session中
        context.Response.Redirect("Login.ashx");
    }
    else
    {
        context.Response.Write("查询余额。。。,当前登录用户。<a href=‘Loginout.ashx‘>退出登录</a>" + username);
    }
}

退出登录Loginout.ashx(须实现IRequiresSessionState):

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/html";
    context.Session.Abandon();//销毁Session
    context.Response.Redirect("Login.ashx");
}

帮助类CommonHelper.cs:

public class CommonHelper
{
    public static string ReadHtml(string path)
    {
        string fillPath = HttpContext.Current.Server.MapPath(path);
        string html = File.ReadAllText(fillPath);
        return html;
    }
}
时间: 2024-11-03 22:21:25

Session的使用(登录例案+其它页面访问)的相关文章

以过滤器(filter)为例,实现不同登录情况下的页面跳转

以过滤器(filter)为例,实现不同登录情况下的页面跳转 登录登录账户正确,进入主页. 登录账户错误,跳转到错误页面. 用户注销之后,用登录成功的网址再次登录,提示没有登录权限. 用户登录之后向Session中放入用户的数据 进入主页的时候要判断用户是否已经登陆:要求:在过滤器中实现 补充:还用到了一个提出常量的方法. 原文地址:https://www.cnblogs.com/WZ-BeiHang/p/12616949.html

解决session过期后登录页面嵌套在框架中的问题

只要在登录页面中加入一下脚本即可: <script language="text/javascript"> //在嵌套时,就刷新上级窗口 if(window.parent!=window){ window.parent.location.reload(true); } </script> 解决session过期后登录页面嵌套在框架中的问题,布布扣,bubuko.com

session过期返回登录页面跳出frame

session 过期返回登录页面 方法1, HttpSession session = request.getSession(); String LOGIN_ID = (String) session.getAttribute("LOGIN_ID"); if (null == LOGIN_ID||"".equals(LOGIN_ID)) { java.io.PrintWriter out = response.getWriter(); out.println(&qu

session过期,登录页面嵌套问题解决

项目主页是框架模式时,如果登录后长时间没有活动(操作),存储在session中的登录信息过期了,这时再去进行操作时,就会出现登录页面嵌套的问题,怎么解决呢? 这里介绍一种方法,只需要加上一段javascript代码即可: 在登录页面/WebRoot/login.jsp加上以下javascript代码: <script language="javascript"> if (top != window) top.location.href = window.location.h

JavaWeb--Servlet过滤器Filter和SpringMVC的HandlerInterceptor(Session和Cookie登录认证)

拦截一些请求进行处理,比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,编码,或者限制时间点访问等等,是非常有必要的.所以就有了此篇文章啦. 文章结构:(1)Servlet过滤器Filter:(2)SpringMVC的HandlerInterceptor:(3)对比认知. 一.Servlet过滤器Filter: 此部分是从赵四大佬那里学来的,并补充自己的认知 (1)概念: 能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不产生请求和响应对象,它只能

用户登录后重定向到要访问页面

代码下载:login_limit 1.需求场景 1)分享到其它平台链接用户点击跳转相应平台登录页面,登录后重定向到分享页面 2)用户停留在某页面长时间未操作至session过期,刷新或点击其他链接重定向到登录页面,登录后要求重定向到要访问页面 2.需求分析 考虑到登录后要重定向到某个页面,所以在跳转登录页面的时候需要系统存储当前链接,以便在登录后重定向.思路已经非常清晰,由于我们使用拦截器进行用户是否登录判断,因此只需在拦截器的方法里对当前链接进行保存,然后登录重定向即可.具体代码如下: 由于之

Laravel 登录后跳转回登录前浏览的页面

一.经过 Auth 中间件检查后跳转至登录页面 也就是没有通过 auth 中间件的认证检查,被 auth 中间件拦截后跳转至登录页面.这种情况下,Laravel 默认会在用户登录成功后自动跳转回登录前浏览的页面.auth 中间件是怎么做到的? 打开 auth 中间件文件: // vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php protected function authenticate(array

实现从页面登录后返回该页面

1. js 代码 /*获取源页面的url*/ var path = window.location.pathname.substr(7); /*将源页面的url作为参数传递到控制层*/ window.location.href="url?origin="+path; 2. java 代码 @RequestMapping(value = "/url") public String doLogin(String origin,HttpSession session){

Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段   本实例采用vs2010编写,vb和c#的代码都是经过测试的:一些童鞋说代码有问题的 注意下    什么? 你还在用vs2008 vs2005? 请自行重载 带有 optional 标致的函数   童鞋们提到的 密码修改后 要失效的问题 当时没有想到 个人认为 大致方向可以> >1. 每个用户生成1个xml 里面保存随机的几