標籤:
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