Spring Boot中防表单重复提交以及拦截器登录检测
目录
理论
演示
源码
理论
在用户登录后,如果按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中防表单重复提交以及拦截器登录检测相关推荐
- JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体
1. struts 工作流程图 超链接 2. 入门案例 struts入门案例:1.写一个注册页面,把请求交给 struts处理<form action="${pageContext.r ...
- redis防表单重复提交
参考链接: 防表单重复提交的四种方法:https://www.cnblogs.com/huanghuizhou/p/9153837.html 补充几点个人想法: 1. 对于前后端传递token验证的方 ...
- SpringMVC中实现的token,防表单重复提交
一:首先创建一个token处理类 ,这里的类名叫 TokenHandler private static Logger logger = Logger.getLogger(TokenHandler. ...
- springboot 订单重复提交_Spring Boot (一) 校验表单重复提交
一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...
- laravel中防止表单重复提交的综合解决方案
[本文转载自Hyes]http://www.hao124.net/article/14 怎样防止表单重复提交,通过搜索引擎能搜到很多结果,但很零散,系统性不强,正好前几天做了这个功能,决定记录下来. ...
- JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码
1. 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 pub ...
- 基于拦截器实现防表单重复提交
1.定义自定义注解 2.定义防重复提交拦截器 /*** 防止重复提交拦截器** */ @Component public abstract class RepeatSubmitInterceptor ...
- 由防止表单重复提交引发的一系列问题--servletRequest的复制、body值的获取
@Time:2019年1月4日 16:19:19 @Author:QGuo 背景:最开始打算写个防止表单重复提交的拦截器:网上见到一种不错的方式,比较合适前后端分离,校验在后台实现: 我在此基础上,将 ...
- Sturt2做表单重复提交
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-/ ...
最新文章
- 用OpenCV实现页面扭曲矫正
- Python 之excle的读写
- python环境设置_MacOS中的Python(和NumPy)开发环境设置
- Java设计模式-中介者模式
- python最小公倍数 菜鸟_最小公倍数 golang + python
- c语言计算机编程例题详解,计算机C语言编写程序题及答案解析精选.doc
- python tkinter button_更改Python中Tkinter Button的命令方法
- [删括号][判断可行性的dp]
- html5提交按钮如何改成图片,HTML5 订阅按钮变成填充表单动效
- python打包和添加数据文件_使用pyinstaller 2.1将python打包并添加版本信息和图标
- 2022年全国大学生电子设计大赛省赛A题
- java根据中文汉字获取拼音——java
- python绘图工具reportlab介绍
- 计算机网页制作保存,不使用任何工具轻松保存网页资源的法子
- rtf转换成html,转换Rtf到HTML
- DNS错误不能上网怎么办?电脑dns错误修复方法?
- 基于 Holt-Winters季节性预测模型 的时间序列预测
- java如何添加同名的xml节点_java – 解组具有多个同名元素的XML JAXB
- Nginx优化与防盗链
- Android逆向writeup,[原创]腾讯apk逆向系列WriteUp
热门文章
- Silverlight 5 Beta新特性[5]隐式模板支持
- C++ 大神John Carmack的编程传说!还在抱怨C++难学吗?看大佬操作!
- P8U8 IT这块出书门槛相对比较低
- 飞鸽传书2012发展触摸屏技术发展迅猛
- 编程语言五花八门,哪种可以让程序员赚到更多钱?
- 一张图告诉你,自学编程和科班程序员的差别在哪
- 分分钟甩Word几条街,Python编辑公式竟可以如此简单,你都知道吗?
- mysql映射mapper_Mybatis中Mapper映射文件使用详解
- 使用J2SE API读取Properties文件的六种方法(选择自 kindani 的 Blog )
- 不恢复余数除法原理_青岛版二年级下册数学寒假预习:有余数的除法自主练习答案及讲解...