javaWeb知識學習——Filter過濾器的使用

知識點彙總

Filter:是javaWeb的一個重要組件,可以對發送到Servlet的請求進行攔截,並對響應也進行攔截。
Filter是實現了Filter接口的java類
Filter需要在web.xml中進行配置。多個Filter攔截的順序和<filter-mapping>配置順序有關
`指定過濾器所攔截的資源被Servlet容器調用的方式默認REQUESE
①REQUEST用戶之間訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,該過濾器不會被調用。
②FORWARD如果目標資源是通過RequestDispatcher的forward()方法訪問時,該過濾器將會被調用,除外該過濾器不會被調用。
③INCLUDE如果目標資源是通過RequestDispatcher的include()方法訪問時,該過濾器將會被調用,除外該過濾器不會被調用。
④ERROR如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將會被調用,除外該過濾器不會被調用。
代碼示例:
1.定義自己的HttpFilter類

public abstract class HttpFilter implements Filter {
    private FilterConfig filterConfig;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
init();
    }
protected void init(){}
public FilterConfig getFilterConfig(){
        return filterConfig;
}
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
        HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
        doFilter(httpServletRequest,httpServletResponse,filterChain);
    }
    public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain)
        throws IOException,ServletException;
    @Override
    public void destroy() {
    }
}

2.登錄過濾器

public class LoginFilter extends HttpFilter {
    private  String sessionKey;
    private String redirectUrl;
    private String uncheckedUrls;

    @Override
    protected void init() {
        ServletContext servletContext=getFilterConfig().getServletContext();
        sessionKey=servletContext.getInitParameter("userSessionKey");
        redirectUrl=servletContext.getInitParameter("redirectPage");
        uncheckedUrls=servletContext.getInitParameter("UncheckedUrls");
    }
/**
*@ClassName LoginFilter
*@Description 檢查用戶是否登錄的過濾器
*@Param [request, response, filterChain]
*@Return void
*@Date 2020/2/29 12:12
*@Author Roy
*/
    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            //獲取請求的ServletPath
        String servletPath=request.getServletPath();
        //檢查獲取的servletPath是否爲需要檢查的
        List<String>  urls= Arrays.asList(uncheckedUrls.split(","));
        if(urls.contains(servletPath)){
            filterChain.doFilter(request,response);
            return;
        }
        //從session中獲取sessionKey的值若只不存在重定向的redirectUrl
        Object user=request.getSession().getAttribute(sessionKey);
        if(user == null){
            response.sendRedirect(request.getContextPath()+redirectUrl);
            return;
        }
        //若存在允許訪問
        filterChain.doFilter(request,response);
    }
}

3.編碼過濾器

public class EncodingFilter extends HttpFilter {

    private  String encoding ;

    @Override
    protected void init() {
        encoding=getFilterConfig().getServletContext().getInitParameter("encoding");
    }
/**
*@ClassName EncodingFilter
*@Description 字符編碼過濾器
*@Param [request, response, filterChain]
*@Return void
*@Date 2020/2/29 11:44
*@Author Roy
*/
    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
filterChain.doFilter(request,response);
    }
}

4.緩存過濾器

public class NoCacheFilter extends HttpFilter {

/**
*@ClassName NoCacheFilter
*@Description 禁用緩存的filter
*@Param [request, response, filterChain]
*@Return void
*@Date 2020/2/29 11:36
*@Author Roy
*/
    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response,
                         FilterChain filterChain) throws IOException, ServletException {
        response.setDateHeader("Expires",-1);
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
        filterChain.doFilter(request,response);
    }
}

5.敏感詞過濾

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(" 敏感詞")){
            val=val.replace("敏感詞","****");
        }
        return val;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章