详解springmvc拦截静态资源
springmvcinterceptors
springmvc能够对请求的资源路径进⾏拦截,极⼤的简化了的书写。但是,千万千万要注意⼀点:静态资源的放⾏。
上代码:
<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/" />
<mvc:interceptors>
<!-- 使⽤bean定义⼀个Interceptor,直接定义在mvc:interceptors根下⾯的Interceptor将拦截所有的请求
<bean class="Tree.interceptor.LoginInterceptor" />-->
<mvc:interceptor>
<mvc:mapping path="/**" />
<!-- 需排除拦截的地址 -->
<mvc:exclude-mapping path="/Login"/>
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/sattic/**"/>
<!-- 定义在mvc:interceptor下⾯的表⽰是对特定的请求才进⾏拦截的 -->
<beans:bean class="Tree.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="Tree.interceptor.LoginInterceptor">
<property name="allowUrls">
<list>
<!-- 如果请求中包含以下路径,则不进⾏拦截 -->
<value>/login</value>
<value>/js</value>
<value>/css</value>
<value>/image</value>springcloud和springboot
<value>/images</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
在中设定不拦截的属性:
/**
* 处理登录
*/
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 > </span>String requestUrl = RequestURI().ContextPath(), ""); System.out.println(requestUrl);
if(null != allowUrls && allowUrls.length>=1){
for(String url : allowUrls) {
ains(url)) {
return true;
}
}
}
3、设置l中的默认,不拦截静态资源
在springmvc的Dispatcher中配置<mvc:default-servlet-handler />(⼀般Web应⽤服务器默认的Servlet名称是"default",所以这⾥我们激活Tomcat的defaultServlet
来处理静态⽂件,在l⾥配置如下代码即可:)
<!--该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/⽬录,如原来访问localhost/foo.css,现在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>
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论