1. 先说说一种比较常见的:

    <servlet>
<servlet-name>theDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>theDispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>

让SpringMVC只拦截动态请求,js、css、img等静态资源不经过Spring,直接让Web容器处理。如果配置了拦截器,也只会拦截.html动态请求。

静态资源不走Spring,也不走拦截器,性能当然是比较好的。如果使用了Nginx,配置静态资源拦截,让Nginx处理静态资源的访问。

因为Nginx在处理静态资源方面,比Tomcat等Web容器要强。

缺点:这种拦截动态请求的方法,比较死板。

2.  我自己经常有一种需求,http://FansUnion.cn/news 这种不指定.html后缀的其实也是动态请求,所以我在配置url-pattern喜欢用“/”,即拦截所有的请求。

URL是可以灵活配置了,问题又来了,静态资源不再由Tomcat处理,所以必须在SpringMVC中再次配置

<mvc:resources mapping="/static/**" location="/static/" />

让SpringMVC把static静态资源也处理了。显然,让SpringMVC处理静态资源的性能没有Tomcat直接处理比较高。

理论上,请求中转的次数越多, 性能越差。

本以为万事大吉,虽然静态资源的性能较低,至少程序可以正常运行了,“反正是混过去了”。

进一步的需求,如果在Spring中配置了登录等拦截器,这个时候也会把 静态资源给拦截进来。

<mvc:resources mapping="/static/**" location="/static/" />

这种URL映射,也无法逃脱拦截器的魔爪。

 
我是怎么发现这个问题的呢?

public class BaseLoginInterceptor extends HandlerInterceptorAdapter { 

    public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { LoginUtil.setCurrentUser(null);
initCurrentUser(request, response);
HandlerMethod handlerMethod = (HandlerMethod) handler;
}
}

公司的项目,Boss的登录拦截器配置如上,“HandlerMethod handlerMethod = (HandlerMethod) handler;”。但是我在自己的项目中,发现这行代码是有问题的。

如果静态资源被拦截到,会报错:

java.lang.ClassCastException: org.springframework.web.servlet.resource.ResourceHttpRequestHandler 
cannot be cast to org.springframework.web.method.HandlerMethod

通过异常可以发现,Object handler是 ResourceHttpRequestHandler,而不是HandlerMethod。

因为mvc:resources把静态资源请求交给了 ResourceHttpRequestHandler 处理,因此强制转换是有问题的。

公司项目中Boss的配置之所以没有出现问题,是因为他配置的是只拦截“.html” 动态请求,所以强制转换总是成立的。

---------------------------------------------

我们分析了上述两种情况, 发现“根本矛盾”“根本需求”是啥?

1.动态请求的URL应该非常灵活,/news /news.html都应该算作动态请求。

2.SpringMVC的url-pattern可以配置 / , *.html,或者正则表达式,但是我不太喜欢用正则表达式。

3.如果可能,SpringMVC最好不要拦截静态资源,让Tomcat容器直接处理更好。

<mvc:resources mapping="/static/**" location="/static/" />

这是为了性能考虑。

4.如果线上服务器配置了Nginx,我可以选择让Nginx拦截静态请求,因为比Tomcat处理性能更高。

本地是否配置Nginx,都不需要改动任何代码。

-------------------------------------------------

上面说的 第一种方法的缺陷是,url配置不够灵活。

第二种方法的缺陷是,SpringMVC要拦截静态资源,而且登录拦截器 也会拦截 静态资源,不但性能差,程序还得再次修改,判断HandlerMethod的实际类型。

3.终极解决方案:

以我习惯用的第2种方法为基础,进一步改进:

去掉 <mvc:resources mapping="/static/**" location="/static/" />,不做静态资源请求的映射。

在web.xml里增加如下配置:

    <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

激活Tomcat的defaultServlet来处理静态文件。

这样 SpringMVC不再响应静态资源,登录拦截器也没有问题了。

SpringMVC,3种不同的URL路由配置方法的更多相关文章

  1. SpringMVC,3种不同的URL路由配置方法(这根本不是一个小问题)

    转载自:http://blog.csdn.net/fansunion/article/details/41149287?utm_source=tuicool&utm_medium=referr ...

  2. SpringMVC,3种不同的URL路由配置方法 [转]

    SpringMVC中配置URL拦截,非常简单.网上找个示例,就能通过.但是,在我做了好几个Web项目,又参与了别人主导的Web项目时,发现URL配置也非常有学问. 1. 先说说一种比较常见的: < ...

  3. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

  4. 3/19 Django框架 url路由配置及模板渲染

    3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...

  5. Django学习手册 - 正则URL路由配置/路由分发

    ############################################### 总结: 一.url路由配置: 方式一:(通过url链接get获取) 方式二:(url路由匹配方式获取-拓 ...

  6. 8.MVC框架开发(URL路由配置和URL路由传参空值处理)

    1.ASP.NET和MVC的路由请求处理 1)ASP.NET的处理 请求---------响应请求(HttpModule)--------处理请求(HttpHandler)--------把请求的资源 ...

  7. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  8. Django(一):url路由配置和模板渲染

    urls.py路由用法 url基本概念 url格式 urls.py的作用 url解析过程 include的作用 kwarg的作用 name的作用 URL概念 URL(Uniform Resoure L ...

  9. url路由配置以及渲染方式

    路由分配及模板渲染 路由系统 urlpatterns = [ path('admin/', admin.site.urls), path('teacher/',include('teacher.url ...

随机推荐

  1. Sql server 2008 中varbinary查询

    sqlserver2008中遇到一个坑爹的问题,使用以下语句添加的数据 insert into testtable ( username, password, productcode ) select ...

  2. jQuery LigerUI V1.2.3 (包括API和全部源码) 发布

    前言 这次版本主要是增加了Panel和Portal组件,并增加了一套皮肤,并解决了部分兼容性的问题,添加了几个功能点. 欢迎使用反馈. 相关链接 API:         http://api.lig ...

  3. 转载css的background-position

    这是一个有趣的话题 其实我并不确切的平时大家是怎么去应用或者玩转一个属性,一个值.我能肯定的是这些东西都有不少的可玩性. 我今天要聊的 background-position 应该已经被大家玩得色彩斑 ...

  4. SQL Server中cursor的使用步骤

    参考文章: http://www.cnblogs.com/knowledgesea/p/3699851.html http://www.cnblogs.com/moss_tan_jun/archive ...

  5. json字符串返回到js中乱码

    Ajax 的post请求值返回到js中时出现中文乱码的情况,但是在action中写入时并未乱码,解决办法在action中写入前,加上这两行: request.setCharacterEncoding( ...

  6. tar命令的使用

    tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c    //打包 -x    //解压 -f    //指定文件 ...

  7. 怎样用SQL语句查询一个数据库中的所有表?

    怎样用SQL语句查询一个数据库中的所有表?  --读取库中的所有表名 select name from sysobjects where xtype='u'--读取指定表的所有列名select nam ...

  8. 利用border-radious画图形

    今天才发现,border-radius可以画很多图形,下面跟我来看一下吧: 在设有宽和高的情况下画一个圆: #div1{ /*宽高相等,圆角范围为高或宽的一半或以上*/ background-colo ...

  9. iOS学习之观察者模式

    观察者模式: 观察者具体应用有两个:通知机制(notification)和KVO(key-value-observing)机制 通知机制: 谁要监听值的变化,谁就注册通知 ,特别要注意,通知的接受者必 ...

  10. iOS学习之SKTagView的使用

    SKTagView是一款支持自动布局的标签tag. 特性: -流式展示标签 -可以配置标签的颜色.事件.间隔.外边距等 -支持Auto layout -可以在UITableViewCell中良好展示 ...