最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot使用token防止重復(fù)提交表單問(wèn)題

 更新時(shí)間:2026年05月20日 10:52:17   作者:學(xué)習(xí)不易  
文章主要描述了一個(gè)關(guān)于用戶登錄測(cè)試的過(guò)程,涉及到了DuplicateSubmitToken、DuplicateSubmitExceptionTextConstants和DuplicateSubmitAspect等術(shù)語(yǔ),這些可能是在測(cè)試過(guò)程中用于防止重復(fù)提交的功能或注解

DuplicateSubmitToken

package jyuxuan.openpose.config;

import java.lang.annotation.*;

/**
 * 防止表單重復(fù)提交注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface DuplicateSubmitToken {
    // 一次請(qǐng)求完成之前防止重復(fù)提交
    public static final int REQUEST = 1;

    // 一次會(huì)話中防止重復(fù)提交
    public static final int SESSION = 2;

    // 保存重復(fù)提交標(biāo)記 默認(rèn)為需要保存
    boolean save() default true;

    // 防止重復(fù)提交類型,默認(rèn):一次請(qǐng)求完成之前防止重復(fù)提交
    int type() default REQUEST;
}

DuplicateSubmitException

package jyuxuan.openpose.config;

/**
 * 自定義異常
 */
public class DuplicateSubmitException extends Exception {

    public DuplicateSubmitException(String msg){
        super(msg);
    }
}

TextConstants

package jyuxuan.openpose.config;

public class TextConstants {
    public static final String REQUEST_REPEAT = "========this is a duplicate submit exception=====";
}

DuplicateSubmitAspect

package jyuxuan.openpose.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

/**
 * 防止表單重復(fù)提交攔截器
 */
@Aspect
@Component
@Slf4j
public class DuplicateSubmitAspect {
    public static final String DUPLICATE_TOKEN_KEY = "duplicate_token_key";

    @Pointcut("execution(public * jyuxuan.openpose.controller..*(..))")

    public void webLog() {
    }

    @Before("webLog() && @annotation(token)")
    public void before(final JoinPoint joinPoint, DuplicateSubmitToken token) throws DuplicateSubmitException {
        if (token != null) {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();

            boolean isSaveSession = token.save();
            if (isSaveSession) {
                String key = getDuplicateTokenKey(joinPoint);
                Object t = request.getSession().getAttribute(key);
                if (null == t) {
                    String uuid = UUID.randomUUID().toString();
                    request.getSession().setAttribute(key.toString(), uuid);
                    log.info("token-key=" + key);
                    log.info("token-value=" + uuid.toString());
                } else {
                    throw new DuplicateSubmitException(TextConstants.REQUEST_REPEAT);
                }
            }

        }
    }

    /**
     * 獲取重復(fù)提交key
     * @param joinPoint
     * @return
     */
    public String getDuplicateTokenKey(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        StringBuilder key = new StringBuilder(DUPLICATE_TOKEN_KEY);
        key.append(",").append(methodName);
        return key.toString();
    }

    @AfterReturning("webLog() && @annotation(token)")
    public void doAfterReturning(JoinPoint joinPoint, DuplicateSubmitToken token) {
        // 處理完請(qǐng)求,返回內(nèi)容
        log.info("出方法:");
        if (token != null) {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            boolean isSaveSession = token.save();
            if (isSaveSession) {
                String key = getDuplicateTokenKey(joinPoint);
                Object t = request.getSession().getAttribute(key);
                if (null != t && token.type() == DuplicateSubmitToken.REQUEST) {
                    request.getSession(false).removeAttribute(key);
                }
            }
        }
    }

    /**
     * 異常
     * @param joinPoint
     * @param e
     * @param token
     */
    @AfterThrowing(pointcut = "webLog()&& @annotation(token)", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Throwable e, DuplicateSubmitToken token) {
        if (null != token
                && e instanceof DuplicateSubmitException == false) {
            //處理處理重復(fù)提交本身之外的異常
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            boolean isSaveSession = token.save();
            //獲得方法名稱
            if (isSaveSession) {
                String key = getDuplicateTokenKey(joinPoint);
                Object t = request.getSession().getAttribute(key);
                if (null != t) {
                    //方法執(zhí)行完畢移除請(qǐng)求重復(fù)標(biāo)記
                    request.getSession(false).removeAttribute(key);
                    log.info("異常情況--移除標(biāo)記!");
                }
            }
        }
    }
}

用戶登錄測(cè)試

/**
 * 用戶登錄
 *
 * @param request
 * @param model
 * @return
 */
@DuplicateSubmitToken(type = DuplicateSubmitToken.SESSION)
@RequestMapping(value = "userLogin", method = RequestMethod.GET)
public String userLogin_(HttpServletRequest request, Model model) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String pwd = userService.userLogin(username);
    String msg;
    if (pwd == null || pwd.equals(""))
        msg = "該用戶未注冊(cè)";
    else if (pwd.equals(password))
        msg = "密碼正確";
    else
        msg = "密碼錯(cuò)誤";
    return "index";
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8中方法引用的使用詳解

    Java8中方法引用的使用詳解

    這篇文章主要介紹了Java 8 中的方法引用使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的兩款工具(itext-pdfhtml和x-easypdf)介紹與使用

    Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的兩款工具(itext-pdfhtml和x-easypdf)介紹與使用

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的兩款工具(itext-pdfhtml和x-easypdf)的介紹與使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-11-11
  • SpringCloud基于Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用的問(wèn)題小結(jié)

    SpringCloud基于Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用的問(wèn)題小結(jié)

    這篇文章主要介紹了SpringCloud基于Feign遠(yuǎn)程調(diào)用,通過(guò)使用 Feign 的方式,我們可以更加優(yōu)雅地進(jìn)行多參數(shù)的遠(yuǎn)程調(diào)用,避免了手動(dòng)拼接URL或構(gòu)建復(fù)雜的請(qǐng)求體,需要的朋友可以參考下
    2024-02-02
  • Java調(diào)用SSE流式接口并流式返回給前端實(shí)現(xiàn)打字輸出效果

    Java調(diào)用SSE流式接口并流式返回給前端實(shí)現(xiàn)打字輸出效果

    在Web開(kāi)發(fā)中,有時(shí)我們需要將文件以流的形式返回給前端,下面這篇文章主要給大家介紹了關(guān)于Java調(diào)用SSE流式接口并流式返回給前端實(shí)現(xiàn)打字輸出效果的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • MyBatis之insert主鍵自增和自定義主鍵詳解

    MyBatis之insert主鍵自增和自定義主鍵詳解

    本文介紹了如何使用MyBatis解決插入數(shù)據(jù)時(shí)因主鍵唯一性約束導(dǎo)致的錯(cuò)誤問(wèn)題,以及如何自定義主鍵生成規(guī)則,文中詳細(xì)解釋了如何在MyBatis中配置自增主鍵,并提供了測(cè)試示例
    2024-12-12
  • 通過(guò)實(shí)例解析java8中的parallelStream

    通過(guò)實(shí)例解析java8中的parallelStream

    這篇文章主要介紹了通過(guò)實(shí)例解析java8中的parallelStream,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)

    在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)

    本文將介紹如何在Spring Boot項(xiàng)目中集成RabbitMQ,實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的基本配置,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • 淺談C#與Java兩種語(yǔ)言的比較

    淺談C#與Java兩種語(yǔ)言的比較

    今天小編就為大家分享一篇關(guān)于淺談C#與Java兩種語(yǔ)言的比較,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Java排序算法之歸并排序簡(jiǎn)單實(shí)現(xiàn)

    Java排序算法之歸并排序簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了Java排序算法之歸并排序簡(jiǎn)單實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • idea中cherry pick的用法

    idea中cherry pick的用法

    Cherry-Pick可以將一個(gè)分支的某些commit,合并到另一個(gè)分支,本文給大家分享idea中cherry pick的用法,感興趣的朋友跟隨小編一起看看吧
    2023-08-08

最新評(píng)論

科技| 金秀| 虎林市| 平安县| 桓台县| 宁阳县| 八宿县| 榆中县| 星子县| 秦皇岛市| 东安县| 东安县| 新野县| 宝清县| 永仁县| 洛阳市| 康乐县| 霍林郭勒市| 景谷| 富裕县| 永福县| 同德县| 枞阳县| 苍溪县| 高陵县| 静乐县| 浑源县| 旬阳县| 科尔| 台东市| 阿荣旗| 章丘市| 东丰县| 临漳县| 偏关县| 松滋市| 高密市| 鄂尔多斯市| 哈密市| 扶风县| 克拉玛依市|