1. 程式人生 > >登入功能的開發(帶驗證碼)

登入功能的開發(帶驗證碼)

1.因為要和資料庫進行連線,先獲取資料來源,建立連線物件。這些操作在工具類中完成。

public class DbUtil {
    private static DataSource ds=null;
    //建立連線池
    static{
        Properties p = new Properties();
        try {
            p.load(DbUtil.class.getClassLoader().getResourceAsStream("jdbc.properties"));
           ds = BasicDataSourceFactory.createDataSource(p);
        } catch
(Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //獲取與資料庫連線的物件 public static Connection get_Connection(){ Connection conn=null; try { conn = ds.getConnection(); } catch (Exception e) { // TODO Auto-generated catch block
e.printStackTrace(); } return conn; } //關閉連線 public static void close_Connection(Connection conn){ try { if(conn!=null&&!conn.isClosed()){ conn.close(); } } catch (Exception e) { // TODO Auto-generated catch block
e.printStackTrace(); } }

jdbc.properties檔案:

driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521/orcl
username=student
password=ok
initialSize=5
maxActive=10
maxWait=6000

2.開發dao層的程式碼:判斷在前臺輸入的使用者與資料庫中的是否對應。

public boolean isExit(String username,String password){
        //獲取連線
        Connection conn = DbUtil.get_Connection();
        try {
            //建立運載sql語句的物件
            PreparedStatement ps = conn.prepareStatement("select * from student where stu_name=? and password=?");
            ps.setString(1, username);
            ps.setString(2, password);
            ResultSet rs = ps.executeQuery();
            //如果在資料庫中查到相應的記錄,返回true
            while(rs.next()) return true;

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }

3.最後開發請求到來時處理請求的servlet。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("utf-8");
        //獲取前臺傳過來的引數
        String username = request.getParameter("username");
        System.out.println(username);
        String password = request.getParameter("password");
        //驗證使用者是否存在
        LoginDao dao = new LoginDao();
        //如果存在,頁面跳轉到success.html
        if(dao.isExit(username, password)){
            response.sendRedirect("success.html");
        }
        else//否則跳轉到fail.html
            response.sendRedirect("fail.html");

    }

4.驗證碼的生成。
首先,向伺服器傳送一個獲取驗證碼的請求

<img id="check" alt="" src="checkcode">

新建一個Servlet處理這個請求,生成驗證碼,並返回給瀏覽器。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Random r=new Random();
        //1.建立一個bufferedimage物件
        BufferedImage image=new BufferedImage(60, 20, BufferedImage.TYPE_INT_RGB);
        //2.繪製長方形
        Graphics g = image.getGraphics();
        g.setColor(new Color(233, 222, 220));
        g.fillRect(0, 0, 60, 20);
        //畫干擾線 ganrao
        for(int i=0;i<100;i++){
            g.setColor(new Color(160+r.nextInt(30), 160+r.nextInt(30), 160+r.nextInt(30)));
            int x=r.nextInt(60);
            int y=r.nextInt(20);
            g.drawLine(x, y, x+r.nextInt(15), y+r.nextInt(15));
        }
        //寫上四位隨機數字
        g.setColor(new Color(22, 30, 44));
        int checkCode=r.nextInt(9000)+1000;
        g.drawString(checkCode+"", 10, 15);
        //構建輸出流,將圖片返回到瀏覽器
        OutputStream out = response.getOutputStream();
        ImageIO.write(image, "jpg", out);
    }

附加功能:看不清圖片上的驗證碼,想要重新生成一個,用jQuery實現,重新發送一個請求。

$(function(){
        $("#change").click(function(){

            $("#check").attr("src",'checkcode?hhh='+Math.random());
        });
    })