一、基本使用
1.创建拦截器
package com.ken.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 Interceptor1 implements HandlerInterceptor {
//执行时机:controller方法已经执行,ModelAndView已经返回
//使用场景:记录操作日志,记录登录用户的ip,时间等
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("====================Interceptor1 afterCompletion====================");
}
//执行时机:controller方法已经执行,ModelAndView没有返回
//使用场景:可以在此方法中设置全局的数据处理业务
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("====================Interceptor1 postHandle====================");
}
//返回布尔值:如果返回true,放行;返回false,被拦截
//执行时机:controller方法没有被执行,ModelAndView没有被返回
//使用场景:权限验证
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("====================Interceptor1 preHandle====================");
return true;
}
}
2.配置springmvc.xml
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器的执行顺序等于springmvc.xml中的配置顺序 -->
<mvc:interceptor>
<!-- 拦截请求的路径 要拦截所有,必须配成/** -->
<mvc:mapping path="/**" />
<!-- 指定拦截器的位置 -->
<bean class="com.ken.interceptor.Interceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<!-- 拦截请求的路径 要拦截所有,必须配成/** -->
<mvc:mapping path="/**" />
<!-- 指定拦截器的位置 -->
<bean class="com.ken.interceptor.Interceptor2" />
</mvc:interceptor>
</mvc:interceptors>
二、权限验证
登录权限验证:
1)编写登录的controller, 编写跳转到登录页面的方法, 编写登录验证方法
2)编写登录页面
3)编写拦截器
运行过程:
1)访问随意一个页面,拦截器会拦截请求,会验证session中是否有登录信息
如果已登录,放行
如果未登录,跳转到登录页面
2)在登录页面中输入用户名,密码,点击登录按钮,拦截器会拦截请求,如果是登录路径放行
在controller方法中判断用户名密码是否正确,如果正确则将登录信息放入session
1.登录页面
<%@ page language="java" contentType="text/html; charset=UTF-16"
pageEncoding="UTF-16"%>
<!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-16">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/login/submit" method="post">
<table>
<tr>
<td>用户名:<input name="username" type="text"/></td>
</tr>
<tr>
<td>密码:<input name="password" type="password"/></td>
</tr>
<tr>
<td>密码:<input value="登录" type="submit"/></td>
</tr>
</table>
</form>
</body>
</html>
2.controller
@Controller
@RequestMapping("/login")
public class LoginController {
// 跳转到登录页面
@RequestMapping("/login")
public String login() {
return "login";
}
@RequestMapping("/submit")
public String submit(String username, String password, HttpServletRequest request) {
HttpSession session = request.getSession();
// 判断用户密码的正确性,如果正确则将登录信息放入session中
// 这里简写,真正项目中需要去数据库中校验用户名和密码
if (username != null) {
session.setAttribute("username", username);
}
// 跳转到列表页
return "redirect:/items/list";
}
}
3.拦截器
public class LoginInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//判断当前访问路径是否为登录的路径,如果是则放行
if(request.getRequestURI().indexOf("/login") > 0){
return true;
}
//判断session中是否有登录信息,如果没有则跳转到登录页面,如果有则放行
HttpSession session = request.getSession();
if(session.getAttribute("username")!=null){
return true;
}
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);;
return false;
}
}
拦截器要在springmvc.xml中注册