java filter 實現權限控制

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

相關文章
相關標籤/搜索