Filter簡介
在Java程序當中我們可以設置filter過濾器,filter過濾器是Servlet技術中最實用的技術,Web開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞彙、壓縮響應信息等一些高級功能。
Filter功能
在HttpServletRequest到達 Servlet 之前,攔截客戶的HttpServletRequest 。根據需要檢查HttpServletRequest,也可以修改HttpServletRequest 頭和數據。
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse 。根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。
Filter接口中有一個doFilter方法,我們可以使用這個方法去攔截web資源,Web服務器每次在調用web資源的service方法之前,都會先調用一下filter的doFilter方法。
問題
但是當我使用filter攔截/*的url時,jsp文件文件是使用link外部導入css文件的方式去設置頁面的格式。但是當我運行程序之後並沒有出現CSS寫好的樣式。出現Resource interpreted as Stylesheet but transferred with MIME type text/html
我的代碼:
@WebFilter("/manage/*")
public class AdminLogin implements Filter {
/**
* Default constructor.
*/
public AdminLogin() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
String flag = (String)session.getAttribute("isAdminLogin");
String request_uri = req.getRequestURI();
String ctxPath= req.getContextPath();
String uri= request_uri.substring(ctxPath.length());
// System.out.println(request_uri+"##"+ctxPath+"##"+uri+"##"+flag);
if(uri.contains("admin_")){
if(flag !=null && flag.equals("1")) {
chain.doFilter(req, resp);
}else{
PrintWriter out = resp.getWriter();
out.write("<script>");
out.write("alert('請先登錄!');");
out.write("location.href='login.jsp';");
out.write("</script>");
out.close();
return;
}
}else{
chain.doFilter(req, resp);
}
return;
//不通過則直接return
// pass the request along the filter chain
// chain.doFilter(req, resp); // 通過則使用這條語句
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
問題解決
我去查看了控制檯(F12),在網絡中明明已經出現了需要的common.css和main.css文件,但是頁面卻沒有使用。並且下面出現了Resource interpreted as Stylesheet but transferred with MIME type text/html:代碼警告。
我在查看請求到的CSS文件的請求頭時發現這些CSS文件返回的類型都是text/html類型。
這是我在網上查找方法時參考的博客:
- https://www.cnblogs.com/StevenZheng/p/10797887.html
- https://www.cnblogs.com/ermeng/p/6440966.html
- https://blog.csdn.net/sky_cui/article/details/86703706
- https://www.cnblogs.com/zhenmingliu/p/3522731.html
原因:
我出現的問題應該是filter進行攔截時將js,css,jpg等外部導入的靜態文件也進行了攔截,並且在filter中使用/*攔截,而且使用了response.setContentType("text/html;charset=utf-8")去將文件類型度修改成了text/html的原因。
所以我修改過的代碼如下:
@WebFilter("/manage/*")
public class AdminLogin implements Filter {
/**
* Default constructor.
*/
public AdminLogin() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
req.setCharacterEncoding("UTF-8");
/*這裏設置response的類型我刪除了*/
/*resp.setContentType("text/html;charset=utf-8");*/
resp.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
String flag = (String)session.getAttribute("isAdminLogin");
String request_uri = req.getRequestURI();
String ctxPath= req.getContextPath();
String uri= request_uri.substring(ctxPath.length());
// System.out.println(request_uri+"##"+ctxPath+"##"+uri+"##"+flag);
/*這裏我增加了url判斷,對靜態文件直接放行*/
if(request_uri.toString().contains(".css") || request_uri.toString().contains(".js") || request_uri.toString().contains(".png")|| request_uri.toString().contains(".do")){
//如果發現是css或者js文件,直接放行
chain.doFilter(req, resp);
}else {
if(uri.contains("admin_")){
if(flag !=null && flag.equals("1")) {
chain.doFilter(req, resp);
}else{
PrintWriter out = resp.getWriter();
out.write("<script>");
out.write("alert('請先登錄!');");
out.write("location.href='login.jsp';");
out.write("</script>");
out.close();
return;
}
}else{
chain.doFilter(req, resp);
}
}
return;
//不通過則直接return
// pass the request along the filter chain
// chain.doFilter(req, resp); // 通過則使用這條語句
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
現在出現了我需要的結果:
一起學習,一起進步 -.- ,如有錯誤,可以發評論