2 u012161773 u012161773 于 2016.03.13 22:55 提问

filter如何对静态资源.css/.js/.jpg不进行过滤 1C

web.xml中filter配置

 <filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>com.cbt.Interceptor.LoginFilter</filter-class>
        <init-param>
            <param-name>loginPage</param-name>
            <param-value>main_login</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

springmvc中的配置

 <mvc:resources location="/WEB-INF/css/" mapping="/css/**" />
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

登录页面中引入的js跟css都被拦截了.
如果web.xml中更改filter的
/*为*.do
这样的话就只对.do结尾的请求进行拦截.自然就不会对静态资源进行过滤了

但是设置成/*就没办法对js跟CSS还有图片不进行过滤了吗?
不要说在filter代码里写.我想知道具体配置.跪求大神.
菊花献上.谢谢哒~~

最后1C币了.有木有大神呐...

8个回答

qq_20039385
qq_20039385   2016.03.14 09:01

把你的静态资源放在WEB-INF外面。不是过滤器的问题,你的配置没有问题。

 <mvc:resources location="/img/" mapping="/wap/img/**"/>
    <mvc:resources location="/css/" mapping="/wap/css/**"/>
    <mvc:resources location="/js/" mapping="/wap/css/**"/>
u012161773
u012161773 我尝试了一下.filter还是会过滤这些静态资源,楼下是我的代码,还请指点一下.
接近 2 年之前 回复
u012161773
u012161773   2016.03.14 12:41

jsp中的引用


 <link rel="stylesheet" type="text/css" href="js/easyui/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="js/easyui/themes/icon.css" />
<link rel="stylesheet" type="text/css" href="js/easyui/demo/demo.css" />
<script type="text/javascript" src="js/easyui/jquery.min.js"></script>
<script type="text/javascript" src="js/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="js/easyui/locale/easyui-lang-zh_CN.js"></script>

springmvc的配置

 <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/js/" mapping="/js/**" />

web.xml配置

 <filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>com.cbt.Interceptor.LoginFilter</filter-class>
        <init-param>
            <param-name>loginPage</param-name>
            <param-value>main_login</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

filter中的代码

 String value = jedisClient.get("key1");
        //如果不是请问登录页面
        if (!"/main_login".equals(uri)) {
            //没有登录
            if (value == null) {
                httpServletResponse.sendRedirect("http://localhost:8080/" + loginPage);
                return;
            }
        }
        chain.doFilter(request, response);

css跟js还有静态资源都是跟web-inf平级的,没有放web-inf下

百思不得解

qq_20039385
qq_20039385   2016.03.14 12:45

把静态资源目录结构截图来看看

u012161773
u012161773 目录结构在楼下
接近 2 年之前 回复
u012161773
u012161773   2016.03.14 13:03

目录如下:
图片说明

u011489205
u011489205   2016.03.14 19:16

filter过滤掉了,uri考虑的不是很全面,需要针对静态文件路径不做拦截处理,现在的代码似乎全当做没有登录处理了,你可以查看浏览器控制台是否对每个
resource的请求,response都是登录页面,你可以查看下。

qq_20039385
qq_20039385   2016.03.14 19:45

改了静态文件的目录,引用的地方的路径有没有改,还有打印下这个值String value = jedisClient.get("key1"),看下是不是不被过滤了。

qq_36235112
qq_36235112   2017.02.17 15:40

是因为你的过滤器对css.js进行了过滤,在web.xml里面配过滤器的时候可以 可以在url上加上 .do 什么的。。
<!-- 登陆过滤器 -->

LoginFilter
com.gcl.energy.filter.LoginFilter


LoginFilter
.do

    过滤器实现类  只对*.do的请求过滤...   
          if (uri.indexOf("do") != -1) {
        // 是否过滤
        boolean doFilter = true;
        for (String s : notFilter) {
            if (uri.indexOf(s) != -1) {
                // 如果uri中包含不过滤的uri,则不进行过滤
                doFilter = false;

// if(uri.endsWith("gclweb/main.do")){
// doFilter = true;
// }
break;
}
}
if (doFilter) {
// 执行过滤
System.out.println("---执行过滤器----");
// 从session中获取登录者实体
Object obj = request.getSession().getAttribute("userName");
if (null == obj) {
// 如果session中不存在登录者实体,则弹出框提示重新登录
// 设置request和response的字符集,防止乱码
System.out.println("session不存在");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

                response.sendRedirect("/energy-smart/gclweb/login.do");
            } else {
                System.out.println("session存在");
                // 如果session中存在登录者实体,则继续
                filterChain.doFilter(request, response);
            }
        } else {
            // 如果不执行过滤,则继续
            System.out.println("不执行过滤");
            filterChain.doFilter(request, response);
        }
    } else {
        // 如果uri中不包含do,则继续
        System.out.println("不执行过滤");
        filterChain.doFilter(request, response);
    }
xiaolong9870
xiaolong9870   2017.12.05 23:59

如果确定URI是不包含后缀,则可以在过滤器里加一句代码将静态资源请求不过滤:
if(request.getRequestURI().indexOf(".") > 0) return;

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!