Ajax实现登录时的用户名验证(Servlet 响应)

1 篇文章 0 订阅
本文介绍了如何使用Ajax和Servlet实现登录时的用户名验证。当用户在登录界面输入用户名并失去焦点时,Ajax引擎会发起GET请求到服务器,Servlet接收到请求后检查用户名是否存在,然后返回响应。通过这种方式,可以实现实时的用户名验证,提高用户体验。
摘要由CSDN通过智能技术生成

登录提交表单使用 POST 请求进行验证及转发;
输入用户名(是否正确)及密码(是否为空) 使用 GET 请求进行验证;

1. 登录界面及主页

<!--login.jsp-->
<form action="login" method="POST">
    <div>
        <input type="text" name="username" id="userId" placeholder="用户名">
        <span class="info"></span>
    </div>
    <div>
        <input type="password" name="password" id="passwd" placeholder="密码">
    </div>
    <input type="submit" value="登   录"  id="submit" >
    <span class="hint">${error} </span>
</form>

<!--index.jsp-->
<h3 style='color:#00f'>亲爱的${user.name},欢迎您!</h3>
<p>现在的时间是:<% out.println(new java.util.Date()); %></p>

2. Ajax 引擎请求服务器及接受响应

//javascript
var xmlHttp;
var userId = document.getElementById("userId");
var passwd = document.getElementById("passwd");
var info = document.getElementsByClassName("info");
var submit = document.getElementById("submit");
var hint = document.getElementsByClassName("hint")[0];
userId.onblur = checkUser;
passwd.onblur = checkPwd;

function createXMLHttpRequest() {
    //检查是否支持 ActiveXObject 控件(IE浏览器)
    if(window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } else if(window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest(); 
    }
}
//检查用户名是否正确或存在
function checkUser() {
    createXMLHttpRequest();
    var url = "login?username="+userId.value;
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    xmlHttp.onreadystatechange = function() {
        if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            info[0].innerHTML = xmlHttp.responseText;
        }
    };
}
//检查密码是否为空或null
function checkPwd() {
    createXMLHttpRequest();
    var url = "login?password="+passwd.value;
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    xmlHttp.onreadystatechange = function() {
        if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            info[1].innerHTML = xmlHttp.responseText;
        }
    };
}
//提交登录之前检查,若用户名或密码为空,则取消请求
submit.onclick = function(){
    if(userId.value==""){
        info[0].innerHTML = "";
        info[1].innerHTML = "";
        hint.innerHTML = "用户名不能为空!";
        return false;
    } else if(passwd.value==""){
        info[0].innerHTML = "";
        info[1].innerHTML = "";
        hint.innerHTML = "密码不能为空!";
        return false;       
    }
}

3. Servlet 对请求作出响应

当 username 为空时,按 tab 键使用户名输入框失去焦点,此时触发GET请求,url 后缀为: ?username=
即:username=="", password==null

当 username 不为空,按 tab 键使用户名输入框失去焦点,并触发GET请求,url 后缀为: ?username=xxx
即:username=="xxx", password==null

若再按 tab 键使密码输入框又失去焦点,这时继续GET请求,url 后缀为: ?password=
即:username==null, password==""

//LoginServlet.java
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    ......
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter(); 
        // username、password 可能为null, 可能不为null
        if(request.getParameter("username") == "") {  
            //?username=
            if(request.getParameter("password") == null) {
                out.print("用户名不能为空!");
            } 
        } else if(request.getParameter("username") == null) { 
            if(request.getParameter("password") == ""){
                //?password=
                out.print("密码不能为空!");   
            }   
        } else { 
            //?username=xxx
            String name = request.getParameter("username");     
            if(!name.equals("admin")) {
                if(request.getParameter("password") == null) {
                    out.print("用户名不存在!");   
                }           
            }
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter(); 

        String name = request.getParameter("username");
        String pwd = request.getParameter("password");

        if(name.equals("admin") && pwd.equals("admin")) {
            User user = new User(name,pwd);  //user对象
            HttpSession session = request.getSession();
            session.setAttribute("user", user);     
            RequestDispatcher rd = request.getRequestDispatcher("/");
            rd.forward(request, response);
        } else {
            request.setAttribute("error", "用户名或密码错误!");
            RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
            rd.forward(request, response);      
        }
    }
}
//User.java
public class User {
    String name;
    String pwd;
    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

待续 …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值