Spring MVC拦截器案例:用户登录权限验证

2年前 (2024-04-27)
本节,我们将通过 Spring MVC 拦截器(Interceptor)来实现一个用户登录权限验证的案例。

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

图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),结果如下图。

springmvc

图3:用户名或密码错误


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

系统主页

图4:系统主页


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

spring mvc 拦截器案例 返回登录页

图5:返回登录页