在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Springmvc restful配置遇到的小坑

2016-12-20 13:16| 发布者: zhangjf| 查看: 564| 评论: 0

摘要: 首先web.xml配置 !-- spring-mvc -- servlet servlet-namespringServlet/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLoc ...

首先web.xml配置

  1. <!-- spring-mvc -->
  2. <servlet>
  3. <servlet-name>springServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <init-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>classpath:springmvc-servlet.xml</param-value>
  8. </init-param>
  9. <load-on-startup>1</load-on-startup>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>springServlet</servlet-name>
  13. <url-pattern>/</url-pattern>
  14. </servlet-mapping>
复制代码

url-pattern 配置/即可,如果配置/*的话会出问提,连返回视图jsp也会拦截,具体原因请看翻看源码

问提:这样配置的话,大家都会忽略一个问题,就是a/b/c可以访问,但是a/b/c.do;a/b/c.mm;a/b/c.zz都可以访问a/b/c的controller,在不修改源码源码的情况下,我们来

解决这个问题,虽然都是拦截了/这样的请求,但是我们只让a/b/c这样的请求进入controller,带有【.】的后缀的不让他进入,直接去404页面

解决办法:

web.xml加入filte

  1. <!-- 对url进行简单的过滤 -->
  2. <filter>
  3. <filter-name>servletRequest</filter-name>
  4. <filter-class>cn.tomcat.quickstart.common.filter.ServletRequestFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>servletRequest</filter-name>
  8. <url-pattern>/*</url-pattern>
  9. </filter-mapping>
  10. ServletRequestFilter.java
  11. import java.io.IOException;
  12. import javax.servlet.FilterChain;
  13. import javax.servlet.ServletException;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. import org.springframework.web.filter.OncePerRequestFilter;
  17. /**
  18. *
  19. * 对进来的url进行处理,放在filter最前面,springmvc <url-pattern>/</url-pattern>
  20. * 默认拦截所有请求,ex:a/b/c.do,a/b/c.html,a/b/c.action,a/b/c
  21. * 去掉带后缀的访问,模仿restful风格,只接受a/b/c的请求
  22. *
  23. */
  24. public class ServletRequestFilter extends OncePerRequestFilter {
  25. @Override
  26. protected void doFilterInternal(HttpServletRequest request,
  27. HttpServletResponse response, FilterChain filterChain)
  28. throws ServletException, IOException {
  29. String requestPath = request.getServletPath();
  30. //不用担心会把静态文件给拦截了,例如*.js,*.css类似于这样的,在web.xml做处理了
  31. //所有请求带有后缀【.】的直接去404,不接受这样的请求
  32. if(requestPath.lastIndexOf(".")!=-1){
  33. request.getRequestDispatcher("/WEB-INF/pages/error/404.jsp").forward(request, response);
  34. }else{
  35. filterChain.doFilter(request, response);
  36. }
  37. }
  38. }
复制代码

带有.结尾的直接go 404,哈哈,也许你会问要是这样静态文件不是也会被过滤掉了吗?类似于*.js,*.css,.....N多这样类型的文件

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 18:40

Copyright 2015-2025 djqfx

返回顶部