springmvc 拦截器拦截静态资源
2016-09-13 15:53
405 查看
springmvc拦截器interceptors
springmvc拦截器能够对请求的资源路径进行拦截,极大的简化了拦截器的书写。但是,千万千万要注意一点:静态资源的放行。上代码:
<span style="white-space:pre"> </span>...
<span style="white-space:pre"> </span><mvc:resources mapping="/resources/**" location="/static/resources" /> <mvc:resources mapping="/static/css/**" location="/static/css/" /> <mvc:resources mapping="/static/images/**" location="/static/images/" /> <mvc:resources mapping="/static/js/**" location="/static/js/" />
<span style="white-space:pre"> </span>...
<pre name="code" class="cpp"><span style="white-space:pre"> </span><mvc:interceptors> <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 <bean class="com.myTree.interceptor.LoginInterceptor" />--> <mvc:interceptor> <mvc:mapping path="/**" /> <!-- 需排除拦截的地址 --> <span style="white-space:pre"> </span><mvc:exclude-mapping path="/Login"/> <span style="white-space:pre"> </span><mvc:exclude-mapping path="/login"/> <span style="white-space:pre"> </span><mvc:exclude-mapping path="/sattic/**"/> <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 --> <beans:bean class="com.myTree.interceptor.LoginInterceptor" > </beans:bean> </mvc:interceptor> </mvc:interceptors>
...
问题来了,在请求jsp页面的时候,你的静态资源的访问仍然会被自定义拦截器拦截,这会导致程序运行的效率大大下降,还会不停的跳转到拦截器的逻辑。主要原因是
<mvc:mapping path="/**" />会对所有的请求资源进行拦截,虽然静态资源已经排除了,但还是会被拦截到。
如何解决这个bug呢?
主要有三种方式:
1、修改请求的url地址。
如果请求的url地址都是以*.do结尾,那么拦截器中的配置可以变为拦截以do结尾的资源,静态资源自然就不会被拦截到了;
2、在自定义拦截器中对资源进行判断,如果满足需要排除的资源,就进行放行。
<!-- 拦截器配置 -->
<mvc:interceptors>
<!-- session超时 -->
<mvc:interceptor>
<mvc:mapping path="/*/*"/>
<bean class="<span style="font-family: FangSong_GB2312;">com.myTree.interceptor.LoginInterceptor</span><span style="font-family: FangSong_GB2312;">"> </span>
<property name="allowUrls">
<list>
<!-- 如果请求中包含以下路径,则不进行拦截 -->
<value>/login</value>
<value>/js</value>
<value>/css</value>
<value>/image</value>
<value>/images</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
...
在拦截器中设定不拦截的属性:
<pre name="code" class="java">/** * 处理登录拦截器 */ public class LoginInterceptor implements HandlerInterceptor{ public String[] allowUrls;//还没发现可以直接配置不拦截的资源,所以在代码里面来排除 public void setAllowUrls(String[] allowUrls) { this.allowUrls = allowUrls; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {<pre name="code" class="java"> <span style="white-space:pre"> </span>String requestUrl = request.getRequestURI().replace(request.getContextPath(), ""); System.out.println(requestUrl); if(null != allowUrls && allowUrls.length>=1){ for(String url : allowUrls) { if(requestUrl.contains(url)) { return true; } }
}
...
3、设置web.xml中的默认拦截器,不拦截静态资源
在springmvc的Dispatcher中配置<mvc:default-servlet-handler />(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件,在web.xml里配置如下代码即可:)
<!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -->
<!-- 不拦截静态文件 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/js/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/images/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
</servlet-mapping>
相关文章推荐
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式方法
- SpringMVC 拦截器不拦截静态资源的三种处理方式方法
- 防止SpringMVC拦截器拦截js等静态资源文件
- 详解springmvc拦截器拦截静态资源
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- 防止SpringMVC拦截器拦截js等静态资源文件
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- 防止SpringMVC拦截器拦截js等静态资源文件的解决方法
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式方法
- 定义不被SpringMVC拦截的静态资源(html, js, css等文件),通用方法,不需要每个目录都设置
- SpringMVC防止静态资源拦截
- SpringMVC配置静态资源不拦截
- 【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置
- SpringMVC中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等