关于使用isTokenValid
的那个方法:
一,首先介绍一下struts
提供的有关令牌环的相关方法
请求有效性处理,
使用令牌可以有效的防止重复提交。
protected String
generateToken(HttpServletRequest request)
创建一个令牌.
protected boolean
isTokenValid(HttpServletRequest request)
检查令牌是否有效
protected boolean
isTokenValid(HttpServletRequest request,Boolean reset)
检查令牌是否有效,并且重置令牌(如果reset
是true
)
protected void
resetToken(HttpServletRequest request)
重置令牌
protected void
saveToken(HttpServletRequest request)
添加令牌
二,利用struts
的同步令牌机制
利用同步令牌(Token
)机制来解决Web
应用中重复提交的问题,Struts
也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
-
-
if (isTokenValid(request, true)) {
-
// your code here
-
return mapping.findForward("success");
-
} else {
-
saveToken(request);
-
return mapping.findForward("submitagain");
-
}
Struts
根据用户会话ID
和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考
TokenProcessor
类中的generateToken()
方法。
1. //
验证事务控制令牌,<html:form >
会自动根据session
中标识生成一个隐含input
代表令牌,防止两次提交
2.
在act
ion
中:
-
-
//<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
-
// value="6aa35341f25184fd996c4c918255c3ae">
-
if (!isTokenValid(request))
-
errors.add(ActionErrors.GLOBAL_ERROR,
-
new ActionError("error.transaction.token"));
-
resetToken(request);
//
删除session
中的令牌
3. act
ion
有这样的一个方法生成令牌
-
-
protected String generateToken(HttpServletRequest request) {
-
-
HttpSession session = request.getSession();
-
try {
-
byte id[] = session.getId().getBytes();
-
byte now[] =
-
new Long(System.currentTimeMillis()).toString().getBytes();
-
MessageDigest md = MessageDigest.getInstance("MD5");
-
md.update(id);
-
md.update(now);
-
return (toHex(md.digest()));
-
} catch (IllegalStateException e) {
-
return (null);
-
} catch (NoSuchAlgorithmException e) {
-
return (null);
-
}
}
声明:
提交表单时,必须使用html
标签,
否则token
不能用
但是一种方法可以解决该问题:
在页面中加入一个隐藏域
<input type="hidden"
name="org.apache.struts.taglib.html.TOKEN"
value="<%(String)session.getAttribute(
Globals.TRANSACTION_TOKEN_KEY)%>">
因为,Struts
产生的令牌Key
存放在Session
内
分享到:
相关推荐
在处理`toSubmit.jsp`表单提交的Action类中,需要加入`isTokenValid(request, true)`方法来验证同步令牌的有效性。如果令牌有效,则继续执行表单提交操作;否则,返回错误页面。示例如下: ```java public ...
这里,`isTokenValid`方法会比较请求中的令牌与之前保存的令牌是否一致。如果不一致,说明令牌已被使用过,即可能存在重复提交,此时返回错误页面("regError")。如果令牌有效,重置令牌(`resetToken`)以准备处理...
在Struts中,可以通过调用`isTokenValid()`方法来验证令牌的有效性。例如,在`insert`方法中进行验证: ```java public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request...
private boolean isTokenValid(HttpServletRequest request) { String submittedToken = request.getParameter("token"); String storedToken = (String) request.getSession().getAttribute("token"); request....
Struts1提供了`isTokenValid(request, true)`方法来检查令牌是否有效。如果令牌有效,说明这是首次提交,我们可以安全地执行业务逻辑,例如新增记录;如果令牌无效,那么这可能是一个重复提交,我们应该忽略这次请求...
protected boolean isTokenValid() { return ActionContext.getContext().getSession().get(TokenActionSupport.TOKEN_KEY) != null && this.token.equals(ActionContext.getContext().getSession().get...
1. `isTokenValid(HttpServletRequest request)` 和 `isTokenValid(HttpServletRequest request, String token)`:这两个方法用于验证请求中的令牌是否有效。它们首先尝试从请求的session中获取保存的令牌,然后与...
在Action中,可以通过`isTokenValid`验证令牌,`resetToken`方法清除会话中的令牌,`generateToken`方法用于生成新的令牌。 ```java protected String generateToken(HttpServletRequest request) { HttpSession ...
在Action中,Struts1的`TokenActionSupport`类提供了一些方便的方法,如`isTokenValid()`和`resetToken()`,用于检查令牌的有效性并重置令牌: ```java public class MyAction extends ActionSupport { @Override ...
阿波罗链接刷新令牌 用于在身份验证错误时刷新身份验证令牌的链接 入门 安装软件包: yarn add apollo-link-refresh-token 将链接添加到您的阿波罗客户端: ...const isTokenValid = ( token : string )
if (isTokenValid(request, true)) { // 处理请求,然后更新令牌 return mapping.findForward("success"); } else { saveToken(request); return mapping.findForward("submitagain"); } ``` 在HTML表单中,...
创建一个继承自`org.apache.struts2.dispatcher.ng.filter.DefaultActionFilter`的类,重写其中的`isTokenValid()`方法,以便自定义Token的有效性检查。 3. **在JSP页面中添加Token**: 在表单中添加隐藏字段,...
- `isTokenValid()`方法用于验证表单中的令牌是否与会话中的令牌一致。 - 如果令牌一致,则继续执行后续业务逻辑。 - 如果令牌不一致,则调用`saveToken()`方法更新会话中的令牌,并返回一个表示“重复提交”的转发...
- 在处理提交逻辑时,使用`isTokenValid(request, true)`方法来验证客户端提交的Token是否有效。 - 示例代码: ```java public ActionForward insert(ActionMapping mapping, ActionForm form, ...
- 当用户提交表单时,`org.apache.struts.action.Action`类中的`isTokenValid()`方法会被自动调用来验证Token的有效性。 - 如果验证通过,则继续处理表单数据;如果不通过,则返回错误信息。 3. **清理阶段** -...
还记得幻灯片中的isTokenValid函数吗? 将身份验证逻辑移至上下文,并确保未发布的帖子仅对经过身份验证的用户可见。 除了身份验证,还向您的GraphQL服务器添加基于角色的授权。 在模式中创建一个称为views的
2. `isTokenValid(request)`:在用户提交表单后,服务器端会调用这个方法来验证请求中的token是否有效。如果有效,继续处理请求;如果无效,说明可能是重复提交,可以选择忽略或者返回错误信息。 接下来,我们讨论...
- **防止重复提交**:Action.saveToken(request)和isTokenValid()方法可以避免用户意外或恶意的多次提交。 - **JSP标签库**:Struts提供了丰富的JSP自定义标签,如logic、bean、html,使页面更简洁,逻辑更清晰。 ...
if (form.isTokenValid()) { // 处理业务逻辑 } else { // 返回错误信息 } ``` 总之,Struts1.x的令牌机制是防止重复提交和CSRF攻击的关键策略。开发者需要理解其工作原理,并正确配置和使用,以确保应用程序的...