Java設置Filter過濾了CSS等靜態文件的問題

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類型。 

這是我在網上查找方法時參考的博客:

原因:

我出現的問題應該是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
	}

}

現在出現了我需要的結果:

 

 

 

 

 

 

一起學習,一起進步 -.- ,如有錯誤,可以發評論

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