Spring MVC拦截器案例:用户登录权限验证
在本案例中,只有登录后的用户才能访问系统主页,若没有登录就直接访问主页,则拦截器会将请求拦截并跳转到登录页面,同时在登录页面中给出提示信息。若用户登陆时,用户名或密码错误,则登录页也会显示相应的提示信息。已登录的用户在系统主页点击“退出登录”时,跳转会登录页面,流程图如下。

图1:用户登录流程
在了解了案例的整个执行流程后,接下来我们就具体实现实例来实现用户登录权限验证,具体步骤如下。
1. 新建一个名为“springmvc-login-interceptor-demo”的 Web 工程,并将与 Spring MVC 相关的依赖包引入到工程中。
2. 在 web.xml 中配置 Spring MVC 的 DispatcherServlet、请求和响应编码过滤器等信息,配置内容如下。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp网站站点" rel="nofollow" />
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework网站站点" rel="nofollow" />
package net.biancheng.c.entity;
public class User {
private String userId;
private String userName;
private String password;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
4. 在 net.biancheng.c.controller 包下,创建一个名为 LoginController 的 Controller 类,代码如下。
package net.biancheng.c.controller;
import net.biancheng.c.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
/**
* 登录
*
* @param user
* @param request
* @return
*/
@RequestMapping("/login")
public String login(User user, HttpServletRequest request) {
//验证用户名和密码
if (user != null && "admin".equals(user.getPassword()) && "admin".equals(user.getUserName())) {
HttpSession session = request.getSession();
//将用户信息放到 session 域中
session.setAttribute("loginUser", user);
//重定向到商品列表
return "redirect:/main";
}
//提示用户名或密码错误
request.setAttribute("msg", "用户名或密码错误");
return "login";
}
/**
* 登出
*
* @param user
* @param request
* @return
*/
@RequestMapping("/logout")
public String Logout(User user, HttpServletRequest request) {
//session 失效
request.getSession().invalidate();
return "redirect:/";
}
}
5. 在 net.biancheng.c.interceptor 包下,创建一个名为 LoginInterceptor 的自定义登陆拦截器类,代码如下。
package net.biancheng.c.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行前
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser == null) {
//未登录,返回登陆页
request.setAttribute("msg", "您没有权限进行此操作,请先登录!");
request.getRequestDispatcher("/").forward(request, response);
return false;
} else {
//放行
return true;
}
}
}
6. 在 webapp/WEB-INF 下新建一个 templates 目录,并在该目录下创建一个 login.html,代码如下。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf网站站点" rel="nofollow" />
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf网站站点" rel="nofollow" />
图2:登录拦截
10. 在登录页,输入用户名(admin)和密码(123456),结果如下图。

图3:用户名或密码错误
11. 在登录页输入用户名(admin)和密码(admin),跳转到系统主页,如下图。

图4:系统主页
12. 点击下方的“退出登录”链接,返回登录页,结果如下图。

图5:返回登录页

