java 中Filter过滤器过滤了CSS

  filter简介

Filter也称之为过滤器,WEB开发人员通过Filter技术,对web
服务器管理的所有web资源:
- 例如Jsp, Servlet,静态图片文件或静态html文件等进行拦截从而实现一些特殊的功能。
- 例如实现URL级别的++权限访问控制++、过滤敏感词汇、++压缩响应信息++等一些高级功能。

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
 

找了这个bug一天:

过滤器详细代码:

 /**
     * @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());
        

        /*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;
        
        
    }

解决方法:

查看控制台(F12),在网络中明明已经出现了需要的common.css和main.css文件

查看请求到的CSS文件的请求头时发现这些CSS文件返回的类型都是text/html类型。 

以下是我修改过的代码:

/**
     * @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");
        
        
        req.setCharacterEncoding("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());
        

        /*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;
        
        
    }

重点:

但这样并没有解决问题,还要在对应的jsp页面去掉<!DOCTYPE html>如图所示:

最后刷新一下浏览器就可以解决了。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
CSS、JS等静态文件进行放行可以通过配置服务器的过滤器(Filter)来实现。下面以常见的Java Web应用为例,说明如何配置过滤器对静态文件放行: 1. 创建一个实现了 `javax.servlet.Filter` 接口的过滤器类,例如命名为 `StaticResourceFilter`。 ```java import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class StaticResourceFilter implements Filter { @Override public void init(FilterConfig filterConfig) { // 初始化方法,可留空 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; // 设置允许访问静态资源的响应头 httpResponse.setHeader("Access-Control-Allow-Origin", "*"); chain.doFilter(request, response); } @Override public void destroy() { // 销毁方法,可留空 } } ``` 2. 在应用的 `web.xml`(或者使用注解方式)配置该过滤器。 ```xml <filter> <filter-name>StaticResourceFilter</filter-name> <filter-class>com.example.StaticResourceFilter</filter-class> </filter> <filter-mapping> <filter-name>StaticResourceFilter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>StaticResourceFilter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> ``` 上述配置,`<url-pattern>` 指定了要拦截的URL模式,这里使用通配符 `*.css` 和 `*.js` 分别匹配CSS和JS文件。`<filter-class>` 指定了过滤器类的完整类名。 这样配置后,对于以 `.css` 和 `.js` 结尾的请求,过滤器会添加一个允许访问静态资源的响应头 `Access-Control-Allow-Origin: *`,从而实现对这些静态文件的放行。 请根据具体的开发环境和需求进行适当调整和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值