我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

Struts1.x中的令牌(Token)使用

使用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>
  
<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(新开一个浏览器),
开启了一个新会话,重新提交,这是合法的.
这样就防止了表单重复提交问题.
源码下载

posted on 2008-01-13 23:17 々上善若水々 阅读(5500) 评论(3)  编辑  收藏 所属分类: JavaWeb

评论

# re: Struts1.x中的令牌(Token)使用  回复  更多评论   

非常好,非常好,非常好
2009-06-16 10:04 | GloomySunday

# re: Struts1.x中的令牌(Token)使用[未登录]  回复  更多评论   

11
2013-11-21 14:32 | 1

# re: Struts1.x中的令牌(Token)使用[未登录]  回复  更多评论   

1111
2013-11-21 14:32 | 1

只有注册用户登录后才能发表评论。


网站导航: