作者:tonytfjing + Java兔
SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。 所以我们现在web.xml中加入以下配置:
<servlet>
<servlet-name>demoservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-mvc.xmlparam-value>
init-param>
<load-on-startup>2load-on-startup>
<async-supported>trueasync-supported>
servlet>
<servlet-mapping>
<servlet-name>demoservlet-name>
<url-pattern>*.dourl-pattern>
servlet-mapping>
一般实现拦截器主要是为了权限管理,主要是拦截一些url请求,所以不对静态资源进行拦截。要过滤掉静态资源可以在spring-mvc.xml配置文件中这样配置:
<mvc:resources mapping="/resources/**" location="/resources/" cache-period="300" />
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。
所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/resources/**"/>
<bean class="com.wx.app.ygp.action.interceptor.LoginInterceptor">bean>
mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/resources/**"/>
<bean class="**com.wx.app.ygp.action.interceptor.MessageInterceptor**">bean>
mvc:interceptor>
mvc:interceptors>
package com.wx.app.ygp.action.interceptor;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
*
* @author huangjp
* @Descripition : 短信验证拦截器
* 2017年6月22日 下午1:11:11
*/
public class MessageInterceptor extends HandlerInterceptorAdapter{
/**
* 需要拦截的URL
*/
private static final String[] INTERCEPTOR_URL = {
"/icCard/workCard.do?menuId=97",
"/billManagement/counterPayment/show.do?menuId=2003",
"/icCard/dailyBusiness.do?menuId=95",
"/icCard/exceptionBusiness.do?menuId=96"
};
private static final String MESSAGE_URL = "/message/show.do";
private final Logger logger = Logger.getLogger(MessageInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取当前请求url:http://localhost:8080/ygp/icCard/workCard.do
String url = request.getRequestURL().toString();
String message = request.getParameter("message");
//如果是需要短信验证的页面,则先跳转到短信验证页面
for(String oneUrl : INTERCEPTOR_URL){
if(url.contains(oneUrl.split("[?]")[0]) && message == null){
logger.info("该页面需要短信验证");
fowardMessage(request, response, oneUrl);
return false;
}
}
logger.info("该页面不需要短信验证");
return true;
}
/**
* 跳转到短信验证页面
* @param : menuUrl
* @throws IOException
* @throws ServletException
*/
private void fowardMessage(HttpServletRequest request,HttpServletResponse response, String menuUrl) throws ServletException, IOException{
RequestDispatcher rd = request.getRequestDispatcher(MESSAGE_URL+"?menuUrl="+menuUrl);
rd.forward(request, response);
}
}
这样,就完成了一个简单的自定义拦截器。
http://blog.csdn.net/tonytfjing/article/details/39207551
http://blog.csdn.net/liumm0000/article/details/7565480
http://hc24.iteye.com/blog/2063660