第一步:写拦截器类
创建一个类:LoginInterceptor,派生自HandlerInterceptor。
当用户登录后我们会写sesion,拦截请求,如果此时session中找不到此用户,则跳转到登录页面。
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
User user = (User)request.getSession().getAttribute("user");
if (user != null){
return true;
}else{
System.out.println(request.getContextPath());
response.sendRedirect(request.getContextPath()+"/login");
}
return false;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion");
}
}
注:当请求过来时,首先进入preHandle方法拦截,在里面进行判断,之后可以选择进行页面跳转或者不跳转。
而return false;表示当前请求被拦截,不会再触发controller了,因此不会显示原页面。
Return true;表示此次拦截通过,最后会进入到afterCompletion方法。
在login目录下创建一个login.jsp,将在controller中增加login转jsp的代码。
@Controller
public class indexController {
@RequestMapping(value = "/login")
public String login(HttpServletRequest request, HttpServletResponse response) {
return "login/login";
}
}
第二步:配置
在springMVC-servlet.xml配置内容如下:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<bean class="com.gary.util.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
其中/**表示所有请求都会被拦截,也可以配置某一类被拦截,如/user/**,而路径中有user的走此拦截器。
如果是多个拦截器,则在这里写多个<mvc:interceptor>,配置不同的路径进入不同的拦截器类,并按在此的前后顺序依此进入拦截器。
测试:
在页面中输入http://localhost:8080/firstSpringMVC/user/addUser
结果不是弹出添加用户界面,而是弹出登录页面。