學習筆記(九)Filter 完成一個簡單的許可權模型 HttpServletWrapper 和 HttpServletResponseWrapper

來源:互聯網
上載者:User

標籤:

2. HttpServletWrapper 和 HttpServletResponseWrapper

1). Servlet API 中提供了一個 HttpServletRequestWrapper 類來封裝原始的 request 對象,
HttpServletRequestWrapper 類實現了 HttpServletRequest 介面中的所有方法,
這些方法的內部實現都是僅僅調用了一下所封裝的的 request 對象的對應方法

//封裝類實現 ServletRequest 介面.
public class ServletRequestWrapper implements ServletRequest {

    //被封裝的那個 ServletRequest 對象
    private ServletRequest request;
 
 //構造器傳入 ServletRequest 實作類別對象
    public ServletRequestWrapper(ServletRequest request) {
  if (request == null) {
      throw new IllegalArgumentException("Request cannot be null");  
  }
  this.request = request;
    }

 //具體實現 ServletRequest 的方法: 調用被封裝的那個成員變數的方法實現。
    public Object getAttribute(String name) {
  return this.request.getAttribute(name);
 }

    public Enumeration getAttributeNames() {
  return this.request.getAttributeNames();
 }   
 
 //... 

相類似 Servlet API 也提供了一個 HttpServletResponseWrapper 類來封裝原始的 response 對象

2). 作用: 用於對 HttpServletRequest 或 HttpServletResponse 的某一個方法進行修改或增強.

public class MyHttpServletRequest extends HttpServletRequestWrapper{

 public MyHttpServletRequest(HttpServletRequest request) {
  super(request);
 }
 
 @Override
 public String getParameter(String name) {
  String val = super.getParameter(name);
  if(val != null && val.contains(" fuck ")){
   val = val.replace("fuck", "****");
  }
  return val;
 }
}

3). 使用: 在 Filter 中, 利用 MyHttpServletRequest 替換傳入的 HttpServletRequest

HttpServletRequest req = new MyHttpServletRequest(request);
filterChain.doFilter(req, response);

此時到達目標 Servlet 或 JSP 的 HttpServletRequest 實際上是 MyHttpServletRequest

 

1. 使用 Filter 完成一個簡單的許可權模型:

1). 需求:

①. 系統管理權限
 > 查看某人的許可權
 > 修改某人的許可權
 
②. 對訪問進行許可權控制: 有許可權則可以訪問, 否則提示: 沒有對應的許可權, 請 返回

2). 實現:

②. 對訪問進行許可權控制:

 > 使用 Filter 進行許可權的過濾: 檢驗使用者是否有許可權, 若有, 則直接響應目標頁面; 若沒有重新導向到 403.jsp
 
 *   403.jsp
 
  <h4>
   沒有對應的許可權,
   請 <a href="">返回</a>
  </h4>
  
 * 使用 Filter 如何進行過濾:
 
  - 擷取 servletPath, 類似於 /app_3/article1.jsp
  - 在使用者已經登入(可使用 使用者是否登入 的過濾器)的情況下, 擷取使用者資訊. session.getAttribute("user")
  - 再擷取使用者所具有的許可權的資訊: List<Authority>
  - 檢驗使用者是否有請求  servletPath 的許可權: 可以思考除了遍曆以外, 有沒有更好的實現方式
  - 若有許可權則: 響應
  - 若沒有許可權: 重新導向到 403.jsp
  
 * others:
  - 使用者若登入, 需要把使用者資訊(User 對象)放入到 HttpSession 中.
  - 在檢驗許可權之前, 需要判斷使用者是否已經登入.   

①. 系統管理權限:

 > 封裝許可權資訊: Authority
 
 Authority{
  //顯示到頁面上的許可權的名字
  private String displayName;
  
  //許可權對應的 URL 地址: 已許可權對應著一個 URL, 例如 Article_1 -> /app_4/article1.jsp
  private String url;
 }
 
 > 封裝使用者資訊: User
 
 User{
  private String username;
  private List<Autority> authorities;
  
  //...
 }
 
 > 建立一個 UserDao:
 
 User get(String username);
 void update(String username, List<Autority>);
 
 > 頁面
 
 authority-manager.jsp:
 
  * 有一個 text 文字框, 供輸入 username, 提交後, 使用 checkbox 顯示目前使用者所有的許可權的資訊.
  
  <form action="/day_40/AuthorityServlet?method=get" method="post">
   Name: <input name="name" type="text"/>
   <input type="submit" value="Submit"/>
  </form>
  
  
  * 檢查 request 中是否有 user 資訊, 若有, 則顯示
  xxx 的許可權為: 對應的許可權的 checkbox 打上對號. 提示, 頁面上需要通過兩層迴圈的方式來篩選出被選擇的許可權.
  
  <form action="/day_40/AuthorityServlet?method=get" method="post">
 
   Name: <input name="name" type="text"/>
   <input type="submit" value="Submit"/>
  
  </form>
  
  <br><br>
  
  AAA 的許可權是:
  
  <br><br>
  
  <form action="/day_40/AuthorityServlet?method=update" method="post">
   
   <!-- 使用隱藏欄位來儲存使用者的 name -->
   <input name="name" type="hidden" value="AAA"/>
    
   <input type="checkbox" name="authority" value="/app_4/article1.jsp"
    checked="checked"/>Article_1
   <br><br>
   
   <input type="checkbox" name="authority" value="/app_4/article2.jsp"
    checked="checked"/>Article_2
   <br><br>
   
   <input type="checkbox" name="authority" value="/app_4/article3.jsp"
    checked="checked"/>Article_3
   <br><br>
   
   <input type="checkbox" name="authority" value="/app_4/article4.jsp" />Article_4
   <br><br>
    
   <input type="submit" value="Submit"/>
  
  </form>
 
 > Servlet
 
 authority-manager.jsp 提交表單後 get 方法: 擷取表單的請求參數: username, 再根據 username 擷取 User 資訊. 把 user 放入到
 request 中, 轉寄到 authority-manager.jsp.
 
 authority-manager.jsp 修改許可權的表單提交後 update 方法: 擷取請求參數: username, authory(多選); 把選項封裝為 List; 調用
 UserDao 的 update() 方法實現許可權的修改; 重新導向到 authority-manager.jsp
 
 

學習筆記(九)Filter 完成一個簡單的許可權模型 HttpServletWrapper 和 HttpServletResponseWrapper

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.