import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * Created by Administrator on 2016/11/23. */ public class PermissionFilter implements Filter { private HttpServletRequest request; private HttpServletResponse response; @Override public void init(FilterConfig filterConfig) throws ServletException { } /*** * 請求服務時 * @param request * @param response * @param chain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /** * httpRequest.getRequestDispatcher("/helloWorld").forward(httpRequest, response); 服務器端轉發,不改變瀏覽器端URL地址,經常使用 httpResponse.sendRedirect(uri); 瀏覽器端重定向,改變URL在瀏覽器地址欄 */ /** * 1,doFilter的第一個參數爲ServletRequest對象。此對象給過濾器提供了對進入的信息(包括 * 表單數據、cookie和HTTP請求頭)的徹底訪問。第二個參數爲ServletResponse,一般在簡單的過 * 濾器中忽略此參數。最後一個參數爲FilterChain,此參數用來調用servlet或JSP頁。 */ this.request =(HttpServletRequest)request; /** * 若是處理HTTP請求,而且須要訪問諸如getHeader或getCookies等在ServletRequest中 * 沒法獲得的方法,就要把此request對象構形成HttpServletRequest */ this.response = (HttpServletResponse) response; // 取得根目錄所對應的絕對路徑: String currentURL = this.request.getRequestURI(); // 截取到當前文件名用於比較 String targetURL = currentURL.substring(currentURL.indexOf("/", 1), currentURL.length()); HttpSession session = this.request.getSession(false); //攔截其餘請求: // 用戶權限不夠是,重定向到提示權限不夠接口 //不過濾登入的action 用戶登陸請求和提示用戶登陸請求直接過 if (!"/login".equals(targetURL)&&!"/nopermission".equals(targetURL)&&!"/nologin".equals(targetURL)) { // 用戶未登陸,跳轉到提示接口 if (session == null || session.getAttribute(Constants.UserLogin.LOGINUSERMSG) == null) { this.request.getRequestDispatcher("/user/nologin").forward(request, response); return; } // 用戶已登陸,判斷權限 else{ if("/permission".equals(targetURL)) { UserVO userVO = new UserVO(); userVO = (UserVO) session.getAttribute(Constants.UserLogin.LOGINUSERMSG); //權限不夠,跳轉到提示接口 if (userVO.getLevel()!=1){ this.request.getRequestDispatcher("/user/nopermission").forward(request, response); return; } } } } // 加入filter鏈繼續向下執行 chain.doFilter(request, response); /** * 調用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象做 爲它 * 的一個參數。在調用此對象的doFilter方法時,激活下一個相關的過濾器。若是沒有另 * 一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。 */ } /*** * 服務重啓以後 */ @Override public void destroy() { this.request.getSession(false).setAttribute(Constants.UserLogin.LOGINUSERMSG,null); } }
<filter> <filter-name>permissionFilter</filter-name> <filter-class>com.common.PermissionFilter</filter-class> </filter> <filter-mapping> <filter-name>permissionFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <!-- 沒有配置dispatcher就是默認request方式的 --> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>
上面兩個是過濾器和web.xml配置代碼。java