精华内容
下载资源
问答
  • session做多用户登录页面
    2021-05-08 07:53:10

    JSP中怎样用session保存并验证用户登录信息

    用JSP做一个用户登陆页面,成功后显示登陆信息,错误则返回登陆页面,现实现session中是键值对的方法代码。

    实现内置对象的方法代码。

    实现获取session的方法代码。

    实现session对象的方法代码。

    实现在page中import="java.util.*,cn.zt.entity.Teache的方法代码。

    实现session中是对象数组js的方

    jsp中如何通过session判断用户是否登录?

    jsp中如何通过session判断用户是否登录???哪位可以给一个小小的项目?以具体思路说下,我学的是ASP.NET。 首先在你登陆的时候,如果登陆成功的话,就应该把相对应的用户名存入SESSION中 比如Session["username"]="Peter" 假设你关闭了这个页面,然后再打开的时候就判断SESSION是否为空,比如刚才的那个 Session["user

    thinkphp3.2 验证用户是否已经登陆问题

    首先声明 我是一个初用thinkphp的菜鸟,大神们尽量回答的简单易懂一些啦创建一个CommonController控制器 代码如下 namespace Home\Controller;use Think\Controller;class CommonController extends Controller {function __construct(){parent::__construct();//这里不写会报错。//因为这个构造方法覆盖掉了父类的构

    判断用户是否登录,除了用session,还有没有别的办法啊?

    在asp.net中用户登录是一个普遍的现象.基本上在大大小的系统中都会用到.而我现在常用的是用Session来判断的.但是总是觉得这种方法不是很好的方法. 后来感觉用Cookie方便一些,毕竟在asp.net中也提供了一些类,方便我们使用.有一种感觉是cookie不是

    如何用JSP实现在登录的时候判断该用户是否已经登录

    登录时判断session是否为空,为空的话则设置一个session,并进行登录操作: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Login loginBean = null; HttpSession session = request.getSession(true); try { loginBean = (Login) session.getAttribute("log

    每个页面都要判断Session是否登入用户名吗?

    如果做个会员系统,分为多个页面,是怎样判断Session是否存在的?

    不需要,你做一个BasePage,继承自System.Web.UI.Page,然后你所有的页面继承自这个页面即可。 public class BasePage : System.Web.UI.Page { protected override void OnInit(EventArgs e) { //判断Session的代码 if (Session["User"] == null

    关于session验证用户登陆的问题

    php里如何加session进行登录验证

    我要做一个后台登录,怎样设置session让其它后台管理页面也调用。

    PHP中是怎样实现验证用户是否已登录的?是session吗?

    恩,是session。大概思路就是:你可以在你需要限制权限的网页开头加上验证是否有session的代码。如果有session则允许查看。如果不存在session则弹出。当用户进行登录时当输入用户名和密码时,如果和数据库中的用户名密码一样的话则表示合法用户

    php如何验证过滤用户是否登录

    更多相关内容
  • 主要给大家介绍在php中是如何使用session实现保存用户登录信息的,涉及到php session 用户登录等一些知识点,使用session保存用户登录信息要比cookie安全很。感兴趣的朋友一起学习吧
  • 主要介绍了PHP cookie,session的使用与用户自动登录功能实现方法,结合实例形式分析了php使用cookie与session进行数据存取以及实现自动登陆功能的相关操作技巧,需要的朋友可以参考下
  • 实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得。对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存...
  • session实现用户登录

    千次阅读 2021-06-09 11:02:47
    如何通过session实现用户登录后,在页面将数据保存在session中,不要保存着request中;两种方式清除session:服务器清除 和程序员写程序清除 服务器清除 setMaxInactiveInterval() 写在 session.setAttribute()...

    如何通过session实现用户登录后,在多个页面

    将数据保存在session中,不要保存着request中;

    两种方式清除session:服务器清除 和程序员写程序清除 服务器清除 setMaxInactiveInterval() 写在 session.setAttribute()之后 配置放在web.xml

    01f2896446f5553752c4236c46e01f13.png

    java怎么用session实现保持登录状态和一个账户不能其实麻烦一点可以在数据库中添加一个在线与否的状态字段, 登录就把次字段状态设置成多少,退出之后再改回以前的 这样就能判断了 有点麻烦

    JSP中怎样用session保存并验证用户登录信息

    用JSP做一个用户登陆页面,成功后显示登陆信息,错误则返回登陆页面,现实现session中是键值对的方法代码。

    实现内置对象的方法代码。

    实现获取session的方法代码。

    实现session对象的方法代码。

    实现在page中import="java.util.*,cn.zt.entity.Teache的方法代码。

    实现session中是对象数组js的方

    java 多用户登陆 session总是可以得到的是上一个用登陆成功之后,保存用户session 返回给用户, 然后再打开浏览器,重新登原因是你第二个登录用户覆盖了第一个用户的信息。 所以解决的办法是:你可以把放session的key值做成动态的,如: 用户A:userId + 帐号 用户B:userId + 帐号 取值的时候根据这个来取。

    Java用户登入问题,如果用户登入成功,我将用户对如果用户登入成功,我将用户对象存放到Session里代码如下: //将成功登ActionContext.getContext().getSession().put("user", users); 应该是这样的,一台电脑上,只能一个用户登录,第二个登录则自动覆盖第一个。

    JAVA WEB 中登录的session的判断 如何控制用户权限做的是论坛项目 多用户登录的 如何用session控制那些用户可以访问和不可控制访问权限不是通过session的 是数据库中的字段 数据库中要定义几个 权限 比如: 游客、普通用户、会员、管理员、版主、超级版主 等 上面是举例 然后大的方面可以控制为 登录用户 和 游客 即没有登录的全是游客。

    在一个java类如何通过session获取已经登录的用户名

    登录返回给前台session HttpSession session = request.getSession();session.setAttribute("name", name);System.out.println(name+"登录成功");response.sendRedirect(path+"/test.jsp");后台接受session。 HttpSession session=request.getSe

    java模拟用户登录的时候,怎么把用户信息添加到ses各位好心的大哥大姐: 有礼了。 我想做一个程序在有用户名、密码的情况不可行.session是保留在服务器端的,也就是保留在网站上的,就算你设置了session也无法把它保存到服务器上,触发服务器有保存session的接口给你调用.

    怎样用session来实现多用户登录 ,并登录到不同的写一个检查SESSION的函数,包含到每个页面,如果发现非法访问,就引导回属于用户的页面去.

    展开全文
  • 以下面为例,假如admin.php是我们的后台操作页面,如果没有启用 session,那么,即便是没有登录用户照样能访问到该页面,这时候,就需要用到 session 来防止用户非法登录到这个页面了。下面是三个文件的代码 登录...
  • 正对java Web项目,同浏览器同时打开两个登录窗口(不同Tag),用不同用户登录,为避免使用同一个Session,需要使用这段代码。否则先登录用户Session会变成后登录用户Session.相关系统使用权限也会变。
  • 多用户不在一台电脑上登录,不清楚用户登录的时间 ,应该是差不多时间,用户登录过一段时间刷新页面,用户名会变成其他的用户名~~~~~~~~~~~ ![图片说明]...
  • 本文主要介绍在 Express 框架中,如何使用 Session 来实现用户登录身份验证。对express session实现登录验证相关知识,感兴趣的朋友一起看看吧
  • Java 多用户登录限制的实现方法

    千次阅读 2021-02-28 09:12:26
    最近比较空闲没有项目,于是乎捋了捋平时工作会遇到的一些常见问题,首先想到了多用户登录限制问题,下面就对此问题一点思考讲解。相关阅读:Java Web开发防止多用户重复登录的完美解决方案1、设计场景1)同一...

    最近比较空闲没有项目做,于是乎捋了捋平时工作会遇到的一些常见问题,首先想到了多用户登录限制问题,下面就对此问题做一点思考讲解。

    相关阅读:

    Java Web开发防止多用户重复登录的完美解决方案

    1、设计场景

    1)同一时刻不允许某个用户多地登录

    2)用户已在A处登录,现在从B处登录是允许的,但会把A处挤掉(考虑到用户在A处登录后因某些情况跑到了B处,但还想继续之前的工作,所以需要登录系统)

    3)B处挤掉A后,A再做其它操作的时候系统会给出提示,该用户在别处登录,如不是本人操作可能密码泄漏,请修改密码。

    2、思路导图

    每个用户登录的时候,通常我们会将用户信息存入session,以便用户进行操作的时候系统方便得到用户的基本信息。但这个session具有私有性,只对当前用户可见(如果同意用户在不同浏览器登录会得到不同的session,这也是为什么可以多用户登录的根源所在)。那么接着问题就来了,某个用户登录的时候如何能知道自己是否在线,相信聪明的你已经想到,这还不好半,把在线的用户信息存储在一个公共的地方问题不就迎刃而解了么,网上一查,解决方案无出其右,大致为以下两种

    1)数据库中标识在线用户

    2)存储到application中

    经过重重考虑,我们会发现方案一需要解决许多棘手的问题(用户异常退出未来得及修改状态,频繁访问数据库影响性能等),这对于一个要求完美的你来说显然是不合时宜的,于是我们采用了方案二,将在线用户信息保存到application中,具体设计如下。

    1)登录流程图

    faad1572901be60a8407c16eecf57fae.png

    2)被挤掉后操作流程图

    e4f47031ca47eddacf041dbec6177cb3.png

    3、代码

    1)登录方法

    @RequestMapping(value = "/login", method = RequestMethod.POST)

    public String login(String userName, String password, RedirectAttributes redirectAttributes, HttpServletRequest request) {

    //判断用户是否已经在线及处理(已在线则剔除)

    String loginLimite = limiteLogin.loginLimite(request, userName);

    //判断用户名、密码是否正确

    String result = userService.login(userName, password);

    if (result.equals("success")) {

    request.getSession().setAttribute("now_user", userService.findByUserName(userName));

    //创建token及验证

    String jwtToken = tokenService.createUserAuthToken(userService.findByUserName(userName));//生成token

    System.out.println(jwtToken);

    UserAuthenticationToken authToken = tokenService.retrieveUserAuthToken(jwtToken);//token解析

    System.out.println(authToken.isAuthenticated());

    System.out.println("id = " + UserAuthenticationToken.getCurrentToken().getUserUuid());

    //用户掉线,登录后重定向到保存的链接

    Object url = request.getSession().getAttribute("redirect_link");

    if (url != null) {

    request.getSession().removeAttribute("redirect_link");

    return "redirect:" + url.toString();

    }

    return "index";

    }

    redirectAttributes.addFlashAttribute("message", result);

    return "redirect:/other/toLogin";

    }

    2)登录判断是否已经在线

    @Service

    @Transactional

    public class LimiteLogin {

    private static Logger log = Logger.getLogger(SessionListener.class);

    private static Map loginUserMap = new HashMap<>();//存储在线用户

    private static Map loginOutTime = new HashMap<>();//存储剔除用户时间

    @Autowired

    private UserService userService;

    public String loginLimite(HttpServletRequest request, String userName) {

    User user = userService.findByUserName(userName);

    String sessionId = request.getSession().getId();

    for (String key : loginUserMap.keySet()) {

    //用户已在另一处登录

    if (key.equals(user.getUserName()) && !loginUserMap.containsValue(sessionId)) {

    log.info("用户:" + user.getUserName() + ",于" + DateUtil.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss") + "被剔除!");

    loginOutTime.put(user.getUserName(), DateUtil.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss"));

    loginUserMap.remove(user.getUserName());

    break;

    }

    }

    loginUserMap.put(user.getUserName(), sessionId);

    request.getSession().getServletContext().setAttribute("loginUserMap", loginUserMap);

    request.getSession().getServletContext().setAttribute("loginOutTime", loginOutTime);

    return "success";

    }

    }

    3)登录拦截器(未登录跳转登录页)

    public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Override

    public boolean preHandle(HttpServletRequest request,

    HttpServletResponse response, Object handler) throws Exception {

    HttpSession session = request.getSession();

    User user = (User) session.getAttribute("now_user");

    if (session.getAttribute("now_user") == null) {

    response.sendRedirect(request.getContextPath() + "/other/toLogin");

    return false;

    }

    //多用户登录限制判断,并给出提示信息

    boolean isLogin = false;

    if (user != null) {

    Map loginUserMap = (Map) session.getServletContext().getAttribute("loginUserMap");

    String sessionId = session.getId();

    for (String key : loginUserMap.keySet()) {

    //用户已在另一处登录

    if (key.equals(user.getUserName()) && !loginUserMap.containsValue(sessionId)) {

    isLogin = true;

    break;

    }

    }

    }

    if (isLogin) {

    Map loginOutTime = (Map) session.getServletContext().getAttribute("loginOutTime");

    session.setAttribute("mess", "用户:" + user.getUserName() + ",于 " + loginOutTime.get(user.getUserName()) + " 已在别处登录!");

    loginOutTime.remove(user.getUserName());

    session.getServletContext().setAttribute("loginUserMap", loginOutTime);

    response.sendRedirect(request.getContextPath() + "/other/toLogin");

    return false;

    }

    return super.preHandle(request, response, handler);

    }

    @Override

    public void postHandle(HttpServletRequest request,

    HttpServletResponse response, Object handler,

    ModelAndView modelAndView) throws Exception {

    super.postHandle(request, response, handler, modelAndView);

    }

    @Override

    public void afterCompletion(HttpServletRequest request,

    HttpServletResponse response, Object handler, Exception ex)

    throws Exception {

    super.afterCompletion(request, response, handler, ex);

    }

    }

    4)在session销毁的时候,把loginUserMap中保存的键值对清除

    public classSessionListener implements HttpSessionListener {

    private static Logger log = Logger.getLogger(SessionListener.class);

    @Override

    public void sessionCreated(HttpSessionEvent event) {

    }

    @Override

    public void sessionDestroyed(HttpSessionEvent event) {

    HttpSession session = event.getSession();

    String sessionId = session.getId();

    //在session销毁的时候,把loginUserMap中保存的键值对清除

    User user = (User) session.getAttribute("now_user");

    if (user != null) {

    Map loginUserMap = (Map) event.getSession().getServletContext().getAttribute("loginUserMap");

    if(loginUserMap.get(user.getUserName()).equals(sessionId)){

    log.info("clean user from application : " + user.getUserName());

    loginUserMap.remove(user.getUserName());

    event.getSession().getServletContext().setAttribute("loginUserMap", loginUserMap);

    }

    }

    }

    }

    5)web.xml

    com.service.limitelogin.SessionListener

    6)页面代码(用于给出提示的同时,清除被挤掉用户的session信息,否则提示信息会一直显示)

    $(document).ready(function () {

    var message='${mess}';

    if (message != "") {

    $.ajax({

    type: 'GET',

    async: false,

    cache: false,

    url: '/other/clearUserSession',

    dataType: '',

    data: {},

    success: function (data) {

    }

    });

    $('#mess').html(message);

    }

    });

    7)清除挤掉用户session代码

    /**

    * 多用户登录限制,清除session信息(登录信息、提示信息)

    *

    * @param request

    * @return

    */

    @ResponseBody

    @RequestMapping(value = "/clearUserSession")

    public String clearUserSession(HttpServletRequest request) {

    HttpSession httpSession = request.getSession();

    //httpSession.invalidate();

    httpSession.removeAttribute("now_user");

    httpSession.removeAttribute("mess");

    return "success";

    }

    到此开发工作完成

    4、运行结果

    1ebe6c052059f1962e389915fa6bd717.png

    以上所述是小编给大家介绍的Java 多用户登录限制的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

    展开全文
  • 登录界面的验证登录以及session的使用 一、实验要求 (1) 新建 login.jsp 页面,其中,包含登录所需用户名与密码字段、 以及提交(input)和重新填写按钮(reset);表单method="POST"、action="check.jsp"; (2) 新建 ...

    登录界面的验证登录以及session的使用

    一、实验要求

    (1) 新建 login.jsp 页面,其中,包含登录所需用户名与密码字段、
    以及提交(input)和重新填写按钮(reset);表单method="POST"、action="check.jsp"(2) 新建 check.jsp 页面,要求验证 login.jsp 中所提交的用户名与密码是否正确,
    默认(username=张三, 密码=123456);
    
    如果正确,则在 session 中存储用户信息 username=张三,并跳转到 admin.jsp 页面;
    其中,admin.jsp 中必须先检查用户登录状态 session.getAttribute("username"),
    若为空,则跳转到 login.jsp(不允许未登录用户直接访问此页面),
    否则,显示管理员操作界面(内容自行设置);
    

    (3)绘制整个处理的流程图;
    在这里插入图片描述
    (4)问:服务器端的每个 session 和用户浏览器是一 一对应关系吗?
    不是
    在这里插入图片描述
    (5)在 check.jsp 中,设置 session 的生存期为 60 秒;停止操作 60 多秒后,再访问 admin.jsp,看是否还能看到管理员
    无法看到管理员。
    二、代码实现
    1.login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
       <%Object uName = session.getAttribute("uName");
       //判断用户是否登录
       if(uName == null){
       session.setAttribute("errMsg","你还没登录,请登录...");
       //重定向到登录页面
       response.sendRedirect("login.jsp");
       }%>
       <h3>欢迎<%=uName%>,来到管理员界面</h3>
    </body>
    </html>
    

    2.check.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@ page import="java.io.*,java.util.*" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
      <%//确保获取的中文不会乱码
      request.setCharacterEncoding("UTF-8");
      //获取客户端提交的用户名
      String uName = request.getParameter("uName");
      //获取客户端提交的口令
      String uPassword = request.getParameter("uPassword");
      if("张三".equals(uName) && "123456".equals(uPassword)){
      //将用户名保存到会话中,后面页面通过检查此对象的存在与否判断用户是否登录,并将用户名显示到页面
      session.setAttribute("uName",uName);
      //重定向到被保护页面
      response.sendRedirect("admin.jsp");
      }else{
      //设置错误信息,用于登录页面提示
      session.setAttribute("errMsg","用户名或口令不正确...");
      //重定向到登录页面
      response.sendRedirect("login.jsp");
      }%>
    </body>
    </html>
    

    3.admin.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
       <%Object uName = session.getAttribute("uName");
       //判断用户是否登录
       if(uName == null){
       session.setAttribute("errMsg","你还没登录,请登录...");
       //重定向到登录页面
       response.sendRedirect("login.jsp");
       }%>
       <h3>欢迎<%=uName%>,来到管理员界面</h3>
    </body>
    </html>
    

    三、实现效果
    1.登录界面
    在这里插入图片描述
    2.登录失败界面
    在这里插入图片描述
    3.登录成功的界面
    在这里插入图片描述
    分享一张浏览器和session的内幕图示
    在这里插入图片描述
    好了,今天的分享就到这里了。点个赞吧
    在这里插入图片描述

    展开全文
  • Session,判断用户是否登录

    万次阅读 2019-06-28 10:06:45
    页面上很的操作都需要用户登录才能进行或者只有用户登录才能进入主页面,那怎么判断用户登录状态??? 我这判断用户登录状态是页面启动时就去Session中拿数据,如果拿的到数据的话try{}catch{}就捕获不到...
  • 多用户登录时HttpSession会话信息覆盖问题的担忧1-JSESSIONID的作用机制2-JSESSIONID的是如何进行编码的?3-代码验证提供前端页面login.htmlindex.html后端代码LoginServletIndexServletweb.xml配置测试结果  &...
  • 本篇文章主要给大家介绍PHP使用session判断用户是否登录的具体实现方法。关于PHP中session的相关知识介绍,在之前的文章【PHP中session如何存储及删除变量的?】【PHP如何用session来记录用户登陆信息?】中,已经为...
  • 配置连接数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名称', 'USER': 'root', 'PASSWORD': '123456', ...登录时记住保存用户登录信息 # 登录验证 def logi
  • 主要为大家详细介绍了如何利用JSP session对象保持住登录状态,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 由于在原有的系统开发前期只注重功能,而没有考虑系统后期的架构,一个账户可以在台设备上登录,且使用的用户对此毫无感知,一旦发生风险后果可想而知.现在在不改动系统原有的架构情况下,实现用户在一台设备登录后,在...
  • 我用A用户登录页面显示的却是B用户的信息 之前电脑没有登陆过B用户登录的时候也是通过用户名密码查出来的用户信息,没有查错的可能, 项目之前准备分布式,所以用了Redissession共享,不知道...
  • 1.安装vuex 使用npm包管理工具来安装Vuex,...更安装方式请参考:Vuex 安装 2.安装完成后构建如下目录 vuex的目录结构: getters => 从基本数据派生的数据 mutations => 提交更改数据的方法,同步! ...
  • 前端用户可以发起很url请求,那么服务器如何区分哪个请求对应哪个用户呢?前端请求是独立的,服务器从理论上来说是无法区分哪个请求是哪个用户的,所以出现了cookie和session机制。 2.怎样让服务器区分接收的...
  • session实现用户登陆功能

    千次阅读 2019-07-03 07:08:12
    <link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON"> <title>session实现用户登陆功能 - C. - CSDN博客</title>...
  • 简单来说,cookie 是通过在客户端记录信息确定用户身份的,而 session 则通过在服务器端记录信息确定用户身份。 1、Session HTTP 协议是非连接性的,取完当前浏览器的内容,然后关闭浏览器后,链接就断开了,而没有...
  • 我们一般都知道 cookie 是存在浏览器端的,session 是存在服务端的,但是实现用户登录具体是怎么用这两个东西的呢,今天来详细的说一下! 实现登录的两种方式 方式一:存储在客户端 将用户数据加密,然后存储在...
  • 通过session获取当前登录用户

    万次阅读 2019-07-17 17:06:55
    我们都知道,如果我们是管理员的话,登录一个软件进去,里面进行的很操作都是这个管理员在操作的,所以我们在填写一些固定信息的时候,比如说操作员,只要是这个操作员的账户登录了,那么里面的操作都是由这个操作...
  • 一,cookie和session的区别 cookie在客户的浏览器上,session存在服务器上 cookie是不安全的,且有...能够请求到登录后的界面  带上cookie和session的弊端: 一个cookie和session往往和一个用户对应,访问太快容易被
  • 文章目录session验证用户是否登录登录以后才能进行操作正常情况下,服务器上的资源很都是需要登入之后才能访问的,这就需要我们在后台配置一个登入检查的拦截器,对于没有登入的用户跳转到指定的提示页面。...
  • session如何在多用户中区分

    千次阅读 2018-11-27 14:20:16
    1.会话:客户端向服务端发送请求,服务端接受请求并响应这样一次连续的过程,称为一个会话(session)。 2.可实现登录访问控制功能: login.jsp doLogin.jsp index.jsp 1).进入登录页面login.jsp,输入用户名,密码后...
  • Session实现用户登录

    千次阅读 2018-11-02 14:18:17
    前端界面&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Insert title here&lt;/title&gt; &lt;/...
  • 主要介绍了javaweb用户注销后点击浏览器返回刷新页面重复登录问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 313,166
精华内容 125,266
关键字:

session做多用户登录页面