天天看點

任務卡_06-JavaWEB_Filter和Listener

目錄

​​一,過濾器和監聽器的使用​​

​​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

任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener

3,如果在建立項目時沒有勾選tomcat配置,需要在edit configuration中進行配置,點選左上角選擇tomcat伺服器,重命名為目前項目名稱

任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener

4,引入tomcat外部依賴包

任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener

4.2 資料庫設計

任務卡_06-JavaWEB_Filter和Listener

4.3 實作登入和登入驗證功能

和之前的任務卡實作過程類似,差別在于:

1,實作登入servlet時,根據賬号密碼查詢使用者存在,将使用者相關資訊傳回,并存入session中;

任務卡_06-JavaWEB_Filter和Listener

2,添加了一個登入過濾器;

任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener

4.4 限制積分合格的人方可下載下傳

使用者登入後跳轉到index.jsp頁面,簡單展示了使用者名稱、使用者積分,以及下載下傳連結(a标簽展示)。

使用者點選下載下傳連結後,若積分大于100,則跳轉到評論頁面,否則跳回目前頁面

任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener

4.5 評論時過濾敏感詞

1,展示評論框和評論清單

任務卡_06-JavaWEB_Filter和Listener

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);
    }      
任務卡_06-JavaWEB_Filter和Listener

5,運作結果展示

任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener
任務卡_06-JavaWEB_Filter和Listener

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>      
任務卡_06-JavaWEB_Filter和Listener

6.3 修改完資料庫結構後一定要記得修改bean中的實體類!

idea中的插件可以根據資料庫表,直接生成實體類,但是存在以下幾個問題:

1,包名不對。自動生成的類中,可以看到包名在飄紅,修改為其所在包即可;

2,無構造方法。需要自己手動編寫;

3,通過插件修改資料庫的表結構後,記得重新生成實體類;

繼續閱讀