zl程序教程

您现在的位置是:首页 >  后端

当前栏目

spring mvc 拦截器的案例-用户非法登录权限拦截

Spring案例权限MVC 用户 登录 拦截器 拦截
2023-09-27 14:22:12 时间

一.案例需求描述

1.使用拦截器对用户的所有请求,进行拦截,除了用户登录提交action的地址/login/toLogin放开,其余请求都进行拦截

2.拦截器对非法没有登录的用户拦截,让其跳转到登录首页

3.session中存在信息,说明已经登录,则放行,跳转后台主页面,点击其中用户管理菜单,则经过拦截判断,session中有值,则放行下一步,调用相应的findUser方法,然后跳转到user.jsp页面。

二.案例步骤

2.1 controller

package com.ljf.spring.mvc.demo.controller;

import com.ljf.spring.mvc.demo.bean.UserLogin;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpSession;

/**
 * @ClassName: UserLoginController
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2021/01/16 17:31:01 
 * @Version: V1.0
 **/
@Controller
@RequestMapping("/login")
public class UserLoginController
{
    /**
     * 接收请求
     * @return
     */
    @RequestMapping("/toLogin")
    public String toLogin(UserLogin user, HttpSession session) {
        System.out.println("用户登录:"+user.getUserName()+"  "+user.getPassword());
        if(user.getUserName()!=null&&"admin".equals(user.getUserName())&&(user.getPassword()!=null&&"123".equals(user.getPassword()))){
           System.out.println("登录成功!!!,将用户信息放入session中");
            session.setAttribute("userName",user.getUserName());
          return "menu";
        }
        else{
            return "error";
        }
    }
    /**
     * 接收请求
     * @return
     */
    @RequestMapping("/findUser")
    public String findUser(UserLogin user, HttpSession session) {
        String name=(String)session.getAttribute("userName");
        System.out.println("从session中取得用户名:"+name);
        return "user";
    }
}

2.2  自定义pojo实体类

package com.ljf.spring.mvc.demo.bean;

/**
 * @ClassName: UserLogin
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2021/01/16 17:35:34 
 * @Version: V1.0
 **/
public class UserLogin {
    private String userName;
    private  String password;

    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;
    }
}

2.3 拦截器

package com.ljf.spring.mvc.demo.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @ClassName: LoignIntercepter
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2021/01/16 18:21:00 
 * @Version: V1.0
 **/
public class LoignIntercepter implements HandlerInterceptor {
    /**
     * 预处理,controller方法执行前
     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     * return false不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("第1个intercepter,正在执行preHandle()方法......");
        //1.session是否已经存在用户名
        HttpSession session=request.getSession();
        String name=(String)session.getAttribute("userName");
        if(name==null||"".equals(name)){
            System.out.println("sessuon没有信息,则没有登录,跳转到登录首页");
        response.sendRedirect(request.getContextPath()+"/login.jsp");
          return false;
        }
        //session中存在用户信息,表明已经登录,放行
        return true;

    }
    /**
     * 后处理方法,controller方法执行后,success.jsp执行之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("第1个intercepter,正在执行postHandle()方法......");
    }
    /**
     * success.jsp页面执行后,该方法会执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("第1个intercepter,正在执行afterCompletion()方法......");
    }
}

2.5 spring mvc 配置文件

  <!--配置拦截器   -->
    <mvc:interceptors>
        <!--配置拦截器 -->
        <mvc:interceptor>
            <!--要拦截的具体的方法-->
            <!--  /* 一级    /** 所有级   /city/*  二级   -->
            <!--配置对哪些资源执行拦截操作-->
            <mvc:mapping path="/**"/>
            <!--不要拦截的方法  用户登录提交的请求,放行 -->
            <!--配置哪些资源排除拦截操作-->
            <mvc:exclude-mapping path="/login/toLogin"/>
            <!--配置拦截器对象- -->
            <bean class="com.ljf.spring.mvc.demo.config.LoignIntercepter" />
        </mvc:interceptor>
    </mvc:interceptors>

这个地方注意,图中标红的部分是,登录提交的地址,在拦截器中进行放开

2.6 jsp页面

2.6.1 登录jsp页面

<%--
  Created by IntelliJ IDEA.
  User: jurfl
  Date: 2021/1/16
  Time: 17:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login/toLogin" method="post">
   姓名: <input type="text"  name="userName" value=""/>
    密码:<input type="password" name="password" value=""/>
    <input type="submit" value="登录">
</form>
</body>
</html>

 

 

2.6.2 主菜单页面

<%--
  Created by IntelliJ IDEA.
  User: jurfl
  Date: 2021/1/16
  Time: 18:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="${pageContext.request.contextPath}/login/findUser">用户管理</a>
    <a href="">订单管理</a>
</body>
</html>

 

2.6.3  查找用户页面

<%--
  Created by IntelliJ IDEA.
  User: jurfl
  Date: 2021/1/16
  Time: 21:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
欢迎来到用户管理页面!!!
</body>
</html>

2.7  测试验证

2.7.1  用户没有登录,session没有信息,直接登录

1.在地址栏中,随便瞎输路径,/aaaa

2.可以看到拦截器拦截判断session中的信息为空,则跳转到登录页面

 

 

2.7.2  用户输入正确信息进行登录

1.直接访问登录首页

2.输入用户名和密码

3.输入正确的用户名和密码后,则实现成功登录,信息存入到session中,这个地方拦截器没有拦截登录表单的action=/login/toLogin的请求(spring mvc的配置文件,做了忽略配置),直接跳转到这个请求方法中,查询用户名和密码,成功后跳转主菜单。

4.然后跳转到主菜单页面,点击用户管理

5.点击用户管理后,查看执行的后台日志。

 

 

6.跳转到了用户列表页面