• 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. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xmlns:mvc="http://www.springframework.org/schema/mvc"
    3. xmlns:p="http://www.springframework.org/schema/p"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="
    6. http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context
    9. http://www.springframework.org/schema/context/spring-context.xsd
    10. http://www.springframework.org/schema/mvc
    11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    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. Insert title here
    4. ${msg }
    5. 用户名:
    6. 密码:

    main.jsp 的代码如下:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. Insert title here
    4. 当前用户:${user.uname }
    5. 退出

    7)发布并测试应用

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


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

     

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


    图 2 成功登录的效果


    图 3 用户名或密码错误

     

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

  • 相关阅读:
    Ceph — 简介
    婴儿洗衣机有必要买吗?四款好评婴儿洗衣机性能大对比
    盈科视控荣获创响中国大赛第四名
    解决wget下载过慢的问题
    香橙派 c# iot .net 通过WiringOP库控制继电器吸合开关 代码实例
    Dubbo+Zookeeper
    virtualbox给CentOS7虚拟机磁盘扩容
    xLua热更新(一)xLua基本使用
    【Hack The Box】windows练习-- SecNotes
    神经网络算法和遗传算法,数据挖掘神经网络算法
  • 原文地址:https://blog.csdn.net/unbelievevc/article/details/128142839