1、自定义拦截器,实现HandlerIterceptor接口
package cn.zzsxt.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import cn.zzsxt.entity.Userinfo;
/**
* 用户登陆的访问权限控制
* @author Think
*
*/
public class LoginIntercetor implements HandlerInterceptor {
/**
* 在控制器方法调用前执行
* 返回值为是否中断
* true,表示继续执行(下一个拦截器或处理器)
* false则会中断后续的所有操作,所以我们需要使用response来继续响应后续请求
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
System.out.println("LoginInterceptor...preHandle");
//获取session
HttpSession session = request.getSession();
Userinfo user = (Userinfo)session.getAttribute("loginUser");
if(user!=null){
//登陆用户
return true;
}else{
String path=request.getServletContext().getContextPath();
System.out.println("path="+path);
response.sendRedirect(path+"/login.jsp");
return false;
}
}
/**
* 在控制器方法调用后,解析视图前调用,我们可以对视图和模型做进一步渲染或修改
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
}
/**
* 整个请求完成,即视图渲染结束后调用,这个时候可以做些资源清理工作,或日志记录
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
}
2、配置springmvc.xml
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/login"/>
<bean class="cn.zzsxt.interceptor.LoginIntercetor"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>