注释:本文所使用的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 {
@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">
<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); }
@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. 验证码图片检验,防止机器人攻击服务器
```java
@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);
}
}
注册用户 ```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. 用户
```java
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());
}
}
总结:
- 感觉设置页面打开初始路径为登录页面这个点很巧妙
- 遇到的主要问题会有转发和重定向以及thymeleaf的使用有点混淆,要注意区别
- 在设置验证码刷新这一块,有很多需要注意的点;例如验证码不会刷新就是没有加上时间戳,验证码图片不显示就是输出流没有关闭,还有设置验证码输出错误时,需要定义到当前页面重新输入
- 在进行设置数据库时,id要设置自动递增