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

  1. 首先设置页面首页为登录页面 ```java @WebServlet(“/index”) public class IndexServlet extends ViewBaseServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    1. this.doPost(request, response);

    }

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

    1. //首先需要使用thymeleaf渲染login.html登录页面,由于不需要设置参数,看起来就和网页直接打开的界面一样
    2. super.processTemplate("login",request,response);

    } } 实现thymeleaf渲染

  1. web.html配置参数
  2. <context-param>
  3. <!-- 视图(html页面)的前缀 -->
  4. <param-name>view-prefix</param-name>
  5. <param-value>/</param-value>
  6. </context-param>
  7. <context-param>
  8. <!-- 视图(html文件)的前缀 -->
  9. <param-name>view-suffix</param-name>
  10. <param-value>.html</param-value>
  11. </context-param>
  12. <!-- 访问欢迎页面-->
  13. <welcome-file-list>
  14. <welcome-file>index</welcome-file>
  15. </welcome-file-list>
  1. 2. 设置登录界面,包括检验账号密码和记住我,以及注册等等功能
  2. ```java
  3. @WebServlet("/login")
  4. public class ServletLogin extends ViewBaseServlet {
  5. @Override
  6. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. this.doPost(request, response);
  8. }
  9. @Override
  10. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. String username = request.getParameter("username");
  12. String password = request.getParameter("password");
  13. UserDao userDao = new UserDao();
  14. User user = new User();
  15. user.setUsername(username);
  16. user.setPassword(password);
  17. User userlogin = userDao.selectByNameAndPwd(user);
  18. String remember = request.getParameter("remember");
  19. if (userlogin != null) {
  20. if (remember!=null) {
  21. //设置客户端用户登录数据
  22. Cookie cookie1 = new Cookie("username", username);
  23. Cookie cookie2 = new Cookie("password", password);
  24. //设置cookie存活时间,除非服务器重启失效和客户端清除用户数据
  25. cookie1.setMaxAge(7 * 24 * 60 * 60);
  26. cookie2.setMaxAge(7 * 24 * 60 * 60);
  27. response.addCookie(cookie1);
  28. response.addCookie(cookie2);
  29. }
  30. //服务端存储用户数据
  31. HttpSession session=request.getSession();
  32. session.setAttribute("user",user);
  33. //登录成功后实现页面跳转到用户
  34. super.processTemplate("success",request,response);
  35. } else {
  36. request.setAttribute("error","用户名或密码不正确");
  37. //账号密码错误后显示输出错误,重新跳转页面进行输入
  38. super.processTemplate("login", request, response);
  39. }
  40. }
  41. }
  42. <div id="loginDiv" style="height: 350px">
  43. <form action="login" id="form" method="post">
  44. <h1 id="loginMsg">LOGIN IN</h1>
  45. <!-- 当登录界面输错后,会显示提示语句 -->
  46. <div id="errorMsg" th:text="${error}"></div>
  47. <!-- 设置记住我的功能,接收request的cookie,由于接收到cookie是多个,所以需要进行删选过滤 (注意双引号里面包单引号) -->
  48. <p>Username:<input id="username" name="username" type="text" th:each="cookie1:${#request.getCookies()}"
  49. th:if="${cookie1.getName().equals('username')}" th:value="${cookie1.getValue()}"></p>
  50. <p>Password:<input id="password" name="password" type="password" th:each="cookie:${#request.getCookies()}"
  51. th:if="${cookie.getName().equals('password')}" th:value="${cookie.getValue()}"></p>
  52. <p>Remember:<input id="remember" name="remember" type="checkbox"></p>
  53. <div id="subDiv">
  54. <input type="submit" class="button" value="login up">
  55. <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
  56. <a href="register.html">没有账号?</a>
  57. </div>
  58. </form>
  59. </div>
  1. 登录成功(两种情况) ```html 1.//直接实现一个简单的用户登录成功样式(推荐)

    欢迎你:

2.通过servlet实现 @WebServlet( “/success”) public class SucessServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); }

  1. @Override
  2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. response.setContentType("text/html;charset=utf-8");
  4. String username = request.getAttribute("username").toString();
  5. //直接向网页上打印
  6. PrintWriter writer = response.getWriter();
  7. writer.write("欢迎你,用户:"+username);
  8. }

}

  1. 4. 验证码图片检验,防止机器人攻击服务器
  2. ```java
  3. @WebServlet("/checkcode")
  4. public class CheckServlet extends ViewBaseServlet {
  5. @Override
  6. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. this.doPost(request, response);
  8. }
  9. @Override
  10. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. ServletOutputStream outputStream = response.getOutputStream();
  12. //设置验证码图片的长宽,输出页面,以及验证码长度
  13. String s = CheckCodeUtil.outputVerifyImage(100, 50, outputStream, 4);
  14. System.out.println(s);
  15. //输出流使用后要关闭,避免造成内存阻塞,不然验证码图片不显示刷新
  16. outputStream.close();
  17. HttpSession session = request.getSession();
  18. session.setAttribute("checkCode", s);
  19. }
  20. }
  1. 注册用户 ```java @WebServlet(“/register”) public class RegisterServlet extends ViewBaseServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    1. this.doPost(request, response);

    }

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

    1. String username = request.getParameter("username");
    2. String password = request.getParameter("password");
    3. String checkCode = request.getParameter("checkCode");
    4. HttpSession session = request.getSession();
    5. //获取验证码生成的字符串
    6. String checkCode1 = (String) session.getAttribute("checkCode");
    7. UserDao userDao = new UserDao();
    8. User user = new User();
    9. user.setUsername(username);
    10. user.setPassword(password);
    11. //和用户输入的字符串对比检验
    12. if (checkCode.equalsIgnoreCase(checkCode1)) {
    13. int i = userDao.addUser(user);
    14. if (i > 0) {
    15. //设置注册成功后直接登录
    16. request.getRequestDispatcher("login").forward(request,response);
    17. }
    18. }else {
    19. //设置验证码输入错误后重新跳转到注册页面
    20. request.setAttribute("msg", "验证码错误");
    21. super.processTemplate("register", request, response);
    22. }

    } }

欢迎注册

已有帐号? 登录

  1. <table>
  2. <tr>
  3. <td>用户名</td>
  4. <td class="inputs">
  5. <input name="username" type="text" id="username">
  6. <br>
  7. <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
  8. </td>
  9. </tr>
  10. <tr>
  11. <td>密码</td>
  12. <td class="inputs">
  13. <input name="password" type="password" id="password">
  14. <br>
  15. <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
  16. </td>
  17. </tr>
  18. <tr>
  19. <td>验证码</td>
  20. <td class="inputs">
  21. <input name="checkCode" type="text" id="checkCode">
  22. <img src="checkcode" id="checkimg">
  23. <!-- 设置用户看不清可以刷新验证码图片 ,javascript:void(0)实现简单跳转 -->
  24. <a href="javascript:void(0)" id="changeImg" onclick="changecode()">看不清?</a>
  25. <!-- 验证码输入错误时会显示 -->
  26. <p th:text="${msg}"></p>
  27. </td>
  28. </tr>
  29. </table>
  30. <div class="buttons">
  31. <input value="注 册" type="submit" id="reg_btn">
  32. </div>
  33. <br class="clear">
  34. </form>

  1. 6. 用户
  2. ```java
  3. public class UserDao implements Impl {
  4. @Override
  5. //查询账号验证码和mysql里面的表是否正确
  6. public User selectByNameAndPwd(User loginUser) {
  7. User user=null;
  8. String username=loginUser.getUsername();
  9. String password=loginUser.getPassword();
  10. String sql="select * from tb_user where username=? and password=?";
  11. List<Map<String, Object>> maps = JdbcUtil.executeQuery(sql, username, password);
  12. if(maps.size()>0){
  13. user=new User();
  14. Map<String, Object> map = maps.get(0);
  15. user.setId(Integer.valueOf(map.get("id").toString()));
  16. user.setUsername(map.get("username").toString());
  17. user.setPassword(map.get("password").toString());
  18. }
  19. return user;
  20. }
  21. @Override
  22. //添加用户数据(注册)
  23. public int addUser(User user) {
  24. String username = user.getUsername();
  25. String password = user.getPassword();
  26. String sql="insert into tb_user(username,password) value(?,?)";
  27. int i = JdbcUtil.executeUpdate(sql, username, password);
  28. return i;
  29. }
  30. }
  31. 设置接口
  32. public interface Impl {
  33. User selectByNameAndPwd(User loginUser);
  34. int addUser(User user);
  35. }
  36. ViewBaseServlet:
  37. public class ViewBaseServlet extends HttpServlet {
  38. private TemplateEngine templateEngine;
  39. @Override
  40. public void init() throws ServletException {
  41. // 1.获取ServletContext对象
  42. ServletContext servletContext = this.getServletContext();
  43. // 2.创建Thymeleaf解析器对象
  44. ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
  45. // 3.给解析器对象设置参数
  46. // ①HTML是默认模式,明确设置是为了代码更容易理解
  47. templateResolver.setTemplateMode(TemplateMode.HTML);
  48. // ②设置前缀
  49. String viewPrefix = servletContext.getInitParameter("view-prefix");
  50. templateResolver.setPrefix(viewPrefix);
  51. // ③设置后缀
  52. String viewSuffix = servletContext.getInitParameter("view-suffix");
  53. templateResolver.setSuffix(viewSuffix);
  54. // ④设置缓存过期时间(毫秒)
  55. templateResolver.setCacheTTLMs(60000L);
  56. // ⑤设置是否缓存
  57. templateResolver.setCacheable(true);
  58. // ⑥设置服务器端编码方式
  59. templateResolver.setCharacterEncoding("utf-8");
  60. // 4.创建模板引擎对象
  61. templateEngine = new TemplateEngine();
  62. // 5.给模板引擎对象设置模板解析器
  63. templateEngine.setTemplateResolver(templateResolver);
  64. }
  65. protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
  66. // 1.设置响应体内容类型和字符集
  67. resp.setContentType("text/html;charset=UTF-8");
  68. // 2.创建WebContext对象
  69. WebContext webContext = new WebContext(req, resp, getServletContext());
  70. // 3.处理模板数据
  71. templateEngine.process(templateName, webContext, resp.getWriter());
  72. }
  73. }

总结:

  1. 感觉设置页面打开初始路径为登录页面这个点很巧妙
  2. 遇到的主要问题会有转发和重定向以及thymeleaf的使用有点混淆,要注意区别
  3. 在设置验证码刷新这一块,有很多需要注意的点;例如验证码不会刷新就是没有加上时间戳,验证码图片不显示就是输出流没有关闭,还有设置验证码输出错误时,需要定义到当前页面重新输入
  4. 在进行设置数据库时,id要设置自动递增