赞
踩
SpringMVC的拦截器(Interceptor)也是AOP思想的一种实现方式。它与Servlet的过滤器(Filter)功能类似,主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
拦截器和过滤器的区别
- 拦截器是SpringMVC组件,而过滤器是Servlet组件。
- 拦截器不依赖Web容器,过滤器依赖Web容器。
- 拦截器只能对控制器请求起作用,而过滤器则可以对所有的请求起作用。
- 拦截器可以直接获取IOC容器中的对象,而过滤器就不太方便获取。
接下来我们使用SpringMVC拦截器,首先使用maven创建SprinMVC的web项目
- package com.example.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.CrossOrigin;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- @Controller
- public class MyController1 {
- @RequestMapping ("/m1")
- public String m1(){
- System.out.println("控制器方法");
- return "result";
- }
- }
创建拦截器类,该类实现HandlerInterceptor接口,需要重写三个方法:
- preHandle:请求到达Controller前执行的方法,返回值为true通过拦截器,返回值为false被拦截器拦截。
- postHandle:跳转到JSP前执行的方法
- afterCompletion:跳转到JSP后执行的方法
- package com.example.interceptor;
-
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.util.Scanner;
-
- public class MyInterceptor implements HandlerInterceptor {
- // 请求到达Controller前执行
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.print("请求到达Controller前\t");
- // 如果return false则无法到达Controller
- // 控制台输入决定是否进入Controller
- System.out.print("控制台输入决定是否进入Controller: ");
- Scanner scanner = new Scanner(System.in);
- boolean flag;
- flag = scanner.nextBoolean();
- return flag;
- }
-
- // 跳转JSP前执行,此时可以向Request域添加数据
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.print("跳转JSP前\t");
- /*System.out.print("控制台输入决定是否添加数据: ");
- Scanner scanner = new Scanner(System.in);
- boolean flag;
- flag = scanner.nextBoolean();
- if(flag)*/
- request.setAttribute("name","HQX");
- }
-
- // 跳转JSP后执行,此时已经不能向Request域添加数据
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("跳转到JSP后");
- request.setAttribute("age",10);
- }
- }
OK,首先我们这里到达控制器前和是否进入控制器还有是否跳转JSP,跳转到JSP后都有对应的提示。
result.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>结果</title>
- </head>
- <body>
- <h3>name:${requestScope.name}</h3>
- <h3>age:${requestScope.age}</h3>
- </body>
- </html>
这里把我们控制台输入的name响应到前端页面,但是age注定是没有属性的,因为跳转到JSP后才添加注定是没有意义的。
接下来我们需要在SpringMVC核心配置文件中配置拦截器
- <!-- 配置拦截器-->
- <mvc:interceptors>
- <mvc:interceptor>
- <!-- 配置拦截器的作用路径-->
- <mvc:mapping path="/**"/>
- <!-- 拦截器对象 -->
- <bean class="com.itbaizhan.interceptor.MyInterceptor"/>
- </mvc:interceptor>
- </mvc:interceptors>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。