一. 介绍
Struts2中, 拦截器是重点, 具有aop思想;
springMVC中虽然也有拦截器, 但是被弱化了;
应用场景:
判断用户是否登录.
二. 入门
1. 自定义拦截器
需要实现HandlerInterceptor接口.
public class CustomInterceptor implements HandlerInterceptor{
/**
* 返回值: boolean false:不放行 true:放行
* preHandle方法: 最先执行
* 场景: 做一些初始化操作
* /
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception{
System.out.println("preHandle()执行了...");
}
/**
* postHandle方法: 执行完controller方法后执行
* 场景: 可以设置ModelAndView中的数据
* /
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception{
System.out.println("postHandle()执行了...");
}
/**
* afterCompletion方法: 最后执行
* 场景: 关闭资源
* /
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception{
System.out.println("afterCompletion()执行了...");
}
}
2. 加载自定义拦截器 — springMVC.xml
<!-- 加载自定义拦截器 -->
<mvc:interceptors>
<!-- 可配置多个拦截器, 谁在前谁先执行 -->
<mvc:interceptor>
<!-- 代表多级目录 /user/../queryUser.action-->
<mvc:mapping path="/*/**" />
<bean class="online.bendou.interceptor.CustomInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
三. 判断用户是否登录实现
1. 需求
加入购物车必须登录, 如果未登录, 跳转到登录页面.
2.实现
① 编写登录页
<form action="${pageContext.request.contextPath}/login.action" method="post">
账号:<input type="text" name="username" />
密码:<input type="password" name="password" />
<input type="submit" value="登录" />
</form>
② 编写登录Controller
@Controller
public class LoginController{
@RequestMapping("/login.action")
public String login(String username, HttpSession session){
session.setAttribute("username", username);
return "redirect:cart/queryCart.action";
}
}
③ 编写登录拦截器
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response) throws Exception{
// 1.登录操作时, 直接放行
String uri = request.getRequestURI();
if(uri.contains("/login.action")){
// 是登录操作
return true;
}
// 2.登录成功后, 放行
String username = (String) request.getSession().getAttribute("username");
if(username != null && !"".equals(username)){
// 已登录
return true;
}
//3. 其他情况, 不放行, 转发到登录页
request.getRequstDispatcher("/WEB-INF/login.jsp").forward(request, response);
return false;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception{
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception{
}
}
④ 配置拦截器
<!-- 加载自定义的拦截器 -->
<mvc:interceptors>
<!-- 可配置多个拦截器, 谁在前谁先执行 -->
<mvc:interceptor>
<!-- 代表多级目录 /user/../queryUser.action-->
<mvc:mapping path="/*/**" />
<bean class="online.bendou.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>