一、Web.xml配置
在Web.xml 配置Spring核心控制器DispatcherServlet接收所有請求
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
二、不攔截靜態資源
如果配置攔截類似於*.do格式的攔截規則,則對靜態資源的訪問是沒有問題的,但是如果配置攔截了所有的請求(如我們上面配置的“/”),就會造成js文件、css文件、圖片文件等靜態資源無法訪問。
攔截器的主要作用是是用於權限管理,攔截不合理的URL,所以不對靜態資源進行攔截
主要過濾方式有以下幾種:
方案一:使用<mvc:resources/> (mapping:請求,location:映射地址,注意必須是webapp根目錄下的路徑。)
spring配置文件:applicationContext-mvc.xml
<mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/images/**" location="/img/"/> <mvc:resources mapping="/js/**" location="/js/"/>
方案二:激活 Tomcat 的 defaultServlet 來處理靜態資源
web.xml
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/js/*</url-pattern> <url-pattern>*.css</url-pattern> <url-pattern>/images/*</url-pattern> </servlet-mapping>
三、編寫攔截器
SpringMVC的攔截器HandlerInterceptorAdapter對應提供了三個preHandle,postHandle,afterCompletion方法。
preHandle在業務處理器處理請求之前被調用。
postHandle在業務處理器處理請求執行完成后,生成視圖之前執行。
afterCompletion在DispatcherServlet完全處理完請求后被調用,可用於清理資源等 。
所以要想實現自己的權限管理邏輯,需要繼承HandlerInterceptorAdapter並重寫其三個方法。
package com.smallpig.web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.smallpig.entity.User; public class Login extends HandlerInterceptorAdapter{ private static final String[] IGNORE_URL = {"/login.jsp", "/regedit.jsp"}; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { boolean flag = false; String url = request.getRequestURL().toString();
//不攔截上面定義的路徑 for (String str : IGNORE_URL) { if (url.contains(str)) { flag = true; break; } } if (!flag) { User user = (User)request.getSession().getAttribute("users"); if (user != null)
flag = true;
else
response.sendRedirect("/login.jsp");
return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
四、配置攔截器
在applicationContext-mvc.xml中加入自己定義的攔截器
<!-- 攔截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller --> <mvc:mapping path="/**" /> <!-- 攔截器類 --> <bean class="com.smallpig.web.interceptor.LoginInterceptor"></bean> </mvc:interceptor> <!-- 當設置多個攔截器時,先按順序調用preHandle方法,然后逆序調用每個攔截器的postHandle和afterCompletion方法 --> </mvc:interceptors>