概述
- SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处
理。开发者可以自己定义一些拦截器来实现特定的功能。 - 过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
- 过滤器
1.servlet规范中的一部分,任何java web工程都可以使用
2.在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截 - 拦截器
1.拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
2.拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的
自定义拦截器
在applicationContext.xml里配置拦截器
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.lei.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
编写controller
@RestController
public class TestController {
@RequestMapping("/t1")
public String test() {
System.out.println("执行了test方法");
return "OK";
}
}
实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("=========处理前=========");
return true;
//false拦截 true放行
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("=========处理后=========");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("=========清理=========");
}
}
假如return 的是false,则:
controller里面的方法不会被执行。
用户登录判断拦截
拦截器配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.lei.config.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
controller编写
@Controller
@RequestMapping("/user")
public class LoginController {
@RequestMapping("/login")
public String login(HttpSession session, String username, String password, Model model) {
session.setAttribute("userLoginInfo",username);
model.addAttribute("username",username);
return "main";
}
@RequestMapping("/goMain")
public String main() {
return "main";
}
@RequestMapping("/goLogin")
public String goLogin() {
return "login";
}
@RequestMapping("/goOut")
public String goOut(HttpSession session) {
session.removeAttribute("userLoginInfo");
return "login";
}
}
实现接口
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if (session.getAttribute("userLoginInfo") != null) {
return true;
}
if (request.getRequestURI().contains("Login")) {
return true;
}
if (request.getRequestURI().contains("login")) {
return true;
}
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/user/goLogin">登录页面</a>
<a href="${pageContext.request.contextPath}/user/goMain">主页</a>
</body>
</html>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录页面</h1>
<form action="${pageContext.request.contextPath}/user/login" method="post">
用户名:<input type="text" name="username"/>
密码: <input type="text" name="password/">
<input type="submit" value="提交">
</form>
</body>
</html>
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<span>${username}</span>
<p>
<a href="${pageContext.request.contextPath}/user/goOut">注销</a>
</p>
</body>
</html>
我们要实现的效果是还没登录的时候点主页是不能进去的
第一次登录点主页他会跳转到登录页面
登录成功点注销会跳转到登录页面