使用token是为了防止重复提交,像灌水之类的.
最重要的一点是一定要使用struts1的<html:标签,token在有用
LoginAction:
package com.web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
public class LoginAction extends DispatchAction {
public ActionForward get(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//保存令牌(保存在jsp动态生成的32位jsessionid)\
this.saveToken(request);
System.out.println("begin save");
return mapping.findForward("login");
}
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
/**//*if(this.isTokenValid(request))
{
System.out.println("valid");
this.resetToken(request);
return mapping.findForward("ok");
}*/
//这个写法和上面注释部分一样效果
if(this.isTokenValid(request,true))
{
System.out.println("valid");
return mapping.findForward("ok");
}
else
{
System.out.println("invalid");
return mapping.findForward("error");
}
}
}
struts-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans>
<form-bean name="loginForm" type="com.web.form.LoginForm"></form-bean>
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
<action path="/login" parameter="method" name="loginForm"
type="com.web.action.LoginAction">
<forward name="login" path="/login.jsp" />
<forward name="ok" path="/ok.jsp" />
<forward name="error" path="/error.jsp" />
</action>
</action-mappings>
<message-resources parameter="" />
</struts-config>
index.jsp:
<%@page contentType="text/html; charset=GBK"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="ctx" value="${pageContext.request.contextPath}" />
<html>
<head>
<title>My Jsp</title>
</head>
<body>
<a href="${ctx}/login.do?method=get">发言</a>
</body>
</html>
login.jsp:
<%@page contentType="text/html; charset=GBK"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<html>
<head>
<title>My Jsp</title>
</head>
<body>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<!-- 此处必须使用html标签,否则token不能用 -->
<html:form action="login.do?method=login" method="post">
<html:submit value="提交"></html:submit>
</html:form>
</body>
</html>
当你运行第一次的时候,会提示你"成功".
这时我们退到login.jsp查看一下源代码:
<html>
<head>
<title>My Jsp</title>
</head>
<body>
<form name="loginForm" method="post" action="/strutsToken/login.do?method=login">
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
<input type="submit" value="提交">
</form>
</body>
</html>
对比一下我们写的login.jsp多了一个隐藏域:
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
此时生成了一个32位的唯一的JsessionID做为值.
与LoginAction中的get方法的saveToken(request)是一样的.
此句的作用就是把一个jsessionid保存到request范围里.
在我们后退重新调用:
if(this.isTokenValid(request,true))
{
System.out.println("valid");
return mapping.findForward("ok");
}
时,就会拿login.jsp里传过来的jsessionid和request的
进行比较,如果一样,说明不合法.因为我们的操作都是在一个请求会话里
操作的.说明你在重复提交.
如果不一样,说明重新生成了一个唯一的jsessionid(新开一个浏览器),
开启了一个新会话,重新提交,这是合法的.
这样就防止了表单重复提交问题.
分享到:
相关推荐
而Struts1.x的令牌机制(Token)则是防止重复提交、跨页请求攻击的重要手段。在此,我们将深入探讨Struts1.x令牌的使用方法及其背后的原理。 首先,理解为何需要令牌。在Web应用中,用户可能会意外或恶意地多次点击...
1. **启用Token插件**:在Struts2的配置文件`struts.xml`中,需要启用Token拦截器栈,如下所示: ```xml <package name="default" extends="struts-default"> <interceptor-ref name="token"> <!-- 是否将...
1. **令牌生成**:当用户访问一个需要防护的表单页面时,Struts2框架会在服务器端生成一个唯一的令牌,并将其存储在服务器的会话(Session)中。同时,这个令牌会被添加到HTML表单中,通常作为隐藏字段的形式传递给...
1. Token机制概述: Token机制是通过在客户端(浏览器)和服务器之间传递一个唯一的标识符(Token)来防止表单的重复提交。当用户首次提交表单时,服务器生成一个Token并将其存储在服务器端,同时将其作为隐藏字段...
1. **配置Struts2的Token拦截器:** 在struts.xml配置文件中,需要将`token`拦截器加入到默认或者特定的Action配置中。例如: ```xml <interceptor name="token" class="org.apache.struts2.interceptor....
1. **创建Token:** 当用户打开一个需要防止重复提交的表单时,Action类需要生成并设置Token。通常在准备(Prepare)阶段进行,例如在`prepare()`方法中。 ```java public class MyAction extends ActionSupport { ...
1. **创建Token**: 在用户打开表单页面时,服务器生成一个唯一的Token,可以是随机字符串或者结合当前时间戳生成,并将其保存在用户的Session中。同时,将这个Token显示在表单的一个隐藏字段中。 2. **表单提交**: ...
1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <interceptor-ref name="token"/> <result name="success">/success.jsp ...
1. **Token的生成**: 在Struts的Action中,我们可以创建一个Token并将其存储到用户的Session中。例如,我们可以使用`ActionContext`来获取当前的Session,并将Token作为键值对存入。Token的值通常是随机生成的一串...
1. **配置拦截器**:在struts.xml配置文件中,我们需要添加tokenSession拦截器到相应的action配置中。例如: ```xml <interceptor name="tokenSession" class="org.apache.struts2.interceptor....
在Struts框架中,令牌机制(Token)是一种防止重复提交的有效方法,它主要用于处理表单数据的并发控制,防止用户意外或者恶意地多次提交表单,从而确保数据的一致性和安全性。 在Web应用中,用户可能会因为网络延迟...
1. **配置Struts2拦截器**: 首先,我们需要在Struts2的配置文件(struts.xml)中添加Token拦截器。这个拦截器会处理Token的生成和验证过程。例如: ```xml <interceptor name="token" class="org.apache....
<input type="hidden" name="struts.token" value="<s:property value="#session.token"/>" /> ``` 4. **验证Token** 在Action的`execute()`方法中,首先检查Token是否有效。如果Token已经存在于会话中并且与...
1. **生成Token**: 当用户首次访问需要提交表单的页面时,服务器端会生成一个唯一的Token,并将其存储在用户的Session中。 2. **传递Token**: 同时,该Token会被嵌入到表单中作为一个隐藏字段,以便于客户端提交时...
1. **定义Token列表**:使用`ArrayList`来存储每个会话(`HttpSession`)中的Token值。 2. **获取Token列表**: - 方法`getTokenList`用于获取当前会话中的Token列表。如果列表不存在,则创建一个新的列表并将其...
1. 在Struts配置文件(如struts.xml)中添加Token拦截器,并设置拦截规则。 2. 创建Action类,包含业务逻辑,并定义输入和输出对象。 3. 使用Dozer库定义映射规则,将Action的输出对象映射到视图对象。 4. 在JSP或...
1. **配置Action**:在Struts的配置文件(struts.xml或struts.properties)中,为需要防止重复提交的Action添加一个拦截器,通常是`token`和`tokenSession`拦截器。 2. **生成Token**:在Action的准备方法(Prepare...
以下是对Struts1.x中使用Token防止提交的详细说明: 1. **理解Token机制**: Token机制的核心思想是在客户端和服务器之间建立一种绑定关系,每个提交请求都必须携带一个服务器生成并已存储的唯一令牌。如果令牌...
在Struts框架中,Token机制是一个重要的安全特性,用于防止重复提交(Double Submit)和跨页请求伪造(Cross-Site Request Forgery, CSRF)攻击。下面将详细解释Struts Token的工作原理、应用场景以及如何在实际项目...
二、Struts 1.2 Token机制 1. 创建Token 在处理表单提交的Action中,首先生成一个唯一的Token,并将其存储到Session中。这个Token可以是随机生成的一串字符串,或者基于时间戳等信息生成的唯一值。 2. 将Token传递...