0. 环境准备
本文基于下文,使用 IDEA 调试:
JavaWeb MySQL 实现登录验证:https://eslsuwen.github.io/2019/06/03/Java-Login/
1. 项目修改
修改 login.jsp,使其能传递注册消息
1 <!-- contact-form --> 2 <div class="message warning"> 3 <div class="inset"> 4 <div class="login-head"> 5 <h1>请先登录</h1> 6 <div class="alert-close"></div> 7 </div> 8 <form action="login" method="POST" name="login"> 9 <li> 10 <input type="text" class="text" name="username" value="username" onfocus="this.value = '';" 11 onblur="if (this.value == '') {this.value = '用户名';}"><a href="#" class=" icon user"></a> 12 </li> 13 <div class="clear"></div> 14 <li> 15 <input type="password" name="password" value="password" onfocus="this.value = '';" 16 onblur="if (this.value == '') {this.value = 'Password';}"> <a href="#" class="icon lock"></a> 17 </li> 18 <div class="clear"></div> 19 <div class="submit"> 20 <input type="submit" value="登录"> 21 <input type="submit" value="注册" name="isSignUp"> 22 <div class="clear"></div> 23 </div> 24 25 </form> 26 </div> 27 </div>
修改 login servlet, 使其能接收注册消息
- 先判断注册消息
- 再验证登录信息
- 成功登录后通过 session 将登录状态改为 true
- 验证失败发送提示消息,并跳转回 login.jsp 页面
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码格式,可以防止乱码出现 response.setContentType("text/html; charset=utf-8"); response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); // 获取用户提交过来的用户名和密码,是通过表单中input的name属性获取的 String username = request.getParameter("username"); String password = request.getParameter("password"); String isSignUp = request.getParameter("isSignUp"); PrintWriter out = response.getWriter(); System.out.println(username + ": " + password + " isSignUp: " + isSignUp); // 获取输出流,用户显示信息,也可以用转发或者重定向 PrintWriter pw = response.getWriter(); //注册验证 if ("注册".equals(isSignUp)) { try { JdbcOp jdbc = new JdbcOp(); jdbc.open("usersdb"); ResultSet rs = jdbc.executeQuery("select * from users"); while (rs.next()) { String nm = rs.getString("name"); String pd = rs.getString("password"); System.out.println("username: " + nm + " password: " + pd); if (nm.equals(username)) { out.print("<script language='javascript'>alert('该账户已存在!请重新注册!');window.location.href='test.jsp';</script>"); out.flush(); out.close(); } } //进行注册操作 int i = jdbc.executeUpdate("insert into users values('" + username + "','" + password + "')"); System.out.println(i); if (i == 0) { out.print("<script language='javascript'>alert('账户创建失败!请重新注册!');window.location.href='index.jsp';</script>"); out.flush(); out.close(); } else { out.print("<script language='javascript'>alert('该账号已成功注册!请牢记密码!');window.location.href='test.jsp';</script>"); out.flush(); out.close(); } jdbc.close(); } catch (Exception e) { e.printStackTrace(); } } else { //登录验证 try { JdbcOp jdbc = new JdbcOp(); jdbc.open("usersdb"); ResultSet rs = jdbc.executeQuery("select * from users"); while (rs.next()) { String nm = rs.getString("name"); String pd = rs.getString("password"); System.out.println("username: " + nm + " password: " + pd); if (nm.equals(username) && pd.equals(password)) { HttpSession session = request.getSession(); //将数据存储到session中 session.setAttribute("isLogin", "true"); session.setAttribute("username", username); out.print("<script language='javascript'>alert('You login successful ! 你已成功登录!out.print');window.location.href='test.jsp';</script>"); out.flush(); out.close(); } } jdbc.close(); } catch (Exception e) { e.printStackTrace(); } pw.write("login fail"); out.print("<script language='javascript'>alert('please login first 登陆信息输入有误!');window.location.href='index.jsp';</script>"); out.flush(); out.close(); } }
3. 创建 login filter 文件
- 过滤前先判断是否是需要放行的页面
- 然后判断登录状态,true 放行,false 强制跳转到 login.jsp
1 package login; 2 3 import javax.servlet.*; 4 import javax.servlet.annotation.WebFilter; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.http.HttpSession; 8 import java.io.IOException; 9 import java.io.PrintWriter; 10 import java.net.URLEncoder; 11 12 @WebFilter(filterName = "LoginFilter", urlPatterns = "/*") 13 public class LoginFilter implements Filter { 14 15 /** 16 * 需要排除的页面 17 */ 18 private String excludedPages; 19 private String[] excludedPageArray = {"/index.jsp", "/login.jsp", "/login"}; 20 21 public void destroy() { 22 } 23 24 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 25 HttpServletRequest request = (HttpServletRequest) req; 26 HttpServletResponse response = (HttpServletResponse) resp; 27 28 response.setCharacterEncoding("UTF-8"); 29 response.setContentType("text/html;charset=UTF-8"); 30 //使用request对象的getSession()获取session,如果session不存在则创建一个 31 HttpSession session = request.getSession(); 32 33 //获取session的Id 34 String sessionId = session.getId(); 35 //判断session是不是新创建的 36 if (session.isNew()) { 37 //将数据存储到session中 38 session.setAttribute("isLogin", "false"); 39 response.getWriter().print("session generate successfully, the ID of session: " + sessionId); 40 } else { 41 response.getWriter().print("sever has existed the session, the ID of session: " + sessionId); 42 } 43 Object loginFlag = session.getAttribute("isLogin"); //("isLogin"); 44 response.getWriter().print(" session.isLogin: " + loginFlag); 45 46 boolean isExcludedPage = false; 47 response.getWriter().print(" current.url=" + request.getServletPath()+" current.user="+session.getAttribute("username")); 48 for ( 49 String page : excludedPageArray) {// 判断是否在过滤 url 之外 50 if (request.getServletPath().equals(page)) { 51 isExcludedPage = true; 52 break; 53 } 54 } 55 56 if (isExcludedPage) {// 在过滤 url 之外 57 chain.doFilter(request, response); 58 } else { 59 if (loginFlag == "false") { 60 //没有登录 61 PrintWriter out = response.getWriter(); 62 out.print("<script language='javascript'>alert('Please login first! 请先登录!out.print');window.location.href='index.jsp';</script>"); 63 out.flush(); 64 out.close(); 65 } 66 chain.doFilter(request, response); 67 } 68 69 } 70 71 public void init(FilterConfig config) throws ServletException { 72 73 } 74 75 }
开户 filter 后,访问其他页面会被阻止并返回登录:
4. 调试
注册判断用户名是否被占用:
成功注册:
5. 附
完整项目及其他相关资源下载: