<s:token />防重复提交

本文详细解释了如何使用s:token标签来防止Web表单的重复提交,并通过示例展示了其配置和作用原理。理解此概念对于提高Web应用的安全性和用户体验至关重要。
<s:token />标签防止重复提交,用法如下:

第一步:在表单中加入<s:token />

<s:form action="helloworld_other" method="post" namespace="/test">

<s:textfield name="person.name"/><s:token/><s:submit/>

</s:form>

第二步:

<action name="helloworld_*" class="cn.itcast.action.HelloWorldAction" method="{1}">

<interceptor-ref name="defaultStack" />

<interceptor-ref name="token" />

<result name="invalid.token">/WEB-INF/page/message.jsp</result>

<result>/WEB-INF/page/result.jsp</result>

</action>

以上配置加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。
⚠️ 未找到表单令牌,页面关键结构:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/> <meta content="漫画,漫画下载" name="keywords"/> <meta content="高清格式漫画下载。" name="description"/> <meta content="width=410,user-scalable=0" name="viewport"/> <meta content="#A8D8B9" media="(prefers-color-scheme: light)" name="theme-color"/> <meta content="#0F4C3A" media="(prefers-color-scheme: dark)" name="theme-color"/> <title> 登錄 - kox.moe </title> <link href="/favicon.ico" rel="apple-touch-icon"/> <link href="/style/weui.1.1.3.css" rel="stylesheet"/> <link href="/style/comm-m.css?0502" rel="stylesheet" type="text/css"/> </head> <body> <div class="top_nav"> <div class="nav_left"> <a href="javascript:void(0);" onclick="javascript:history.back(-1);"> 返回 </a> </div> <div class="nav_logo"> <a href="https://kox.moe/m/"> <img alt="logo" border="0" id="sitelogo" src="https://moimg.mxomo.com/mox/moe-logo-edging.png"/> </a> </div> <div class="nav_right"> <a href="https://kox.moe/m/donate.php"> 支持成為VIP </a> </div> </div> <div class="bg_line_green"> </div> <div class="nav_book"> <a href="https://kox.moe/m/"> 首頁 </a> > 登錄 </div> <div class="bg_line_gary"> </div> <!-- content --> <div class="hr_10"> </div> <form action="/login_do.php" method="post" name="login" target="iframe_action"> <div class="weui-cells__title"> 登錄 </div> <div class="weui-cells weui-cells_form weui-cells_checkbox"> <div class="weui-cell"> <div class="weui-cell__hd"> <label class="weui-label"> 郵箱 </label> </div> <div class="weui-cell__bd weui-cell_primary"> <input class="weui-input" name="email" placeholder="請輸入郵箱帳號" type="text"/> ⚠️ 登录错误: ❌ 表单令牌未找到,请检查页面结构 无法建立有效会话
08-22
微信小程序后台接口文档 项目概览 - 技术栈:Spring Boot、Spring Web、MyBatis、Redis、MySQL、Lombok - 服务职能:提供微信小程序登录换取自定义令牌(token) - 当前仅暴露 1 个登录接口;未实现令牌鉴权的后续业务接口 基础信息 - 基础 URL:http://<host>:<port>,默认端口 8080 - API 前缀:/api/auth - 版本:暂无版本前缀(如 /v1),可在未来引入 认证说明 - 登录接口本身不需要认证 - 登录成功返回 token 字符串;服务将以 token:{token} 作为 Redis 键保存用户信息与 sessionKey,TTL 7 天 - 当前代码未集成 Spring Security/JWT,也未实现基于该 token 的鉴权拦截器 接口列表 - POST /api/auth/login:使用微信登录凭证 code 换取后端自定义 token --- POST /api/auth/login - 描述:接受微信登录临时凭证 code,调用微信 jscode2session 获取 openid/session_key,自动注册或获取用户,生成并返回后端 token - 业务流程: 1. 调用微信接口获取 openid、session_key 2. 按 openid 查询或自动插入用户 3. 生成随机 token 并在 Redis 中写入 userId、sessionKey,TTL 7 天 4. 返回 token 请求 - 方法:POST - URL:/api/auth/login - Headers:Content-Type: application/json - Body: { "code": "wx-login-temp-code" } - 字段说明: - code:微信登录临时凭证,前端通过 wx.login() 获取 响应 - 成功(200): { "token": "2c5b5a2c4c1d4e0a9f8b7c6d5e4f3a2b" } - 失败:当前无统一异常处理,出现微信接口错误或网络异常时将返回 500 状态码 - 200 OK:登录成功并返回 token - 500 Internal Server Error:调用微信接口失败或其他未捕获异常 示例 - curl: curl -X POST \ "http://localhost:8080/api/auth/login" \ -H "Content-Type: application/json" \ -d '{"code":"<wx-login-temp-code>"}' - JavaScript(fetch): fetch('http://localhost:8080/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code }) }).then(r => r.json()).then(data => { const token = data.token // TODO: 保存 token 用于后续接口调用 }) 中间件与校验 - 未发现拦截器、过滤器、全局异常处理或 @Valid 校验 - 未实现速率限制与访问日志拦截 代码位置引用 - 控制器:src/main/java/com/example/wx/controller/LoginController.java:9(@RestController)、src/main/java/com/example/wx/controller/LoginController.java:10(@RequestMapping("/api/auth"))、src/main/java/com/example/wx/controller/LoginController.java:16(@PostMapping("/login")) - 处理方法:src/main/java/com/example/wx/controller/LoginController.java:16-19 - 服务实现:src/main/java/com/example/wx/service/impl/LoginServiceImpl.java:28-52 - 请求 DTO:src/main/java/com/example/wx/dto/LoginRequest.java:5-8 - 响应 DTO:src/main/java/com/example/wx/dto/LoginResponse.java:5-8 - 微信接口调用:src/main/java/com/example/wx/util/WxApiUtil.java:24-45 - 用户查询与插入(MyBatis XML):src/main/resources/mapper/UserMapper.xml:7-17 --- 运行与配置 端口与基础配置 - 端口:server.port: 8080(可通过环境变量或启动参数覆盖) - 配置文件:src/main/resources/application.yml 数据库 - spring.datasource.url: jdbc:mysql://localhost:3306/wx?useSSL=false&serverTimezone=Asia/Shanghai - spring.datasource.username: root - spring.datasource.password: ****** - driver-class-name: com.mysql.cj.jdbc.Driver Redis - spring.data.redis.host: localhost - spring.data.redis.port: 6379 微信配置 - wx.appid: 小程序 AppID - wx.secret: 小程序密钥 - wx.jscode2session-url: https://api.weixin.qq.com/sns/jscode2session 安全建议:将数据库口令与微信密钥改为通过环境变量或外部配置注入,避免明文出现在仓库内。 后续规划建议 - 引入令牌鉴权拦截器(如基于 Redis 的自定义 HandlerInterceptor) - 统一异常处理(@ControllerAdvice)与错误响应结构(code/message) - 参数校验(@Valid/javax.validation),明确 400/401/403/500 的返回语义 - 增加接口版本化(如 /api/v1)与访问日志、速率限制
最新发布
12-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值