首先web.xml配置
<!-- spring-mvc --><servlet><servlet-name>springServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springServlet</servlet-name><url-pattern>/</url-pattern></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
<!-- 對url進行簡單的過濾 --><filter><filter-name>servletRequest</filter-name><filter-class>cn.tomcat.quickstart.common.filter.ServletRequestFilter</filter-class></filter><filter-mapping><filter-name>servletRequest</filter-name><url-pattern>/*</url-pattern></filter-mapping>ServletRequestFilter.javaimport java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.filter.OncePerRequestFilter;/*** * 對進來的url進行處理,放在filter最前面,springmvc <url-pattern>/</url-pattern>* 默認攔截所有請求,ex:a/b/c.do,a/b/c.html,a/b/c.action,a/b/c* 去掉帶后綴的訪問,模仿restful風格,只接受a/b/c的請求* */public class ServletRequestFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String requestPath = request.getServletPath();//不用擔心會把靜態文件給攔截了,例如*.js,*.css類似于這樣的,在web.xml做處理了//所有請求帶有后綴【.】的直接去404,不接受這樣的請求if(requestPath.lastIndexOf(".")!=-1){request.getRequestDispatcher("/WEB-INF/pages/error/404.jsp").forward(request, response);}else{filterChain.doFilter(request, response);}}}帶有.結尾的直接go 404,哈哈,也許你會問要是這樣靜態文件不是也會被過濾掉了嗎?類似于*.js,*.css,.....N多這樣類型的文件
新聞熱點
疑難解答