在学了springmvc之后用它和spring和mybatis和maven一起做个小项目的时候用到了springmvc中的拦截器,当时学的时候没总结,今天来总结一下。
Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口 。
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对 请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去 进行处理,则返回true;如果程序员决定不需要再调用其他的组件 去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对 用户请求request进行处理。
afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
执行顺序:
FirstInterceptor#preHandle----->HandleAdapter#Handle----->FirstInterceptor#postHandle
----->FirstInterceptor#afterCompletion----->DispatcherServlet#render
我自己自定义了一个UserInterceptors
package com.yc.votesystem.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class UserInterceptors implements HandlerInterceptor{
private final String USERSESSION ="usersession";
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion被调用");
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object obj, ModelAndView arg3) throws Exception {
System.out.println("postHandle被调用");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object obj) throws Exception {
Object sessionObj = request.getSession().getAttribute(USERSESSION);
System.out.println("preHandle被调用");
if(sessionObj!=null){
System.out.println("进入这里");
return true;
}
response.sendRedirect("/SSMVote/user/login");
return false;
}
}
<!--拦截所有的资源-->
<!--<bean class="com.yc.votesystem.interceptors.UserInterceptors"></bean>-->
<!--拦截指定资源-->
<mvc:interceptor>
<mvc:mapping path="/vote/*"/> <!-- 管理员登录拦截 -->
<mvc:exclude-mapping path="/user/login"/><!-- 不拦截的 -->
<bean class="com.yc.votesystem.interceptors.UserInterceptors"></bean>
</mvc:interceptor>
</mvc:interceptors>
这样就可以对我的vote下所有的请求进行拦截,如果没有登录的话就会跳到登录界面。