JavaWeb Filter 實現登錄注冊過濾


0.環境准備

本文基於下文,使用 IDEA 調試:

JavaWeb MySQL 實現登錄驗證:https://eslsuwen.github.io/2019/06/03/Java-Login/

1.項目修改

修改 login.jsp,使其能傳遞注冊消息

<!-- contact-form -->
<div class="message warning">
    <div class="inset">
        <div class="login-head">
            <h1>請先登錄</h1>
            <div class="alert-close"></div>
        </div>
        <form action="login" method="POST" name="login">
            <li>
                <input type="text" class="text" name="username" value="username" onfocus="this.value = '';"
                       onblur="if (this.value == '') {this.value = '用戶名';}"><a href="#" class=" icon user"></a>
            </li>
            <div class="clear"></div>
            <li>
                <input type="password" name="password" value="password" onfocus="this.value = '';"
                       onblur="if (this.value == '') {this.value = 'Password';}"> <a href="#" class="icon lock"></a>
            </li>
            <div class="clear"></div>
            <div class="submit">
                <input type="submit" value="登錄">
                <input type="submit" value="注冊" name="isSignUp">
                <div class="clear"></div>
            </div>

        </form>
    </div>
</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
package login;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

@WebFilter(filterName = "LoginFilter", urlPatterns = "/*")
public class LoginFilter implements Filter {

    /**
     * 需要排除的頁面
     */
    private String excludedPages;
    private String[] excludedPageArray = {"/index.jsp", "/login.jsp", "/login"};

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //使用request對象的getSession()獲取session,如果session不存在則創建一個
        HttpSession session = request.getSession();

        //獲取session的Id
        String sessionId = session.getId();
        //判斷session是不是新創建的
        if (session.isNew()) {
            //將數據存儲到session中
            session.setAttribute("isLogin", "false");
            response.getWriter().print("session generate successfully, the ID of session: " + sessionId);
        } else {
            response.getWriter().print("sever has existed the session, the ID of session: " + sessionId);
        }
        Object loginFlag = session.getAttribute("isLogin");     //("isLogin");
        response.getWriter().print("  session.isLogin: " + loginFlag);

        boolean isExcludedPage = false;
        response.getWriter().print("  current.url=" + request.getServletPath()+" current.user="+session.getAttribute("username"));
        for (
                String page : excludedPageArray) {// 判斷是否在過濾 url 之外
            if (request.getServletPath().equals(page)) {
                isExcludedPage = true;
                break;
            }
        }

        if (isExcludedPage) {// 在過濾 url 之外
            chain.doFilter(request, response);
        } else {
            if (loginFlag == "false") {
                //沒有登錄
                PrintWriter out = response.getWriter();
                out.print("<script language='javascript'>alert('Please login first! 請先登錄!out.print');window.location.href='index.jsp';</script>");
                out.flush();
                out.close();
            }
            chain.doFilter(request, response);
        }

    }

    public void init(FilterConfig config) throws ServletException {

    }

}

4.調試

開啟 filter 后,訪問其他頁面會被阻止並返回登錄:

成功登錄:

登錄驗證失敗:

注冊判斷用戶名是否被占用:

成功注冊:

5.附

完整項目及其他相關資源下載:

https://github.com/EslSuwen/JavaWeb


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM