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 {
	
	// 在控制器方法执行前被执行。可以做一些登录拦截、权限认证等操作。
	@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. 回到首页, 再次查询所有商品

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值