日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【JavaWeb】Filter案例:登录验证、敏感词汇过滤

發布時間:2023/12/10 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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/圖片/驗證碼等其它資源,否則請求這些資源也會被攔截掉,頁面的樣式就會丟失。
    /*** 登錄驗證的過濾器*/ @WebFilter("/*") public class LoginFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//0.強制轉換,因為ServletRequest接口的子接口HttpServletRequest才有獲取請求路徑的方法HttpServletRequest request = (HttpServletRequest) req;//1.獲取資源請求路徑String uri = request.getRequestURI();//2.判斷是否包含登錄相關資源路徑,要注意排除掉 css/js/圖片/驗證碼等資源if("/login.jsp".contains(uri) || "/LoginServlet".contains(uri) || "/css/".contains(uri) || "/js/".contains(uri) || "/fonts/".contains(uri) ){//包含,用戶就是想登錄。放行chain.doFilter(req, resp);}else{//不包含,需要驗證用戶是否登錄//3.從獲取session中獲取userObject user = request.getSession().getAttribute("user");if(user != null){//登錄了。放行chain.doFilter(req, resp);}else{//沒有登錄。跳轉登錄頁面request.setAttribute("login_msg","您尚未登錄,請登錄!");request.getRequestDispatcher("/login.jsp").forward(request,resp);}}}public void init(FilterConfig config) throws ServletException {}public void destroy() {} }

    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.如果是敏感詞匯,替換為 ***

    過濾分析圖


    難點分析

  • 對req對象進行增強。使用動態代理,增強獲取參數相關方法,對請求參數中敏感詞匯進行過濾;
  • 放行。傳遞代理對象
  • 代碼模式不熟悉的小伙伴,可以先閱讀下另一篇的博文:代理模式:動態代理、靜態代理.

    2.2 代碼實現

    2.2.1 目錄結構

    大部分代碼與上面登錄案例一致。

    2.2.2 核心代碼

    核心代碼就是:敏感詞匯過濾器SensitiveWordsFilter.java

    • 使用緩沖字符輸入流獲取 《敏感詞匯.txt》的詞匯內容
    • 增強方法邏輯中,使用 “***” 替換掉請求參數里面的敏感詞匯,并返回替換后的值
    /*** 敏感詞匯過濾器*/ @WebFilter("/*") public class SensitiveWordsFilter implements Filter {//敏感詞匯集合private List<String> list = new ArrayList<String>();public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//1.創建代理對象,增強getParameter方法ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//增強getParameter方法//判斷是否是getParameter方法if(method.getName().equals("getParameter")){//增強返回值//獲取返回值String value = (String) method.invoke(req,args);if(value != null){for (String str : list) {if(value.contains(str)){value = value.replaceAll(str,"***");}}}return value;}//考慮到可能使用其它獲取請求參數的方法,那就都需要進行增強,思路是一樣的,這里不展開了。//判斷方法名是否是 getParameterMap//判斷方法名是否是 getParameterValuereturn method.invoke(req,args);}});//2.放行chain.doFilter(proxy_req, resp);}public void init(FilterConfig config) throws ServletException {try{//1.獲取文件真實路徑ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感詞匯.txt");//2.讀取文件BufferedReader br = new BufferedReader(new FileReader(realPath));//3.將文件的每一行數據添加到list中String line = null;while((line = br.readLine())!=null){list.add(line);}//釋放流br.close();System.out.println(list);}catch (Exception e){e.printStackTrace();}}public void destroy() {} }

    測試與前面演示效果一致,不贅述了。

    到這兩個過濾器的小案例就完成了,理解為主,當前還可以進行更多過濾器的延伸,相信小伙伴們都可以信手拈來~


    總結

    以上是生活随笔為你收集整理的【JavaWeb】Filter案例:登录验证、敏感词汇过滤的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。