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.附
完整項目及其他相關資源下載: