在我們做實際項目當中,經常會對部分頁面的訪問進行控制。例如在一個交友系統中,假設有一個頁面是listFriends.jsp,當然用戶要訪問這個頁面就必需要行進行登陸,如果是一個匿名用戶(沒登陸的用戶)訪問,那麼系統的開發者就應當考慮對這個頁面需不需要做一個訪問的控制,以限定訪問用戶的類型。一般來說對於這樣的樣面都是需要做訪問控制。一來可以避免操作出錯,二來可以防止信息的泄漏。
對具體一個頁面,做訪問控制可以有兩種方法實現。一種是通過session,另一種通過Filter。假設一個用戶登陸之後,開發者在session當中存儲一個變量id,也就用是用戶編號,這個編號是唯一的,可以在這個會話被銷燬之前都有效,那麼訪問控制的語句如下:
if(session.getAttribute("id") ==null)
{
response.sendRedirect(path);//path是處理的頁面的路徑
}
當用戶訪問這個頁面時,就會執行上面的語句,如果用戶沒有登陸那麼就會自動跳轉預先設定的處理頁面。
上面的辦法只能夠實現對一個頁面的訪問控制,如果是需要對多個頁面進行訪問控制,那麼上面的方法就不可取。我們可以通過Filter來實現。
首先,創建一個類MyFilter,這個類必須實現Filter這個接口,而且覆蓋Filter接口定義的三個方法,具體代碼如下,假設代碼index.jsp頁面是要進行控制訪問的頁面,處理頁面是index_1.jsp,讀者可以自己創建這兩個頁面,另外可以在doFilter()方法里加上自己的控制條件語句。
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class PatManagerFilter implements Filter{
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)arg0;
HttpServletResponse res = (HttpServletResponse)arg1;
String path = req.getServletPath();//獲取訪問路徑
for(int i = path.length() - 1; i >= 0; i --)//獲取訪問的頁面
if(path.charAt(i) != '/')
page = path.charAt(i) + page;
if("index.jsp".equals(page))//如果訪問的是index.jsp頁面,那麼跳轉到index_1.jsp
{
res.sendRedirect("index_1.jsp");
}
arg2.doFilter(req, res);//執行原路徑
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Init Filter");
}
}
然後,在web.xml當中加上下面的代碼:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>MyFilter</filter-class><!--類所在的路徑-->
</filter>
<filter-mapping>
<filter-name>myFilter
</filter-name>
<url-pattern>/*.jsp</url-patter>
</filter-mapping>
到些所需要做的工作結束,讀者可以自行補充其它代碼,然後測試。
通過在web.xml當中配置Filter,開發可以最大限度減少冗餘代碼,可以對多個頁面進行訪問控制。