SpringMVC 拦截器概述:
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
1.、要使用拦截器,第一步就必须要引入SpringMVC相关的Jar文件,同时还需要引入aopalliance.jar文件;
2、定义拦截器类:SessionTimeOutInterceptor,具体如下:
第一步:配置web.xml
<!-- 匹配置Session超时时间,单位分钟 -->
<session-config>
<session-timeout>10</session-timeout>
</session-config>
第二步:配置Spring-mvc.xml
<!-- 定义拦截器 -->
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**" />
<bean class="com.kedacom.ies.web.interceptor.SessionTimeOutInterceptor">
<!-- 过滤拦截的url,包括一些静态资源 -->
<property name="excludedUrls">
<list>
<value>/login</value>
<value>/logout</value>
<value>/loginUser</value>
<value>/property/get</value>
<value>/js/</value>
<value>/css/</value>
<value>/files/</value>
<value>/images/</value>
<value>/map/</value>
</list>
</property>
</bean>
</mvc:interceptor>
第三部:编写SessionTimeOutInterceptor中的拦截方法
package com.kedacom.ies.web.interceptor;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.kedacom.webcommon.domain.User;
import com.kedacom.webcommon.util.session.HttpSessionManager;
/**
* Session超时过滤器
*
* @author HuangHua
* @Date 2017-12-8下午3:42:19
*/
public class SessionTimeOutInterceptor implements HandlerInterceptor {
private static Logger log = Logger.getLogger(SessionTimeOutInterceptor.class);
/**
* 过滤拦截的url
*/
private List<String> excludedUrls;
/**
* 在DispatcherServlet完全处理完请求后被调用
* 当拦截器抛出异常时,依然会从当前拦截器往回执行所的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception)
throws Exception {
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 在业务处理器处理请求之前被调用
* 如果返回false 则退出本拦截器,本拦截器后面的postHandle与afterCompletion不再执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
String requestUri = request.getRequestURI();
for (String url : excludedUrls) {
if (requestUri.contains(url)) {
return true;
}
}
HttpSession session = request.getSession();
User user = HttpSessionManager.getUser(session);
if(user == null){
log.info("Pedirect to login page");
// System.out.println("\n-----Session会话超时,请重新登录-----\n");
String url = request.getContextPath() + "/login.html";
// System.out.println("url=" + url);
response.sendRedirect(url);
return false;
} else {
// System.out.println("\n-----允许通过的URL:" + requestUri + "-----\n");
return true;
}
}
public List<String> getExcludedUrls() {
return excludedUrls;
}
public void setExcludedUrls(List<String> excludedUrls) {
this.excludedUrls = excludedUrls;
}
}