009_拦截器
一. 單個攔截器執行流程
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 {// 在控制器方法執行前被執行??梢宰鲆恍┑卿洈r截、權限認證等操作。@Overridepublic boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {System.out.println("MyInterceptor.preHandle");// 返回true放行, false攔截。return true;}// 在控制器方法執行后, 返回ModelAndView之前被執行。設置或者清理頁面共用參數等操作。@Overridepublic void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView mav) throws Exception {System.out.println("MyInterceptor.postHandle");mav.addObject("name", "張三");}// 在控制器方法執行后被執行。處理異常、記錄日志等操作。@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {System.out.println("MyInterceptor2.preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView mav) throws Exception {System.out.println("MyInterceptor2.postHandle");}@Overridepublic 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 {@Overridepublic 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;}}@Overridepublic void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView mav) throws Exception {}@Overridepublic 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;// 商品idprivate 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. 回到首頁, 再次查詢所有商品
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 008_Restfull请求风格
- 下一篇: 01_Mybatis入门