如何用jsp界面与servlet带验证码的登录

本文介绍了如何创建一个包含验证码功能的登录界面,主要涉及jsp和servlet技术。在创建过程中,需要导入特定的jar包,如itcast-tools-1.4.2.jsr、jstl.jar和standard.jar,这些可以在网上找到并下载。通过这些步骤,可以实现一个美观且具有验证功能的登录页面。

首先要有优美的登陆界面,这个是在jsp界面中写的

如下代码所示:

login.jsp界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>用户登陆</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <script type="text/javascript">
        function change(){
            var imgcode = document.getElementById("imgcode");
            imgcode.src = "<%=path%>/CreateImgCodeServlet?a="+new Date().getTime();
        }
    </script>
  </head>

  <body>

    <h1>用户登录</h1>
    <font color="red">${requestScope.message } </font>
    <form action="${pageContext.request.contextPath}/LoginServlet " method="post">
        <p>
            账号:<input type="text" name="username" value="${cookie.username.value }" />
        </p>
        <p>
            密码:<input type="password" name="password" value="${cookie.password.value }" />
        </p>
        <p>
            验证码:<input type="text" name="imgcode" size="10" />
            <img id="imgcode" alt="验证码" src="${pageContext.request.contextPath }/CreateImgCodeServlet">
            <a href="javascript:change()">换一张</a>
        </p>
        <p>
            <input type="checkbox" name="isSave" value="save" checked="checked" />记住登录状态
        </p>
        <p>
            <input type="submit" value="登录" />
        </p>
    </form>
  </body>
</html>

还有登录成功的界面success.jsp界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>登录成功</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
   <c:set value="${sessionScope.username }" var="session_username"></c:set>
    <c:if test="${session_username == null }">
        <jsp:forward page="login.jsp">
            <jsp:param value="请先登录" name="message"/>
        </jsp:forward>
    </c:if>
    <h1>登录成功</h1>
    ${session_username }您好,欢迎登录<br>
     <a href="${pageContext.request.contextPath }/ExitServlet">退出</a>
  </body>
</html>


而servlet就是对jsp界面的事务处理界面了

首先我们要有一个实体类
用户类:User
package com.oracle.entity;

public class User {

    private int userId;
    private String username;
    private String password;
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public User(int userId, String username, String password) {
        super();
        this.userId = userId;
        this.username = username;
        this.password = password;
    }

    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }



}


其次是要连接上我们的数据库
所以有一个DBUtil类:

package com.bzxy.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 连接数据库工具类,使用单例模式
 * @author user
 *
 */
public class DBUtil {

    private static String url = "jdbc:mysql://localhost:3306/bzxy";
    private static String user = "root";
    private static String pwd = "root";
    private static Connection conn ;

    private DBUtil(){

    }

    static{
        //1.动态加载驱动程序
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, pwd);


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获得数据库连接的方法
     */
    public static Connection getConn(){
        return conn;
    }

}

然后有了数据库之后,我们要对数据库进行操作,这时我们就需要一个Dao类,用来执行sql语句
如下所示:

package com.oracle.dao;

import com.oracle.entity.User;

public class LoginDao {

    //执行SQL语句,查询数据库,返回查询到的用户对象
    public User login(){
        return new User(0,"admin","1234");
    }

}

然后用户在获取信息的时侯我们专门有一个服务类
如下所示

package com.oracle.service;

import com.oracle.dao.LoginDao;
import com.oracle.entity.User;

public class LoginService {

    //获取参数并返回结果
    public boolean login(String username,String password){
        LoginDao ld = new LoginDao();
        User user = ld.login();
        if(user.getUsername().equals(username) && user.getPassword().equals(password)){
            return true;
        }
        return false;
    }

}


最后我们需要一个servlet类对jsp进行事务处理
(1)首先获得验证码图片的servlet类
package com.oracle.servlet;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.vcode.utils.VerifyCode;

public class CreateImgCodeServlet extends HttpServlet {
    /*
     * 生成验证码
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //生成随机验证码
        VerifyCode vc = new VerifyCode();
        BufferedImage image = vc.getImage();

        //把验证码文本保存到session域中
        request.getSession().setAttribute("imgcode", vc.getText());

        //把验证码图片发送到客户端
        vc.output(image, response.getOutputStream());
    }

}

(2)其次是
登录的servlet类
package com.oracle.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oracle.service.LoginService;

public class LoginServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置获取参数的字符编码
        request.setCharacterEncoding("utf-8");
        //获取客户端的参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String imgcode = request.getParameter("imgcode");
        String[] isSave = request.getParameterValues("isSave");
        //获取session域中的验证码文本
        String session_imgcode = (String) request.getSession().getAttribute("imgcode");
        if(!imgcode.equalsIgnoreCase(session_imgcode)){
            //如果验证码错误,返回登录页面
            request.setAttribute("message", "验证码有误");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }

        //调用Service层,判断登录是否成功
        LoginService ls = new LoginService();
        boolean rel = ls.login(username, password);
        if(rel){//登录成功
            //判断是否需要保存登录状态
            if(isSave!=null && isSave.length>0){
                //保存用户登录状态
                Cookie c1 = new Cookie("username",username);
                c1.setMaxAge(60*60*24*10);//保存10天
                Cookie c2 = new Cookie("password",password);
                c2.setMaxAge(60*60*24*10);
                //保存cookie
                response.addCookie(c1);
                response.addCookie(c2);
            }else{
                //不保存登录状态
                Cookie[] cs = request.getCookies();
                if(cs!=null && cs.length>0){
                    for (Cookie cookie : cs) {
                        if(cookie.getName().equals("username") || cookie.getName().equals("password")){
                            cookie.setMaxAge(0);//设置cookie失效
                            response.addCookie(cookie);//保存cookie
                        }
                    }
                }
            }
            //保存session
            request.getSession().setAttribute("username", username);
            //重定向到成功页面
            response.sendRedirect(request.getContextPath()+"/succ1.jsp");

        }else{//登录失败
            //发送错误信息
            request.setAttribute("message", "登录失败,请检查账号和密码是否正确");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }

    }


}

最后是当你登录退出时,清除记录的类
package com.oracle.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ExitServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //退出登录,清除session
        request.getSession().invalidate();
        //重定向到登录页面
        response.sendRedirect(request.getContextPath()+"/login.jsp");

    }

}


记住当你在写上方代码是不要忘记你使用的东西,需要导入一个jar包,
需要导入的这三个包的名称是:itcast-tools-1.4.2.jsr
jstl.jar
standard.jar
这三个包可以到百度上下载

OK 以上便是带验证码登录的案例了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值