javaweb注册登录案例

注释:本文所使用的jdbc工具类和验证码生成工具类未写出

  1. 首先设置页面首页为登录页面

    @WebServlet("/index")
    public class IndexServlet extends ViewBaseServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    ​
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //首先需要使用thymeleaf渲染login.html登录页面,由于不需要设置参数,看起来就和网页直接打开的界面一样
            super.processTemplate("login",request,response);
        }
    }
    实现thymeleaf渲染
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
        
    <script>
        //首页转换渲染
        location.href="index"
    </script>
        
        
        
        web.html配置参数
            <context-param>
            <!-- 视图(html页面)的前缀 -->
            <param-name>view-prefix</param-name>
            <param-value>/</param-value>
        </context-param>
        <context-param>
            <!-- 视图(html文件)的前缀 -->
            <param-name>view-suffix</param-name>
            <param-value>.html</param-value>
        </context-param>
        <!-- 访问欢迎页面-->
        <welcome-file-list>
            <welcome-file>index</welcome-file>
        </welcome-file-list>

  2. 设置登录界面,包括检验账号密码和记住我,以及注册等等功能

    @WebServlet("/login")
    public class ServletLogin extends ViewBaseServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    ​
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            UserDao userDao = new UserDao();
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            User userlogin = userDao.selectByNameAndPwd(user);
            String remember = request.getParameter("remember");
            if (userlogin != null) {
                if (remember!=null) {
                    //设置客户端用户登录数据
                    Cookie cookie1 = new Cookie("username", username);
                    Cookie cookie2 = new Cookie("password", password);
                    //设置cookie存活时间,除非服务器重启失效和客户端清除用户数据
                    cookie1.setMaxAge(7 * 24 * 60 * 60);
                    cookie2.setMaxAge(7 * 24 * 60 * 60);
                    response.addCookie(cookie1);
                    response.addCookie(cookie2);
                }
                //服务端存储用户数据
                HttpSession session=request.getSession();
                session.setAttribute("user",user);
                //登录成功后实现页面跳转到用户
               super.processTemplate("success",request,response);
            } else {
                request.setAttribute("error","用户名或密码不正确");
                //账号密码错误后显示输出错误,重新跳转页面进行输入
                super.processTemplate("login", request, response);
            }
        }
    }
    ​
    <div id="loginDiv" style="height: 350px">
        <form action="login" id="form" method="post">
            <h1 id="loginMsg">LOGIN IN</h1>
    <!--  当登录界面输错后,会显示提示语句      -->
            <div id="errorMsg" th:text="${error}"></div>
    <!-- 设置记住我的功能,接收request的cookie,由于接收到cookie是多个,所以需要进行删选过滤 (注意双引号里面包单引号)      -->
            <p>Username:<input id="username" name="username" type="text"  th:each="cookie1:${#request.getCookies()}"
                               th:if="${cookie1.getName().equals('username')}" th:value="${cookie1.getValue()}"></p>
            <p>Password:<input id="password" name="password" type="password" th:each="cookie:${#request.getCookies()}"
            th:if="${cookie.getName().equals('password')}" th:value="${cookie.getValue()}"></p>
            <p>Remember:<input id="remember" name="remember" type="checkbox"></p>
            <div id="subDiv">
                <input type="submit" class="button" value="login up">
                <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
                <a href="register.html">没有账号?</a>
            </div>
        </form>
    </div>

  3. 登录成功(两种情况)

    1.//直接实现一个简单的用户登录成功样式(推荐)
    <h2>欢迎你:<span th:text="${session.user.username}"></span></h2>
    ​
    2.通过servlet实现
    @WebServlet( "/success")
    public class SucessServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request,response);
        }
    ​
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            String username = request.getAttribute("username").toString();
            //直接向网页上打印
            PrintWriter writer = response.getWriter();
            writer.write("欢迎你,用户:"+username);
        }
    }
    ​
  4. 验证码图片检验,防止机器人攻击服务器

    @WebServlet("/checkcode")
    public class CheckServlet extends ViewBaseServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    ​
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletOutputStream outputStream = response.getOutputStream();
            //设置验证码图片的长宽,输出页面,以及验证码长度
            String s = CheckCodeUtil.outputVerifyImage(100, 50, outputStream, 4);
            System.out.println(s);
            //输出流使用后要关闭,避免造成内存阻塞,不然验证码图片不显示刷新
            outputStream.close();
            HttpSession session = request.getSession();
            session.setAttribute("checkCode", s);
        }
    }
    ​

  5. 注册用户

    @WebServlet("/register")
    public class RegisterServlet extends ViewBaseServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    ​
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String checkCode = request.getParameter("checkCode");
            HttpSession session = request.getSession();
            //获取验证码生成的字符串
            String checkCode1 = (String) session.getAttribute("checkCode");
            UserDao userDao = new UserDao();
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            //和用户输入的字符串对比检验
            if (checkCode.equalsIgnoreCase(checkCode1)) {
                int i = userDao.addUser(user);
                if (i > 0) {
                    //设置注册成功后直接登录
                    request.getRequestDispatcher("login").forward(request,response);
                }
            }else {
                //设置验证码输入错误后重新跳转到注册页面
                request.setAttribute("msg", "验证码错误");
                super.processTemplate("register", request, response);
            }
        }
    }
    ​
    <div class="form-div">
        <div class="reg-content">
            <h1>欢迎注册</h1>
            <span>已有帐号?</span> <a href="login.html">登录</a>
        </div>
        <form id="reg-form" action="register" method="get">
    ​
            <table>
    ​
                <tr>
                    <td>用户名</td>
                    <td class="inputs">
                        <input name="username" type="text" id="username">
                        <br>
                        <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                    </td>
    ​
                </tr>
    ​
                <tr>
                    <td>密码</td>
                    <td class="inputs">
                        <input name="password" type="password" id="password">
                        <br>
                        <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                    </td>
                </tr>
    ​
    ​
                <tr>
                    <td>验证码</td>
                    <td class="inputs">
                        <input name="checkCode" type="text" id="checkCode">
                        <img src="checkcode" id="checkimg">
                        <!--    设置用户看不清可以刷新验证码图片 ,javascript:void(0)实现简单跳转   -->
                        <a href="javascript:void(0)" id="changeImg" οnclick="changecode()">看不清?</a>
                            <!--     验证码输入错误时会显示  -->
                        <p th:text="${msg}"></p>
                    </td>
    ​
                </tr>
    ​
            </table>
    ​
            <div class="buttons">
                <input value="注 册" type="submit" id="reg_btn">
            </div>
            <br class="clear">
        </form>
    ​
    </div>
    <script>
        function changecode(){
                        //设置时间戳,点击看不清时可以刷新验证码
        document.getElementById("checkimg").src="checkcode?"+new Date().getTime();
        }
    </script>
  6. 用户

    public class UserDao implements Impl {
        @Override
        //查询账号验证码和mysql里面的表是否正确
        public User selectByNameAndPwd(User loginUser) {
            User user=null;
            String username=loginUser.getUsername();
            String password=loginUser.getPassword();
            String sql="select * from tb_user where username=? and password=?";
            List<Map<String, Object>> maps = JdbcUtil.executeQuery(sql, username, password);
            if(maps.size()>0){
                user=new User();
                Map<String, Object> map = maps.get(0);
                user.setId(Integer.valueOf(map.get("id").toString()));
                user.setUsername(map.get("username").toString());
                user.setPassword(map.get("password").toString());
            }
            return user;
        }
    ​
        @Override
        //添加用户数据(注册)
        public int addUser(User user) {
            String username = user.getUsername();
            String password = user.getPassword();
            String sql="insert into tb_user(username,password) value(?,?)";
            int i = JdbcUtil.executeUpdate(sql, username, password);
            return i;
        }
    }
    设置接口
    public interface Impl {
        User selectByNameAndPwd(User loginUser);
        int addUser(User user);
    }
    ​
    ViewBaseServlet:
        public class ViewBaseServlet extends HttpServlet {
        private TemplateEngine templateEngine;
    ​
        @Override
        public void init() throws ServletException {
    ​
            // 1.获取ServletContext对象
            ServletContext servletContext = this.getServletContext();
    ​
            // 2.创建Thymeleaf解析器对象
            ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
    ​
            // 3.给解析器对象设置参数
            // ①HTML是默认模式,明确设置是为了代码更容易理解
            templateResolver.setTemplateMode(TemplateMode.HTML);
    ​
            // ②设置前缀
            String viewPrefix = servletContext.getInitParameter("view-prefix");
    ​
            templateResolver.setPrefix(viewPrefix);
    ​
            // ③设置后缀
            String viewSuffix = servletContext.getInitParameter("view-suffix");
    ​
            templateResolver.setSuffix(viewSuffix);
    ​
            // ④设置缓存过期时间(毫秒)
            templateResolver.setCacheTTLMs(60000L);
    ​
            // ⑤设置是否缓存
            templateResolver.setCacheable(true);
    ​
            // ⑥设置服务器端编码方式
            templateResolver.setCharacterEncoding("utf-8");
    ​
            // 4.创建模板引擎对象
            templateEngine = new TemplateEngine();
    ​
            // 5.给模板引擎对象设置模板解析器
            templateEngine.setTemplateResolver(templateResolver);
    ​
        }
    ​
        protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
            // 1.设置响应体内容类型和字符集
            resp.setContentType("text/html;charset=UTF-8");
    ​
            // 2.创建WebContext对象
            WebContext webContext = new WebContext(req, resp, getServletContext());
    ​
            // 3.处理模板数据
            templateEngine.process(templateName, webContext, resp.getWriter());
        }
    }

总结:

  1. 感觉设置页面打开初始路径为登录页面这个点很巧妙

  2. 遇到的主要问题会有转发和重定向以及thymeleaf的使用有点混淆,要注意区别

  3. 在设置验证码刷新这一块,有很多需要注意的点;例如验证码不会刷新就是没有加上时间戳,验证码图片不显示就是输出流没有关闭,还有设置验证码输出错误时,需要定义到当前页面重新输入

  4. 在进行设置数据库时,id要设置自动递增

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值