springMVC的学习拦截器之验证用户登录案例

news/2024/11/20 21:30:20/

文章目录

  • 实现思路
  • 关于环境和配置文件
    • pom
    • spring的配置文件
    • 关于idea的通病/常见500错误的避坑
  • 实现步骤
    • 编写登陆页面
    • 编写Controller处理请求
    • 编写登录成功的页面
    • 编写登录拦截器

实现思路

  1. 有一个登录页面,需要写一个controller访问页面
  2. 登陆页面提供填写用户名和密码的表单。需要在controller中进行判断处理,如果正确,向session中写入用户信息,返回登录成功
  3. 拦截用户请求,判断用户是否登录。如果用户已经登录,就放行;否则,跳转到登录页面

关于环境和配置文件

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yang</groupId><artifactId>springmvc-07-Interceptor</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies><!--在build中配置resources,来防止我们资源导出失败的问题--><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build></project>

spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:mv="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache.xsd"><!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --><context:component-scan base-package="com.yang.controller"/><!-- 让Spring MVC不处理静态资源--><mvc:default-servlet-handler /><mvc:annotation-driven /><!--支持mvc注解驱动在spring中一般采用@RequestMapping注解来完成映射关系要想使@RequestMapping注解生效必须向上下文中注册DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例这两个实例分别在类级别和方法级别处理。而annotation-driven配置帮助我们自动完成上述两个实例的注入。--><!--JSON乱码问题配置--><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><property name="failOnEmptyBeans" value="false"/></bean></property></bean></mvc:message-converters></mvc:annotation-driven><!-- 视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><!-- 前缀 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 后缀 --><property name="suffix" value=".jsp" /></bean><!--关于拦截器的配置--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean id="loginInterceptor" class="com.yang.config.LoginInterceptor"/></mvc:interceptor></mvc:interceptors></beans>

关于idea的通病/常见500错误的避坑

  • 就是要在项目结构–>工件中,手动配置lib目录导入所有的依赖
    在这里插入图片描述

实现步骤

编写登陆页面

<%--Created by IntelliJ IDEA.User: HPDate: 2022/8/1Time: 19:40To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login">用户名:<input type="text" name="username" required> <br>密码: <input type="password" name="pwd" required> <br><input type="submit" value="提交">
</form></body>
</html>

编写Controller处理请求

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;/*** @author 缘友一世* @date 2022/8/1-20:05*/
@Controller
@RequestMapping("/user")
public class LoginController {//跳转到登陆页面@RequestMapping("/jumpLogin")public String jumpLogin() throws Exception {return "login";}//跳转到成功页面@RequestMapping("/jumpSuccess")public String jumpSuccess() throws Exception {return "success";}//登陆提交@RequestMapping("/login")public String login(HttpSession session, String username, String pwd) throws Exception {// 向session记录用户身份信息//System.out.println("接收前端==="+username);session.setAttribute("user", username);session.setAttribute("password", pwd);return "success";}//退出登陆@RequestMapping("logout")public String logout(HttpSession session) throws Exception {// session 过期session.invalidate();return "login";}}

编写登录成功的页面

<%--Created by IntelliJ IDEA.User: HPDate: 2022/8/1Time: 20:28To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>success</title>
</head>
<body><h1>登录成功页面</h1><hr>恭喜,${user},登陆成功<a href="${pageContext.request.contextPath}/user/logout">注销</a>
</body>
</html>

编写登录拦截器

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;/*** @author 缘友一世* @date 2022/8/1-20:30*/
public class LoginInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 如果是登陆页面则放行//System.out.println("uri: " + request.getRequestURI());//request.getRequestURI() 返回除去host(域名或者ip)部分的路径//逻辑判断 路径中是否包含login,确定是否在登陆页面 如果是,就通行if (request.getRequestURI().contains("login")) {return true;}HttpSession session = request.getSession();// 如果用户已登陆也放行if(session.getAttribute("user") != null) {return true;}// 用户没有登陆跳转到登陆页面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);return false;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
  • 最后启动tomcat进行测试

http://www.ppmy.cn/news/12501.html

相关文章

基于matlab的指纹图像处理、脊线增强、脊线分割、脊线细化、细节点检测和细节点验证

需求分析对于指纹的特征提取包含几个步骤&#xff0c;脊线增强、脊线分割、脊线细化、细节点检测和细节点验证&#xff0c;本次大作业需要针对已经增强的指纹图片进行后续几个步骤&#xff0c;通过多种形态学算法进行分割、细化、细化后处理&#xff0c;找到其中的端点和分叉点…

Swift return陷阱

return后还会执行后边的代码 我们来看下边一个例子&#xff1a; func test() -> Bool {print("1 test")return falseprint("2 test") }func test2() {print("1 test2")returnprint("2 test2") }test() test2()输出&#xff1a; 1…

【数据结构】保姆级单链表教程(概念、分类与实现)

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f348;一、链表概述&#x1f348;&#xff1a; 1.链表的概念及结构&#xff1a; 2.链表存在的意义&#xff1a; &#x1f353;二、链表的分类&#x1f353;&#xff1a; &#x1f95d;三、单链表的实现&#x1f…

寻找两个正序数组的中位数

题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入…

Java使用Zxing二维码生成

目录 1、二维码简介 二维码纠错级别 2、ZXing简介 3、示例 3.1 搭建一个maven项目&#xff0c;引入Zxing依赖包 3.2 创建QrCodeUtil.java 类 1、二维码简介 二维条形码是用某种特定的几何图形按一定规律在平面&#xff08;二维方向上&#xff09;分布的黑白相间的图形记录…

react受控组件和非受控组件区别

一、受控组件 在HTML中&#xff0c;表单元素的标签、、等的值改变通常是根据用户输入进行更新。 在React中&#xff0c;可变状态通常保存在组件的状态属性中&#xff0c;并且只能使用 setState() 进行更新&#xff0c;而呈现表单的React组件也控制着在后续用户输入时该表单中发…

Python学习笔记-PyQt6消息窗

对话框是界面编程中重要的窗体&#xff0c;一般用于提示或者一些其他特定操作。一、使用QDialog显示通用消息框直接使用QDialog类&#xff0c;可以及通过对话框进行通用对话框显示&#xff0c;亦可以通过自定义设置自己需要的对话框。# _*_ coding:utf-8 _*_import sysfrom PyQ…

Linux 中断子系统(八):中断处理流程

1、上层中断处理 系统初始化时,已经建立起 硬件中断号 和 软件中断号的 映射表。 中断注册时,我们需要先从设备树中获取硬件中断号,然后调用 API 将硬件中断号转换为软件中断号,根据软件终端号 irq 找到对应的 irq_desc,并将中断处理函数添加到 irq_desc 中(也就是 irq…