注释:本文所使用的jdbc工具类和验证码生成工具类未写出
首先设置页面首页为登录页面 ```java @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渲染
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. 设置登录界面,包括检验账号密码和记住我,以及注册等等功能```java@WebServlet("/login")public class ServletLogin extends ViewBaseServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected 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"> <a href="register.html">没有账号?</a></div></form></div>
- 登录成功(两种情况)
```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); }
@Overrideprotected 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. 验证码图片检验,防止机器人攻击服务器```java@WebServlet("/checkcode")public class CheckServlet extends ViewBaseServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected 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);}}
注册用户 ```java @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);}
} }
6. 用户```javapublic 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;@Overridepublic 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());}}
总结:
- 感觉设置页面打开初始路径为登录页面这个点很巧妙
- 遇到的主要问题会有转发和重定向以及thymeleaf的使用有点混淆,要注意区别
- 在设置验证码刷新这一块,有很多需要注意的点;例如验证码不会刷新就是没有加上时间戳,验证码图片不显示就是输出流没有关闭,还有设置验证码输出错误时,需要定义到当前页面重新输入
- 在进行设置数据库时,id要设置自动递增
