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.跳转到了用户列表页面
相关文章
- 深入实践Spring Boot3.2.3 修改控制器
- Spring Boot 集成 FreeMarker 详解案例
- [转]前端传嵌套对象参数给spring mvc
- spring boot实战(第一篇)第一个案例
- Spring Cloud Gateway实战案例(限流、熔断回退、跨域、统一异常处理和重试机制)
- Spring事务传播问题小案例
- Spring Boot 入门案例与配置说明
- Spring Data JPA 和MyBatis比较
- Spring事务传播特性的浅析——事务方法嵌套调用的迷茫
- spring的IOC入门案例
- spring bean是什么
- Spring:代理Filter:DelegatingFilterProxy原理和作用
- Spring MVC与Dubbo的整合一
- Spring Security(2)----用户登录认证数据库实现
- 漫画:Spring Boot、Java多线程、分布式、Java架构的高级架构师进阶之路
- Spring学习笔记(一)---IOC入门案例
- spring 手动写事物,案例
- spring IOC(Spring 生命周期,先1.构造方式,2,初始化方法,3,目标方法,4,销毁方法)