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

本节将通过拦截器来完成一个用户登录权限验证的 Web 应用 springMVCDemo07,具体要求如下:只有成功登录的用户才能访问系统的主页面 main.jsp,如果没有成功登录而直接访问主页面,则拦截器将请求拦截,并转发到登录页面 login.jsp。当成功登录的用户在系统主页面中单击“退出”链接时回到登录页面。

具体实现步骤如下:

1)创建应用

创建 Web 应用 springMVCDemo07,并将 Spring MVC 相关的 JAR 包复制到 lib 目录中。

2)创建 POJO 类

在 springMVCDemo07 的 src 目录中创建 pojo 包,并在该包中创建 User 类,具体代码如下:

  1. public class User {
  2. private String uname;
  3. private String upwd;
  4. //省略setter和getter方法
  5. }

3)创建控制器类

在 springMVCDemo07 的 src 目录中创建 controller 包,并在该包中创建控制器类 UserController,具体代码如下:

  1. package controller;
  2. import javax.servlet.http.HttpSession;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import pojo.User;
  7. @Controller
  8. public class UserController {
  9. /**
  10. * 登录页面初始化
  11. */
  12. @RequestMapping("/toLogin")
  13. public String initLogin() {
  14. return "login";
  15. }
  16. /**
  17. * 处理登录功能
  18. */
  19. @RequestMapping("/login")
  20. public String login(User user, Model model, HttpSession session) {
  21. System.out.println(user.getUname());
  22. if ("zhangsan".equals(user.getUname())
  23. && "123456".equals(user.getUpwd())) {
  24. // 登录成功,将用户信息保存到session对象中
  25. session.setAttribute("user", user);
  26. // 重定向到主页面的跳转方法
  27. return "redirect:main";
  28. }
  29. model.addAttribute("msg", "用户名或密码错误,请重新登录! ");
  30. return "login";
  31. }
  32. /**
  33. * 跳转到主页面
  34. */
  35. @RequestMapping("/main")
  36. public String toMain() {
  37. return "main";
  38. }
  39. /**
  40. * 退出登录
  41. */
  42. @RequestMapping("/logout")
  43. public String logout(HttpSession session) {
  44. // 清除 session
  45. session.invalidate();
  46. return "login";
  47. }
  48. }

4)创建拦截器类

在 springMVCDemo07 的 src 目录中创建 interceptor 包,并在该包中创建拦截器类 LoginInterceptor,具体代码如下:

  1. package interceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import javax.servlet.http.HttpSession;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.ModelAndView;
  7. public class LoginInterceptor implements HandlerInterceptor {
  8. @Override
  9. public boolean preHandle(HttpServletRequest request,
  10. HttpServletResponse response, Object handler) throws Exception {
  11. // 获取请求的URL
  12. String url = request.getRequestURI();
  13. // login.jsp或登录请求放行,不拦截
  14. if (url.indexOf("/toLogin") >= 0 || url.indexOf("/login") >= 0) {
  15. return true;
  16. }
  17. // 获取 session
  18. HttpSession session = request.getSession();
  19. Object obj = session.getAttribute("user");
  20. if (obj != null)
  21. return true;
  22. // 没有登录且不是登录页面,转发到登录页面,并给出提示错误信息
  23. request.setAttribute("msg", "还没登录,请先登录!");
  24. request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,
  25. response);
  26. return false;
  27. }
  28. @Override
  29. public void afterCompletion(HttpServletRequest arg0,
  30. HttpServletResponse arg1, Object arg2, Exception arg3)
  31. throws Exception {
  32. // TODO Auto-generated method stub
  33. }
  34. @Override
  35. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
  36. Object arg2, ModelAndView arg3) throws Exception {
  37. // TODO Auto-generated method stub
  38. }
  39. }

5)配置拦截器

在 WEB-INF 目录下创建配置文件 springmvc-servlet.xml 和 web.xml。web.xml 的代码和 springMVCDemo07 一样,这里不再赘述。在 springmvc-servlet.xml 文件中配置拦截器 LoginInterceptor,具体代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/mvc
  13. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  14. <!-- 使用扫描机制扫描控制器类 -->
  15. <context:component-scan base-package="controller" />
  16. <!-- 配置视图解析器 -->
  17. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  18. <property name="prefix" value="/WEB-INF/jsp/" />
  19. <property name="suffix" value=".jsp" />
  20. </bean>
  21. <!-- 配置拦截器 -->
  22. <mvc:interceptors>
  23. <mvc:interceptor>
  24. <!-- 配置拦截器作用的路径 -->
  25. <mvc:mapping path="/**" />
  26. <bean class="interceptor.LoginInterceptor" />
  27. </mvc:interceptor>
  28. </mvc:interceptors>
  29. </beans>

6)创建视图 JSP 页面

在 WEB-INF 目录下创建文件夹 jsp,并在该文件夹中创建 login.jsp 和 main.jsp。

login.jsp 的代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. ${msg }
  11. <form action="${pageContext.request.contextPath }/login" method="post">
  12. 用户名:<input type="text" name="uname" /><br>
  13. 密码:<input type="password" name="upwd" /><br>
  14. <input type="submit" value="登录" />
  15. </form>
  16. </body>
  17. </html>

main.jsp 的代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. 当前用户:${user.uname }<br />
  11. <a href="${pageContext.request.contextPath }/logout">退出</a>
  12. </body>
  13. </html>

7)发布并测试应用

首先将 springMVCDemo07 应用发布到 Tomcat 服务器并启动 Tomcat 服务器,然后通过地址“http://localhost:8080/springMVCDemo07/main”测试应用,运行效果如图 1 所示。

没有登录直接访问主页面的效果
图 1 没有登录直接访问主页面的效果

从图 1 可以看出,当用户没有登录而直接访问系统主页面时请求将被登录拦截器拦截,返回到登录页面,并提示信息。如果用户在用户名框中输入“zhangsan”,在密码框中输入“123456”,单击“登录”按钮后浏览器的显示结果如图 2 所示。如果输入的用户名或密码错误,浏览器的显示结果如图 3 所示。

成功登录的效果
图 2 成功登录的效果

用户名或密码错误
图 3 用户名或密码错误

当单击图 2 中的“退出”链接后,系统将从主页面返回到登录页面。