文章目录
- 1. 拦截器的作用
- 2. 拦截器的配置
- 3. 拦截器的方法
- 4.拦截器执行顺序
- 5. 拦截器简单案例
1. 拦截器的作用
- Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 用户可以自己定义一些拦截器来实现特定的功能。
- 拦截器和过滤器的不同
1. 过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用
2. 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用
3. 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截
4. 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦 截的
5.拦截器也是AOP思想的一种实现方式
6. 想要自定义拦截器,需要实现HandlerInterceptor接口
2. 拦截器的配置
- 编写控制器
@Controller
public class InterContorller {
@RequestMapping("/testInterceptor")
public String testInterceptor(){
System.out.println("testInterceptor执行了");
return "success";
}
}
- 在springmvc.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path=""/>
<bean class="interceptor.Interceptor01"/>
</mvc:interceptor>
</mvc:interceptors>
- 在上述配置中:
<mvc:interceptors> 元素用于配置一组拦截器
<mvc:interceptor> 元素中定义的是指定路径的拦截器,表示匹配指定路径的请求才进行拦截
<mvc:mapping> 用于配置拦截器作用的路径
path 的属性值“/**”表示拦截所有路径
<mvc:exclude-mapping> 配置不需要拦截作用的路径
< bean class=" "/>配置拦截器对象
3. 拦截器的方法
- 定义Interceptor01类继承HandlerInterceptor接口,并实现了接口中的 3 个方法:
- preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
- postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行。
4.拦截器执行顺序
- 在配置文件中如果只定义了一个拦截器,程序将首先执行拦截器类中的 preHandle 方法,如果 true,(若为false,则中断执行)程序将继续执行控制器中处理请求的方法,返回视图前将执行 postHandle 方法,返回视图后才执行 afterCompletion 方法。
即preHandle ——>控制器Controller——>postHandle ——>afterCompletion
public class Interceptor01 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle 拦截器拦截了");
return true;//此方法只有返回true时,程序才能被拦截
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 方法执行了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion 方法执行了");
}
}
执行结果:
- 创建Interceptor02类,实现HandlerInterceptor接口中的方法,在springmvc.xml文件中在配置Interceptor02拦截器,运行结果如下:
5. 拦截器简单案例
- 验证用户登录
登录页面有一提交表单的动作。需要在 controller 中处理。
1.1 判断用户名密码是否正确
1.2 如果正确 向 session 中写入用户信息
1.3 返回登录成功。
拦截用户请求,判断用户是否登录
2.1如果用户已经登录,放行
2.2如果用户未登录,跳转到登录页面
- 创建一个用户实体类
public class User implements Serializable {
private String uname;
private String upwd;
//省略setter和getter方法
}
- 创建UserController控制器类
@Controller
public class UserController {
//登录页面初始化
@RequestMapping("/initLogin")
public String testinitLogin(){
return "login";
}
// 跳转到主页面
@RequestMapping("/main")
public String testMain(){
return "main";
}
//退出登录
@RequestMapping("/logout")
public String testlogout(HttpSession session){
// 清除 session
session.invalidate();
return "login";
}
//处理登录功能
@RequestMapping("/login")
public String login(User user, Model model, HttpSession session){
if("叶子".equals(user.getUname())&&"123".equals(user.getUpwd())){
session.setAttribute("user",user);
//重定向到主页面
return "redirect:main";
}
model.addAttribute("msg","户名或密码错误,请重新登录!");
return "login";
}
}
- 创建拦截器类LoginInterceptor
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果是登录页面则放行
if (request.getRequestURI().indexOf("/toLogin") >= 0 || request.getRequestURI().indexOf("/login") >= 0) {
return true;
}
//如果用户已登录也放行
HttpSession session = request.getSession();
if(session.getAttribute("user")!=null){
return true;
}
//用户没有登录挑战到登录页面
request.getRequestDispatcher("/WEB-INF/pages/login.jsp").forward(request,response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
- 在springmvc.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.wink.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- 创建login.jsp和main.jsp
/***************index.jsp******************/
<a href="/initLogin">测试登录</a>
/***************login.jsp******************/
${msg}
<form action="/login" method="post">
用户名:<input type="text" name="uname"/><br/>
密码:<input type="text" name="upwd"/><br/>
<input type="submit" value="登录"/>
</form>
/***************main.jsp******************/
当前用户:${user.uname}<br/>
<a href="/logout">退出</a>
运行结果: