zoukankan      html  css  js  c++  java
  • JavaWeb用户登录功能的实现

        大四快毕业了,3年多的时间中,乱七八糟得学了一大堆,想趁找工作之前把所学的东西整理一遍,所以就尝试着做一个完整的JavaWeb系统,这几天试着做了一个用户登录的功能,分享给大家,肯定有很多不完善的地方,希望大家提提宝贵的意见,必将努力完善它。

        我贴出此篇博客的目的是,将一些以后有可能用到的重复性的代码保存下来,用于以后需要时直接复制粘贴,所以,此篇博客大部分都是代码,讲解性的语句并不多,如果大家看得头疼,不如不看,以后万一用到的话再拿过来修修改改即可。

        有可能用得到的部分:生成验证码的Java类、操作数据库的Java类

    用户登录模块采用了多种语言:

    Html、css、query:页面

    Servlet、java:后台

    运行效果图:

    wpsB3BB.tmp

    Login.html代码:

    <!DOCTYPE html>

    <html>

    <head lang="en">

        <meta charset="UTF-8">

        <title>登录界面</title>

        <script src="js/jquery-1.11.1.js"></script>

        <script src="js/login.js"></script>

        <link href="css/style.css" rel="stylesheet" type="text/css" />

    </head>

    <body>

        <div id="loginpanelwrap">

            <div class="loginheader">

                <div class="logintitle">登录</div>

            </div>

            <form action = "/UserLogin/Sample1/loginServlet">

                <div class="loginform">

                    <div class="loginform_row">

                        <label>用户名:</label>

                        <input type="text" class="loginform_input" name="username" />

                    </div>

                    <div class="loginform_row">

                        <label>密码:</label>

                        <input type="password" class="loginform_input" name="password" />

                    </div>

                    <div class = "loginform_row">

                        <label>验证码:</label>

                        <input type = "text" class="loginform_input_validationCode" name = "validationCode"/>

                        <img class = "validationCode_img" src="/UserLogin/Sample1/validationCode">

                    </div>

                    <div class="loginform_row">

                        <span class = "returnInfo"></span>

                        <input type="submit" class="loginform_submit" value="登录" />

                    </div>

                    <div class="clear"></div>

                </div>

            </form>

        </div>

    </body>

    </html>

    JQuery代码:login.js

    $(function(){

       $(".loginform_submit").click(function(){

           if(checkInput()) {

               $("form").action("/loginServlet");

           }else{

               return false;

           }

       });

       $(".validationCode_img").click(function(){

           $(".validationCode_img").attr("src","/UserLogin/Sample1/validationCode?"+Math.random());

       });

        function checkInput(){

            //判断用户名

            if($("input[name=username]").val() == null || $("input[name=username]").val() == ""){

                alert("用户名不能为空");

                $("input[name=username]").focus();

                return false;

            }

            //判断密码

            if($("input[name=password]").val() == null || $("input[name=password]").val() == ""){

                alert("密码不能为空");

                $("input[name=password]").focus();

                return false;

            }

            //判断验证码

            if($("input[name=validationCode]").val() == null || $("input[name=validationCode]").val() == ""){

                alert("验证码不能为空");

                $("input[name=validationCode]").focus();

                return false;

            }

            return true;

        }

    });

    生成验证码的Servlet:ValidationCode.java

    package zh.userlogin.sample;

    import javax.imageio.ImageIO;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import javax.servlet.http.HttpSession;

    import java.awt.*;

    import java.awt.image.BufferedImage;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.util.Random;

    /**

    * Created by zhang on 2014/9/13.

    */

    public class ValidationCode extends HttpServlet{

        @Override

        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            //获得验证码集合的长度

            int charsLength = codeChars.length();

            //下面3条记录是关闭客户端浏览器的缓冲区

            //这3条语句都可以关闭浏览器的缓冲区,但是由于浏览器的版本不同,对这3条语句的支持也不同

            //因此,为了保险起见,同时使用这3条语句来关闭浏览器的缓冲区

            resp.setHeader("ragma", "No-cache");

            resp.setHeader("Cache-Control", "no-cache");

            resp.setDateHeader("Expires", 0);

            //设置图形验证码的长和宽

            int width = 90, height = 30;

            BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

            Graphics g = image.getGraphics(); //获得用于输出文字的Graphics对象

            Random random = new Random();

            g.setColor(getRandomColor(180, 250));

            g.fillRect(0, 0, width, height);

            g.setFont(new Font("Times New Roman",Font.ITALIC,height));

            g.setColor(getRandomColor(120, 180));

            //用户保存最后随机生成的验证码

            StringBuilder validationCode = new StringBuilder();

            //验证码的随机字体

            String[] fontNames = {"Times New Roman","Book antiqua","Arial"};

            //随机生成4个验证码

            for(int i = 0; i < 4; i++){

                //随机设置当前验证码的字符的字体

                g.setFont(new Font(fontNames[random.nextInt(3)],Font.ITALIC,height));

                //随机获得当前验证码的字符

                char codeChar = codeChars.charAt(random.nextInt(charsLength));

                validationCode.append(codeChar);

                //随机设置当前验证码字符的颜色

                g.setColor(getRandomColor(10, 100));

                //在图形上输出验证码字符,x和y都是随机生成的

                g.drawString(String.valueOf(codeChar), 16*i + random.nextInt(7), height-random.nextInt(6));

            }

            //获得HttpSession对象

            HttpSession session = req.getSession();

            //设置session对象5分钟失效

            session.setMaxInactiveInterval(5*60);

            //将验证码保存在session对象中,key为validation_code

            session.setAttribute("validation_code", validationCode.toString());

            //关闭Graphics对象

            g.dispose();

            OutputStream outS = resp.getOutputStream();

            ImageIO.write(image, "JPEG", outS);

        }

        @Override

        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            doGet(req,resp);

        }

        //图形验证码的字符集,系统将随机从这个字符串中选择一些字符作为验证码

        private static String codeChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

        //返回一个随机颜色

        private static Color getRandomColor(int minColor, int maxColor){

            Random random = new Random();

            if(minColor > 255){

                minColor = 255;

            }

            if(maxColor > 255){

                maxColor = 255;

            }

            //获得r的随机颜色值

            int red = minColor + random.nextInt(maxColor-minColor);

            //g

            int green = minColor + random.nextInt(maxColor-minColor);

            //b

            int blue = minColor + random.nextInt(maxColor-minColor);

            return new Color(red,green,blue);

        }

    }

    操作数据库的代码:ManageSQLServer2008.java(本人使用的数据库为SQLServer 2008)

    package zh.userlogin.sample.dbmanager;

    import java.beans.Statement;

    import java.sql.*;

    public class ManageSQLServer2008 {

        //数据库的驱动名

        private final String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

        //数据库的url地址

        private final String url = "jdbc:sqlserver://localhost:1433;databaseName=zhDemo";

        private final String userName = "sa";

        private final String password = "123";

        private Connection conn = null;

        public ManageSQLServer2008(){

            //加载数据库驱动

            try {

                Class.forName(dbDriver).newInstance();

                //System.out.println("加载驱动成功");

            } catch (Exception e) {

                e.printStackTrace();

                System.err.println("数据库驱动加载失败");

            }

            //获取数据库链接

            try {

                conn = DriverManager.getConnection(url,userName,password);

            } catch (SQLException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                System.err.println("获取数据库链接失败");

            }

        }

        //执行各种SQL语句的方法

        private ResultSet execSQL(String sql,Object... args) throws SQLException{

            //建立PreparedStatement对象

            PreparedStatement pStmt = conn.prepareStatement(sql);

            //为pStmt对象设置SQL参数值

            for(int i = 0; i < args.length; i++){

                pStmt.setObject(i+1, args[i]);

            }

            //执行SQL语句

            pStmt.execute();

            //返回结果集,如果执行的SQL语句不返回结果集,则返回null

            return pStmt.getResultSet();

        }

        private void closeSQLConn(){

            //关闭数据库链接

            if(conn != null){

                try {

                    conn.close();

                } catch (SQLException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        }

        public String checkUser(String username,String password){

            boolean has_username = false;

            boolean password_correct = false;

            ResultSet rs = null;

            try {

                rs = execSQL("select * from zh_users");

            } catch (SQLException e) {

                System.err.println("查询数据库出错");

                e.printStackTrace();

                return null;

            }

            try {

                while(rs.next()){

                    String temp_username = rs.getString("user_name").trim();

                    String temp_password = rs.getString("password_md5").trim();

                    if(username.equals(temp_username)){

                        has_username = true;

                        if(password.equals(temp_password)){

                            password_correct = true;

                            return "hasUserNameAndPasswordCorrect";

                        }

                        return "hasUserNameButPasswordInCorrect";

                    }

                }

            } catch (SQLException e) {

                System.err.println("操作ResultSet出错");

                e.printStackTrace();

            }

            return "hasNoUserName";

        }

    }

    用于处理用户登录的Servlet:LoginServlet.java

    package zh.userlogin.sample;

    import zh.userlogin.sample.dbmanager.ManageSQLServer2008;

    import javax.servlet.RequestDispatcher;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import javax.servlet.http.HttpSession;

    import java.io.IOException;

    import java.io.OutputStream;

    /**

    * Created by zhang on 2014/9/13.

    */

    public class LoginServlet extends HttpServlet{

        @Override

        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            OutputStream out = resp.getOutputStream();

            String username = req.getParameter("username");

            String password = req.getParameter("password");

            String validationCode = req.getParameter("validationCode");

            HttpSession session = req.getSession();

            String validation_code = (String)session.getAttribute("validation_code");

            if(validationCode.equalsIgnoreCase(validation_code)){

                System.out.println("验证码正确");

            }else{

                System.out.println("验证码错误");

            }

            ManageSQLServer2008 mss = new ManageSQLServer2008();

            String result = mss.checkUser(username,password);

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

                System.out.println("用户名和密码均正确");

            } else if (result.equals("hasUserNameButPasswordInCorrect")) {

                System.out.println("用户名正确,密码不正确");

            } else if (result.equals("hasNoUserName")) {

                System.out.println("没有此用户");

            }

            //转发到result.jsp

            RequestDispatcher rd = req.getRequestDispatcher("Login.html");

            rd.forward(req, resp);

        }

        @Override

        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            doGet(req,resp);

        }

    }

    web.xml文件的配置:

    <servlet>

            <servlet-name>loginServlet</servlet-name>

            <servlet-class>zh.userlogin.sample.LoginServlet</servlet-class>

        </servlet>

        <servlet-mapping>

            <servlet-name>loginServlet</servlet-name>

            <url-pattern>/loginServlet</url-pattern>

        </servlet-mapping>

        <servlet>

            <servlet-name>validationCode</servlet-name>

            <servlet-class>zh.userlogin.sample.ValidationCode</servlet-class>

        </servlet>

        <servlet-mapping>

            <servlet-name>validationCode</servlet-name>

            <url-pattern>/validationCode</url-pattern>

    </servlet-mapping>

    最后的style.css代码,太多了,而且有点乱,所以就没有贴出来,至于CSS代码,大家可以去网上下载:http://sc.chinaz.com/tag_moban/htmlMoBan.html这个上面就有好多,大家根据喜好选择一个,然后稍加即可。

  • 相关阅读:
    Codeforces 429 A. Xor-tree
    有趣的游戏:Google XSS Game
    三层架构(一个)——什么是三层架构?
    atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o.....
    深入struts2.0(五)--Dispatcher类
    update与fixedupdate差别
    Android 平台 HTTP网速測试 案例 API 分析
    Matlab画图-非常具体,非常全面
    词性标注
    windows消息钩子
  • 原文地址:https://www.cnblogs.com/inghzhang/p/3970400.html
Copyright © 2011-2022 走看看