【JavaWeb】Filter案例:登录验证、敏感词汇过滤
接上一遍Filter基礎知識,本文在兩個應用場景下使用FIlter過濾器,加深理解應用。
本文目錄
- Filter案例
- 一.案例1_登錄驗證
- 1.0 正常的登錄流程
- 1.1 需求
- 1.2 代碼實現
- 1.2.1 目錄結構
- 1.2.2 數據庫準備
- 1.2.3 頁面login.jsp和index.jsp
- 1.2.4 dao層
- 1.2.5 domain層
- 1.2.6 util層
- 1.2.7 web層
- 1.3 測試
- 二.案例2_敏感詞匯過濾
- 2.1 需求分析
- 2.2 代碼實現
- 2.2.1 目錄結構
- 2.2.2 核心代碼
Filter案例
練習場景下使用過濾器,利用過濾器完成一些通用的操作。
一.案例1_登錄驗證
我們先正常的將登錄流程走一遍,再對案例進行分析、實現。
1.0 正常的登錄流程
用戶登錄界面:
登錄成功:
比較簡單的邏輯:
1.1 需求
案例分析:
過濾器核心代碼:LoginFilter.java
需要注意的是:
- 攔截請求過程中需要判斷用戶請求是否包含訪問登錄相關資源路徑,要注意排除掉 css/js/圖片/驗證碼等其它資源,否則請求這些資源也會被攔截掉,頁面的樣式就會丟失。
1.2 代碼實現
1.2.1 目錄結構
登錄案例可以參考另一篇博文:【JavaWeb】綜合案例:用戶登錄.
1.2.2 數據庫準備
1.2.3 頁面login.jsp和index.jsp
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>用戶登錄</title> </head> <body> <form action="/LoginServlet" method="post">用戶賬號:<input type="text" placeholder="請輸入賬號" name="username"><br>用戶密碼:<input type="text" placeholder="請輸入密碼" name="password"><br><input type="submit" value="登錄"> </form> <!--提示信息--> <p>${login_msg}</p> </body> </html>index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>用戶主頁</title><!--導入css文件--><link rel="stylesheet" type="text/css" href="css/style.css" /></head> <body> <p>登錄成功,用戶名${user.username}歡迎您!</p><form action="/UpdateServlet" method="post"><input type="hidden" name="id" value="${user.id}"><label for="introduce">自我介紹:</label><input type="text" name="introduce" id="introduce" value="${user.introduce}"><input type="submit" value="修改自我介紹"> </form> </body> </html>style.css
label{color: red; }1.2.4 dao層
UserDao.java
/*** 操作數據庫的類*/ public class UserDao {//聲明JDBCTemplate對象共用private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());/*** 登錄方法** @param loginUser* @return user包含用戶全部數據,沒有查詢到,放回null*/public User login(User loginUser) {try {//1.編寫sql語句String sql = "select * from info where username=? and password=?";//2.調用JDBCTemplate對象的查詢方法User user = jdbcTemplate.queryForObject(sql //sql語句, new BeanPropertyRowMapper<User>(User.class) //RowMapper接口實現類,將數據自動封裝成指定對象, loginUser.getUsername() //sql參數, loginUser.getPassword()); // sql參數return user;} catch (Exception e) {e.printStackTrace();//以后會將異常記錄到日志文件中return null;}}/*** 修改用戶自我介紹** @param updateUser* @return*/public User update(User updateUser) {//1.編寫sql語句String sql = "update info set introduce = ? where id = ? ";//2.調用JDBCTemplate對象的方法jdbcTemplate.update(sql,updateUser.getIntroduce(),updateUser.getId());//3.再次查詢return jdbcTemplate.queryForObject("select * from info where id = ?" //sql語句, new BeanPropertyRowMapper<User>(User.class) //RowMapper接口實現類,將數據自動封裝成指定對象, updateUser.getId()); // sql參數} }1.2.5 domain層
User.java
/*** 用戶實體類*/ public class User implements Serializable {private int id;private String username;private String password;private String introduce;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getIntroduce() {return introduce;}public void setIntroduce(String introduce) {this.introduce = introduce;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", introduce='" + introduce + '\'' +'}';} }1.2.6 util層
JDBCUtils.java
/*** JDBC工具類,使用Druid連接池*/ public class JDBCUtils {private static DataSource ds;static {try {//1.加載配置文件Properties prop = new Properties();InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");prop.load(is);//2.初始化數據庫連接池對象ds = DruidDataSourceFactory.createDataSource(prop);} catch (Exception e) {e.printStackTrace();}}/*** 獲取連接池對象** @return*/public static DataSource getDataSource() {return ds;}/*** 獲取數據庫連接對象** @return*/public static Connection getConnection() throws SQLException {return ds.getConnection();} }1.2.7 web層
過濾器:LoginFilter.java
Servlet資源:
LoginServlet.java
@WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.設置解碼格式req.setCharacterEncoding("utf-8");//2.獲取請求體參數username和passwordString username = req.getParameter("username");String password = req.getParameter("password");//3.將username和password封裝成User對象User loginuser = new User();loginuser.setUsername(username);loginuser.setPassword(password);//4.調用UserDao的login方法UserDao dao = new UserDao();User user = dao.login(loginuser);//5.判斷user是否為nullif (user==null){//登錄失敗跳轉到登錄頁面req.setAttribute("login_msg","登錄失敗!用戶名或密碼錯誤。");req.getRequestDispatcher("/login.jsp").forward(req,resp);}else {//登錄成功,將用戶信息存在Session中,跳轉index.jspHttpSession session = req.getSession();session.setAttribute("user",user);resp.sendRedirect("/index.jsp");}} }UpdateServlet.java
@WebServlet(name = "UpdateServlet", urlPatterns = "/UpdateServlet") public class UpdateServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//1.設置解碼格式request.setCharacterEncoding("utf-8");//2.獲取請求體參數username和passwordString id = request.getParameter("id");String introduce = request.getParameter("introduce");//3.將id和introduce封裝成User對象User Update_user = new User();Update_user.setId(Integer.parseInt(id));Update_user.setIntroduce(introduce);//4.調用UserDao的update方法UserDao dao = new UserDao();User user = dao.update(Update_user);//5.顯示修改后用戶的自我介紹request.setAttribute("user", user);request.getRequestDispatcher("/index.jsp").forward(request, response);} }1.3 測試
1.用戶未登錄,直接訪問index.jsp:將會跳轉到登錄界面login.jsp,并給出提示信息
未登錄,直接訪問LoginServlet、updateSerlvet資源同樣如此。
2.當前用戶已經登錄,即session域中存在user的鍵值對,再直接訪問index.jsp、LoginServlet、updateSerlvet資源就無須執行登錄業務邏輯了:
登錄成功,此時重開一個新的標簽頁,直接訪問index.jsp:
通過F12查看瀏覽器控制臺,網絡抓包,可以看到直接進入了用戶主頁,不會再訪問LoginServlet資源。
二.案例2_敏感詞匯過濾
使用上面登錄案例,來實現敏感詞匯的過濾。用戶修改自我介紹的時候,如果包含了《敏感詞匯.txt》里面的敏感詞匯,則會將詞匯替換為 ***。
敏感詞匯.txt
笨蛋 壞蛋先來看下效果:
修改自我介紹:
點擊修改自我介紹,將會回顯用戶修改后的自我介紹:
比較簡單的例子,旨在能理解明白過濾器進行敏感詞匯過濾的邏輯,下面就來實現這個效果。
2.1 需求分析
需求:
- 1.對【用戶登錄案例】修改的自我介紹數據進行敏感詞匯過濾
- 2.敏感詞匯參考《敏感詞匯.txt》
- 3.如果是敏感詞匯,替換為 ***
過濾分析圖
難點分析
代碼模式不熟悉的小伙伴,可以先閱讀下另一篇的博文:代理模式:動態代理、靜態代理.
2.2 代碼實現
2.2.1 目錄結構
大部分代碼與上面登錄案例一致。
2.2.2 核心代碼
核心代碼就是:敏感詞匯過濾器SensitiveWordsFilter.java
- 使用緩沖字符輸入流獲取 《敏感詞匯.txt》的詞匯內容
- 增強方法邏輯中,使用 “***” 替換掉請求參數里面的敏感詞匯,并返回替換后的值
測試與前面演示效果一致,不贅述了。
到這兩個過濾器的小案例就完成了,理解為主,當前還可以進行更多過濾器的延伸,相信小伙伴們都可以信手拈來~
總結
以上是生活随笔為你收集整理的【JavaWeb】Filter案例:登录验证、敏感词汇过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php设置cookie值,PHP如何设置
- 下一篇: Java飞机大战MVC版