JavaWeb Filter 实现登录注册过滤

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>
View Code

 

修改 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();
        }

    }
View Code

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 }
View Code

 


开户 filter 后,访问其他页面会被阻止并返回登录:

 

4. 调试


0


1

成功登录:
2
3

登录验证失败:
5
6

注册判断用户名是否被占用:


2


4

成功注册:


7
8

5. 附

完整项目及其他相关资源下载:

https://github.com/EslSuwen/JavaWeb

猜你喜欢

转载自www.cnblogs.com/esllovesn/p/12096543.html