一、SpringMVC拦截器配置
1.了解SpringMVC拦截器
-
在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览。对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求。在 Struts 2 框架中,拦截器是其重要的组成部分,Spring MVC 框架也提供了拦截器功能。
-
Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
2.基本步骤
(1)搭配springmvc环境
参考文章:第一个SpringMVC程序
(2)编写一个拦截器类
需要继承HandlerInterceptor接口,主要是preHandle方法,后面的两个方法相当与日志。
- preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
- postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
public class MyInterceptor implements HandlerInterceptor {
//在请求处理的方法之前执行
//如果return true;放行===执行下一个拦截器
//如果return false;不放行===不执行下一个拦截器
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==处理前==");
return false;
}
//在请求处理方法执行之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("==处理后==");
}
//在dispatcherServlet处理后执行,做清理工作
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
}
}
(3)springmvc配置文件中配置拦截器
将我们的编写的拦截器类加载进去
/** | 包括路径及其子路径 |
---|---|
/admin/* | 拦截的是/admin/add等等这种,/admin/add/user不会被拦截 |
/admin/** | 拦截的是/admin/下的所有 |
-
<mvc:interceptors> 元素用于配置一组拦截器,其子元素 <bean>定义的是全局拦截器,即拦截所有的请求。
-
<mvc:interceptor> 元素中定义的是指定路径的拦截器,其子元素 <mvc:mapping> 用于配置拦截器作用的路径,该路径在其属性 path 中定义。
<!--mvc拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--bean配置的是拦截器-->
<bean class="com.gaolang.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
(4)测试Controller
@RestController
public class TestController {
@RequestMapping("/test")
public String test(){
System.out.println("======================");
return "OK";
}
}
我们的preHandle的方法是return false;所以会被拦截,不会显示页面。
二、实例
验证用户是否登录,登录了才可以进入首页不然就拦截,主要是对首页的拦截,不能直接进入首页,需要登录成功后才能进入,用户没有登录点击首页的话直接跳转到登录。
- 拦截器类:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果是登录页面则放行
if (request.getRequestURI().contains("login")){
return true;
}
HttpSession session = request.getSession();
//如果用户已登录也放行
if (session.getAttribute("user")!=null){
return true;
}
//用户没有登入,直接进首页的话,跳转到登录页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
//拦截
return false;
}
}
- springmvc配置文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.gaolang.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- Controller类
@Controller
@RequestMapping("/user")
public class LoginController {
//跳转到登录页面
@RequestMapping("/toLogin")
public String toLogin(){
return "login";
}
//登录提交
@RequestMapping("/login")
public String login(HttpSession session,String username, String pwd){
//数据一般来自数据库,这里暂时固定
if (username.equals("admin")&&pwd.equals("123")){
session.setAttribute("user",username);
return "home";
}else {
return "login";
}
}
//跳转到首页
@RequestMapping("/home")
public String home(){
return "home";
}
//退出登录
@RequestMapping("/outLogin")
public String outLogin(HttpSession session){
// session过期
session.invalidate();
return "login";
}
}
- jsp页面
- index.jsp:初始页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/user/home">首页</a>
<a href="${pageContext.request.contextPath}/user/toLogin">登入</a>
</body>
</html>
- home.jsp首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1 align="center">首页</h1>
${user}
<a href="${pageContext.request.contextPath}/user/outLogin">注销</a>
</body>
</html>
- login.jsp:登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1 align="center">登录页面</h1>
<form action="${pageContext.request.contextPath}/user/login" method="post">
用户名:<input type="text" name="username">
<br>
密码:<input type="password" name="pwd">
<br>
<input type="submit" value="提交">
</form>
</body>
</html>