一. 单个拦截器执行流程
1. 创建一个拦截器类, 需要实现HandlerInterceptor接口
2. 在springmvc.xml里配置我们创建的拦截器
3. 拦截器preHandle方法, 在控制器方法执行前被执行。可以做一些登录拦截、权限认证等操作。
4. 拦截器preHandle方法, 返回true放行, false拦截。
5. 拦截器postHandle方法, 在控制器方法执行后, 返回ModelAndView之前被执行。设置或者清理页面共用参数等操作。
6. 拦截器afterCompletion方法, 在控制器方法执行后被执行。处理异常、记录日志等操作。
7. 拦截器放行的话, 执行流程
8. 拦截器拦截的话, 执行流程
二. 多个拦截器执行流程
1. 创建第二个拦截器类
2. 在springmvc.xml里配置多个拦截器
3. 多个拦截器的执行流程
4. 拦截器一拦截的话, 执行流程
5. 拦截器一放行, 拦截器二拦截的话, 执行流程
6. 在springmvc.xml里先配置拦截器二, 再配置拦截器一, 拦截器都放行的话执行方法顺序
三. 拦截器例子
1. 新建一个名为SpringMVCInterceptor的Web工程, 同时拷入相关jar包
2. 新建一个名为MyInterceptor.java的拦截器
package com.lywgames.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
// 在控制器方法执行前被执行。可以做一些登录拦截、权限认证等操作。
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
System.out.println("MyInterceptor.preHandle");
// 返回true放行, false拦截。
return true;
}
// 在控制器方法执行后, 返回ModelAndView之前被执行。设置或者清理页面共用参数等操作。
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView mav) throws Exception {
System.out.println("MyInterceptor.postHandle");
mav.addObject("name", "张三");
}
// 在控制器方法执行后被执行。处理异常、记录日志等操作。
@Override
public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception e) throws Exception {
System.out.println("MyInterceptor.afterCompletion");
}
}
3. 新建一个名为MyInterceptor2.java的拦截器
package com.lywgames.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
System.out.println("MyInterceptor2.preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView mav) throws Exception {
System.out.println("MyInterceptor2.postHandle");
}
@Override
public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception e) throws Exception {
System.out.println("MyInterceptor2.afterCompletion");
}
}
4. 新建一个名为InterceptorAction.java的控制器
package com.lywgames.web.action;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class InterceptorAction {
@RequestMapping("interceptor")
public String interceptor() {
System.out.println("interceptor");
return "login";
}
}
5. 在src目录下配置springmvc.xml
6. 修改web.xml配置
7. 编写index.jsp
8. 编写login.jsp
9. 运行项目
10. 登录成功
四. 拦截器重定向用户登录例子
1. 新建一个名为InterceptorUserLogin的Web工程, 同时拷入相关jar包
2. 新建一个名为LoginInterceptor.java的拦截器
package com.lywgames.web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
Object userName = req.getSession().getAttribute("userName");
String sp = req.getServletPath();
if(sp.contains("user") || userName != null) {
return true;
}else {
res.sendRedirect(req.getContextPath() + "/user/toLogin.action");
return false;
}
}
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView mav) throws Exception {}
@Override
public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception e) throws Exception {}
}
3. 新建一个名为Item.java的实体类
package com.lywgames.domain;
import java.io.Serializable;
import java.util.Date;
public class Item implements Serializable{
private static final long serialVersionUID = 1L;
// 商品id
private Integer id;
// 商品名称
private String name;
// 商品价格
private Double price;
// 商品创建时间
private Date createtime;
// 商品描述
private String detail;
public Item() { }
public Item(Integer id, String name, Double price, Date createtime, String detail) {
this.id = id;
this.name = name;
this.price = price;
this.createtime = createtime;
this.detail = detail;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
}
4. 新建一个名为ItemAction.java的处理器
package com.lywgames.web.action;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.lywgames.domain.Item;
@Controller
@RequestMapping("item")
public class ItemAction {
List<Item> itemList = new ArrayList<Item>();
public ItemAction() {
itemList.add(new Item(1, "冰箱", 1999.0, new Date(), "保鲜。"));
itemList.add(new Item(2, "电脑", 8888.0, new Date(), "网上冲浪"));
itemList.add(new Item(3, "洗衣机", 4000.0, new Date(), "从此不用手。"));
itemList.add(new Item(4, "空调", 2600.0, new Date(), "冬天制热, 夏天制冷。"));
itemList.add(new Item(5, "液晶电视", 20000.0, new Date(), "曲面屏幕"));
}
@RequestMapping(value="findAllProducts")
public ModelAndView findAllProducts() {
ModelAndView mav = new ModelAndView();
mav.addObject("itemList", itemList);
mav.setViewName("itemList");
return mav;
}
}
5. 新建一个名为UserController.java的处理器
package com.lywgames.web.action;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("toLogin")
public String toLogin() {
return "login";
}
@RequestMapping("login")
public String login(String userName, String password, HttpSession hs) {
if("admin".equals(userName) && "123456".equals(password)) {
hs.setAttribute("userName", userName);
return "redirect:/item/findAllProducts";
}
return "login";
}
}
6. 在src目录下配置springmvc.xml
7. 修改web.xml配置
8. 编写index.jsp
9. 编写itemList.jsp
10. 编写login.jsp
11. 运行项目
12. 点击查询所有商品, 会到登录页面
13. 进行用户登录, 登录成功后跳转到商品列表页面
14. 回到首页, 再次查询所有商品