参考博文:https://blog.csdn.net/u013905744/article/details/78335001
对于springmvc,有两种方式配置拦截器。
一是实现HandlerInterceptor接口,如:
public class MyInterceptor1 implements HandlerInterceptor {
//该方法在action执行前执行,可以实现对数据的预处理,
// 比如:编码、安全控制等。如果方法返回true,则继续执行action。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
Exception {
System.out.println("MyInterceptor1 action之前执行!!!");
return true; //继续执行action
}
该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView
modelAndView) throws Exception {
System.out.println("MyInterceptor1 action执行之后,生成视图之前执行!!");
}
//最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。
//因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor1 最后执行!!!一般用于释放资源!!");
}
}
二是extendsHandlerInterceptorAdapter类,如:
public class MyInterceptor2 extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
Exception {
System.out.println("MyInterceptor2.preHandle()");
return true; //继续执行action
}
}
对于控制器url的拦截,分为如下3种情况:
1. 拦截所有的url
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--这样配置,将拦截所有springmvc的url-->
<bean class="interceptor.MyInterceptor1">
</bean>
</mvc:interceptor>
2. 对于所有指定url放行
<!--配置拦截器-->
<!--这样配置,将拦截访问springmvc指定路径下的url-->
<mvc:interceptor>
<mvc:mapping path="/emp/*"/>
<bean class="interceptor.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
3. 对于所有的url,exceptUrls外放行
比如我们常见的LoginInterceptor
方法:在拦截器里注入一个属性List<String> exceptUrls
<!--配置拦截器 拦截除了exceptUrls内的所有请求-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.zih.interceptor.LoginInteceptor">
<!-- 配置放行的请求 -->
<property name="exceptUrls">
<list>
<value>/captcha</value>
<value>/test</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
我使用的是这种方式,拦截一部分,放行一部分:
public class LoginInteceptor implements HandlerInterceptor{
private List<String> exceptUrls;
public List<String> getExceptUrls() {
return exceptUrls;
}
public void setExceptUrls(List<String> exceptUrls) {
this.exceptUrls = exceptUrls;
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("-----------------开始拦截-----------------");
String requestUri = request.getRequestURI();
if(requestUri.startsWith(request.getContextPath())){
requestUri = requestUri.substring(request.getContextPath().length(), requestUri.length());
}
//放行exceptUrls中配置的url
for (String url:exceptUrls) {
if(url.endsWith("/**")){
if (requestUri.startsWith(url.substring(0, url.length() - 3))) {
System.out.println("放行的url。。。。");
return true;
}
} else if (requestUri.startsWith(url)) {
System.out.println("放行的url");
return true;
}
}
HttpSession session=request.getSession();
String url=request.getRequestURL().toString();
System.out.println(url);
Admin admin=(Admin) session.getAttribute("admin");
if(admin != null){
if(url.endsWith("login.do")){
System.out.println("注销登录");
request.getSession().removeAttribute("admin");//清空session信息
request.getSession().invalidate();//清除 session 中的所有信息
//session.removeAttribute("user");
//resp.sendRedirect("/Web/index.jsp");
request.getRequestDispatcher("/login.do").forward(request, response);
return true;
}
System.out.println("已登录,放行");
return true;
}
else{
if(url.endsWith("login.do")||url.endsWith("login.jsp")){
System.out.println("正常放行");
return true;
}
System.out.println("未登录,拦截");
// resp.sendRedirect("login.do");
request.getRequestDispatcher("/login.do").forward(request, response);
return true;
}
}
public void postHandle(HttpServletRequest req, HttpServletResponse resp,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("-----------------拦截结束-----------------");
}
public void afterCompletion(HttpServletRequest req,
HttpServletResponse resp, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
其他的方法,也类似
第一种:
<mvc:interceptors>
<bean id="allInterceptor" class="com.base.interceptor.AllInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/*/**" />
<bean id="CommonInterceptor" class="com.base.interceptor.CommonInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/dical/**"/> //拦截的url
<mvc:mapping path="/admin/**"/>//拦截的url
<mvc:exclude-mapping path="/admin/login"/> //不拦截的url
<mvc:exclude-mapping path="/admin/main"/>//不拦截的url
<bean id="DicalInterceptor" class="com.base.interceptor.DicalInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
第二种:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/bank/modifCode/**"/>
<mvc:exclude-mapping path="/bank/tialize/**"/>
<mvc:exclude-mapping path="/bank/**"/>
<bean class="com.intercr.MthoduestIneptor" />
</mvc:interceptor>
</mvc:interceptors>