目录

理论

演示

源码


理论

在用户登录后,如果按F5刷新会出现表单重复提交的问题,解决这个问题后,如果没有拦截器登录检测,就会造成,任意用户可以登录后台界面,所以要有拦截器登录检测。

相关的逻辑步骤:

1. 通过视图映射。把用户登录成功的界面重定向到success的界面;

2. 创建一个HandlerInterceptor的子类,用于拦截设置;

3. 在WebMvcConfigurerAdapter的子类中,设置拦截器,以及放行该放行的请求;

演示

未登录的用户直接登录后台界面:

输入用户密码登录后!

按下F5也不会出现表单重复提交的问题!

源码

程序结构如下:

源码如下:

LoginHandlerInterceptor.java

package firstlogindemo.demo.config;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**** 登录检测*/
public class LoginHandlerInterceptor implements HandlerInterceptor {//目标方法执行以前@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {Object user = httpServletRequest.getSession().getAttribute("loginUser");if(user == null){//未登录返回登录界面httpServletRequest.setAttribute("msg", "没有权限请先登录");httpServletRequest.getRequestDispatcher("index.html").forward(httpServletRequest, httpServletResponse);return false;}return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}
}

myMvcConfig.java

package firstlogindemo.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {//所有的WebMvcConfigureAdapterregistry组建都会其作用@Bean   //将组建注册到容器中public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");registry.addViewController("index.html").setViewName("index");registry.addViewController("/main.html").setViewName("success");}//注册拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {//Spring Boot中已经做好静态资源映射registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/index.html", "/", "/user/login");}};return adapter;}
}

LoginController.java

package firstlogindemo.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;import javax.servlet.http.HttpSession;
import java.util.Map;@Controller
public class LoginController {//@DeleteMapping//@PutMapping//@GetMapping//@RequestMapping(value = "/usr/login", method = RequestMethod.POST)@PostMapping(value = "/user/login")public String login(@RequestParam("username") String username,@RequestParam("password") String password,Map<String, Object> map, HttpSession session){if(!StringUtils.isEmpty(username) && "123456".equals(password)){//防止表单重复提交,可以重定向到主页//return "success";session.setAttribute("loginUser", username);return "redirect:/main.html";}map.put("msg", "用户名密码错误");return "index";}
}

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form th:action="@{/user/login}" method="post"><p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p><p>用户名:<input name="username" type="text" placeholder="userName"></p><p>密  码:<input name="password" type="password" placeholder="Password"></p><button type="submit">提交</button>
</form></body>
</html>

success.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>[[${session.loginUser}]]</h1>
<h1>成功</h1></body>
</html>

application.properties

spring.thymeleaf.cache=false

porn.xml

<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.19.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.loginWebDemo</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>loginWeb</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><thymeleaf.version>3.0.9.RELEASE</thymeleaf.version><thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--引入jquery-webjar--><dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.3.1</version></dependency><!--引入bootstrap--><dependency><groupId>org.webjars</groupId><artifactId>bootstrap</artifactId><version>4.0.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

Spring Boot中防表单重复提交以及拦截器登录检测相关推荐

  1. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

    1. struts 工作流程图 超链接 2. 入门案例 struts入门案例:1.写一个注册页面,把请求交给 struts处理<form action="${pageContext.r ...

  2. redis防表单重复提交

    参考链接: 防表单重复提交的四种方法:https://www.cnblogs.com/huanghuizhou/p/9153837.html 补充几点个人想法: 1. 对于前后端传递token验证的方 ...

  3. SpringMVC中实现的token,防表单重复提交

    一:首先创建一个token处理类  ,这里的类名叫 TokenHandler private static Logger logger = Logger.getLogger(TokenHandler. ...

  4. springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  5. laravel中防止表单重复提交的综合解决方案

    [本文转载自Hyes]http://www.hao124.net/article/14 怎样防止表单重复提交,通过搜索引擎能搜到很多结果,但很零散,系统性不强,正好前几天做了这个功能,决定记录下来. ...

  6. JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码

    1. 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 pub ...

  7. 基于拦截器实现防表单重复提交

    1.定义自定义注解 2.定义防重复提交拦截器 /*** 防止重复提交拦截器** */ @Component public abstract class RepeatSubmitInterceptor ...

  8. 由防止表单重复提交引发的一系列问题--servletRequest的复制、body值的获取

    @Time:2019年1月4日 16:19:19 @Author:QGuo 背景:最开始打算写个防止表单重复提交的拦截器:网上见到一种不错的方式,比较合适前后端分离,校验在后台实现: 我在此基础上,将 ...

  9. Sturt2做表单重复提交

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-/ ...

最新文章

  1. 用OpenCV实现页面扭曲矫正
  2. Python 之excle的读写
  3. python环境设置_MacOS中的Python(和NumPy)开发环境设置
  4. Java设计模式-中介者模式
  5. python最小公倍数 菜鸟_最小公倍数 golang + python
  6. c语言计算机编程例题详解,计算机C语言编写程序题及答案解析精选.doc
  7. python tkinter button_更改Python中Tkinter Button的命令方法
  8. [删括号][判断可行性的dp]
  9. html5提交按钮如何改成图片,HTML5 订阅按钮变成填充表单动效
  10. python打包和添加数据文件_使用pyinstaller 2.1将python打包并添加版本信息和图标
  11. 2022年全国大学生电子设计大赛省赛A题
  12. java根据中文汉字获取拼音——java
  13. python绘图工具reportlab介绍
  14. 计算机网页制作保存,不使用任何工具轻松保存网页资源的法子
  15. rtf转换成html,转换Rtf到HTML
  16. DNS错误不能上网怎么办?电脑dns错误修复方法?
  17. 基于 Holt-Winters季节性预测模型 的时间序列预测
  18. java如何添加同名的xml节点_java – 解组具有多个同名元素的XML JAXB
  19. Nginx优化与防盗链
  20. Android逆向writeup,[原创]腾讯apk逆向系列WriteUp

热门文章

  1. Silverlight 5 Beta新特性[5]隐式模板支持
  2. C++ 大神John Carmack的编程传说!还在抱怨C++难学吗?看大佬操作!
  3. P8U8 IT这块出书门槛相对比较低
  4. 飞鸽传书2012发展触摸屏技术发展迅猛
  5. 编程语言五花八门,哪种可以让程序员赚到更多钱?
  6. 一张图告诉你,自学编程和科班程序员的差别在哪
  7. 分分钟甩Word几条街,Python编辑公式竟可以如此简单,你都知道吗?
  8. mysql映射mapper_Mybatis中Mapper映射文件使用详解
  9. 使用J2SE API读取Properties文件的六种方法(选择自 kindani 的 Blog )
  10. 不恢复余数除法原理_青岛版二年级下册数学寒假预习:有余数的除法自主练习答案及讲解...