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;
}
}