所谓拦截器就是起一个拦截的作用相当于是一个门卫,主要用于限制对地址的访问,其主要拦截的是action,不拦截jsp路径
在拦截器中有三个重要的方法
1.preHandle
进入Handler方法之前执行,一般用于权限身份验证
2.postHandle
进入Handler方法之后,返回ModelAndView之前执行,将公用模型数据传递到视图
3.afterCompletion
执行Handler完成后执行,一般用于统一异常处理,日志操作
下面写一个登录案例的拦截来加深对拦截器的理解
流程为运行login.jsp,然后进行跳转到LoginControll这个类,进行逻辑的处理,如果登录成功则session的内容为做一定的记录。之后访问其他的界面的时候先检查是否为登录界面,是的话就直接通过,再检查是否登录成功,如果登录成功的话便可以直接访问,如果没有的话则被拦截。
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
<form action="login.action" method="post">
用户:<input type="text" name="name"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
LoginController.java
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import bean.User;
@Controller
public class LoginController {
@RequestMapping("/login.action")
public String login(User user,HttpSession session) {
if("admin".equals(user.getName())&&"123".equals(user.getPassword())) {
System.out.println("登录成功");
session.setAttribute("login", "success");
}
return "result";
}
}
MyInterceptor.java
package interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 此拦截器是用来拦截登录后的
* @author Admin
*
*/
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
//执行Handler完成后执行,统一异常处理,日志操作
System.out.println("afterCompletion:执行Handler完成后执行,统一异常处理,日志操作");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
//进入Handler方法之后,返回ModelAndView之前执行,将公用模型数据传递到视图
System.out.println("postHandle:进入Handler方法之后,返回ModelAndView之前执行,将公用模型数据传递到视图");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
//进入Handler方法之前执行,权限身份验证
System.out.println("preHandle:进入Handler方法之前执行,权限身份验证");
String uri=request.getRequestURI();
if(uri!=null&&uri.indexOf("login.action")>=0) {
return true;
}
HttpSession session=request.getSession();
if(session.getAttribute("login").equals("success")) {
return true;
}
request.getRequestDispatcher("login.jsp").forward(request, response);
return false;
}
}