知識點彙總
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;
}
}