目錄
一,過濾器和監聽器的使用
1,任務概述
2,任務過程
3,驗收标準
4,編碼過程
4.1 配置環境
4.2 資料庫設計
4.3 實作登入和登入驗證功能
4.4 限制積分合格的人方可下載下傳
4.5 評論時過濾敏感詞
5,運作結果展示
6,需要注意的點
6.1 注意getParameter與getAttribute差別!!!
6.2 顯示評論時間,具體到秒
6.3 修改完資料庫結構後一定要記得修改bean中的實體類!
完整項目位址Chapter7 · GoodbyeFirefly/JavaCourse - 碼雲 - 開源中國 (gitee.com)
一,過濾器和監聽器的使用
1,任務概述
現在公司為了能擴大收益面,将原來免費下載下傳的資源修改為有償下載下傳,要 求使用者在登入情況下,且個人積分在 100 分以上時,才可以下載下傳資源(使用者可 以通過充值來提高積分量),并且下載下傳完成後,可以留言評論該資源,此時如 何保證使用者釋出的文字合理合法(不能包含敏感詞)?
2,任務過程
- 1. 配置所有請求執行過濾器
- 2. 過濾器中添加使用者非登入驗證
- 3. 使用者登入情況下,查詢其個人積分是否滿足下載下傳條件
- 4. 下載下傳完成後,使用者留言評論,在過濾器中對留言内容進行敏感詞過濾
3,驗收标準
- 下載下傳請求時的驗證效果
- 輸入敏感詞後,替換成星号或直接讓使用者重新輸入
4,編碼過程
為了加快學習速度,目前将注意力放在任務卡最核心的地方,其餘的細節部分盡量簡化,有需要的同學酌情參考。
完整項目代碼在這裡
4.1 配置環境
老一套了,但是在自己完全搞熟之前還是一步一步來吧
1,建立web工程,記得在裡面勾選tomcat server并填寫相關資訊,如果在建立項目時不填寫,後面需要自己進行tomcat配置和導包(新版本的IDEA沒有建立web application的選項,隻能先建立Java項目,然後在support framework裡選擇并建立)
2,在web/WEB-INF下建立lib、classes。将所需的jar包粘貼在lib中,在project structure/modules/dependences中引入該目錄。在project structure/modules/paths中修改編譯檔案的輸出路徑為classes

3,如果在建立項目時沒有勾選tomcat配置,需要在edit configuration中進行配置,點選左上角選擇tomcat伺服器,重命名為目前項目名稱
4,引入tomcat外部依賴包
4.2 資料庫設計
4.3 實作登入和登入驗證功能
和之前的任務卡實作過程類似,差別在于:
1,實作登入servlet時,根據賬号密碼查詢使用者存在,将使用者相關資訊傳回,并存入session中;
2,添加了一個登入過濾器;
4.4 限制積分合格的人方可下載下傳
使用者登入後跳轉到index.jsp頁面,簡單展示了使用者名稱、使用者積分,以及下載下傳連結(a标簽展示)。
使用者點選下載下傳連結後,若積分大于100,則跳轉到評論頁面,否則跳回目前頁面
4.5 評論時過濾敏感詞
1,展示評論框和評論清單
2,發送評論時通過message請求完成(上圖action=message),評論過濾需要針對該請求進行
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
req.setCharacterEncoding("UTF-8");
// 這裡是getParameter不是getAttribute!!!
String comment = req.getParameter("comment");
User user = (User) req.getSession().getAttribute("userInfo");
if(comment != null && user != null && user.getScore() > 100) {
System.out.println("messageFilter2:" + comment);
String[] sensitiveWord = {"滾", "爬", "fuck", "卧槽", "靠", "放屁", "炸彈"};
// 周遊敏感詞組的每個單詞 若存在于評論中則将其替換為*
for(String str : sensitiveWord) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length(); i++) sb.append("*");
comment = comment.replace(str, sb.toString());
}
} else if(user == null || (user != null && user.getScore() <= 100)) {
// 避免積分低的使用者登入後再直接跳轉到資訊界面
resp.sendRedirect("login.jsp");
}
req.getSession().setAttribute("comment", comment);
filterChain.doFilter(req, resp);
}
5,運作結果展示
6,需要注意的點
6.1 注意getParameter與getAttribute差別!!!
getParameter是從頁面輸入中擷取參數,比如form表單中的文本輸入框等;
getAttribute要想獲得資料,需要先用setAttribute存入;
6.2 顯示評論時間,具體到秒
首先,資料庫中評論表的時間屬性是timestamp;
其次,向資料庫插入資料時需要用new Timestamp(new Date().getTime());
最後,顯示時間時,修改展示格式
<li><g:formatDate value="${comment.time}" pattern="yyyy-MM-dd HH:mm:ss"></g:formatDate> </li>
6.3 修改完資料庫結構後一定要記得修改bean中的實體類!
idea中的插件可以根據資料庫表,直接生成實體類,但是存在以下幾個問題:
1,包名不對。自動生成的類中,可以看到包名在飄紅,修改為其所在包即可;
2,無構造方法。需要自己手動編寫;
3,通過插件修改資料庫的表結構後,記得重新生成實體類;