`
aiyan2001
  • 浏览: 73428 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts的问题

阅读更多

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

分享到:
评论

相关推荐

    Struts各种问题解决方案

    下面将详细讨论一些常见的Struts问题及其解决方案。 1. **配置问题**: - **Action配置错误**:确保struts.xml文件中的Action配置正确,包括action名称、result类型、namespace等属性。如果找不到Action,检查是否...

    struts中文乱码问题解决详细步骤

    解决这个问题通常涉及到编码设置的调整,下面将详细介绍两种方法来解决Struts中的中文乱码问题。 **方法一:配置Filter** 1. **添加过滤器**:首先,我们需要在Web应用的`web.xml`文件中添加一个`...

    struts上传问题研究

    在"struts上传问题研究"这个主题中,我们将深入探讨Struts2框架中的文件上传功能,以及可能遇到的问题和解决方案。 文件上传是Web应用中常见的功能,Struts2通过Action类的`@FileUpload`注解或`@Params`注解支持...

    Struts2.5.2的配置及问题解决

    本文将详细介绍Struts2.5.2的配置过程以及可能遇到的问题和解决方案。 首先,配置Struts2.5.2需要从官方站点下载所需的jar包。在http://struts.apache.org/download.cgi#struts252上,你可以找到两个选项:1是指...

    struts2讲义 struts2讲义struts2讲义struts2讲义struts2讲义

    - 为了克服这些问题,Apache Software Foundation推出了Struts2,这是一个全新的框架,虽然名称相似,但实际上与原始的Struts框架有着本质的区别。 - **Struts2的特点**: - 更强大的MVC架构支持。 - 内置拦截器...

    Struts2漏洞检查工具Struts2.2019.V2.3

    "Struts2漏洞检查工具Struts2.2019.V2.3"是一个专门针对这些漏洞进行检测的工具,旨在帮助开发者和网络安全专业人员识别并修复Struts2框架中的安全问题。 Struts2的安全漏洞主要包括以下几类: 1. OGNL(Object-...

    Struts2与Struts1区别

    相比之下,Struts2 为每个请求创建一个新的 Action 实例,避免了线程安全问题。 3. **对 Servlet API 的依赖**: - Struts1 的 Action 直接依赖于 Servlet API,请求和响应对象会传入 execute 方法。而 Struts2 ...

    struts2开发遇到的问题

    Struts2 开发常见问题与解决方案 在使用 Struts2 进行开发时,开发者可能会遇到各种问题,这里我们将详细探讨一些典型的问题及其解决方法。 1. **警告:Settings: Could not parse struts.locale setting, ...

    struts2-scan_struts2-scan_struts2scan_scan_struts2漏洞_

    "struts2-scan"工具就是为了解决这样的问题而设计的。它能够自动化地扫描Struts2应用,识别可能存在的安全弱点,帮助开发者或安全团队及时发现并修复这些问题。该工具可能会通过模拟多种攻击向量,如OGNL注入,来...

    struts2 路径问题

    在处理“struts2 路径问题”时,我们主要关注的是Struts2框架中的URL映射和资源定位。这篇博客文章可能探讨了在使用Struts2时遇到的路径相关问题,如Action配置、结果类型、静态资源访问等。 1. **Action配置**:在...

    Struts2.2 升级到Struts2.3

    确保所有相关依赖库(如ognl、freemarker、xwork等)都更新到与Struts2.3.32兼容的版本,避免因版本不匹配导致的运行问题。 2. **配置文件的修改**: - `struts.xml`:这是Struts的核心配置文件,可能会有一些新的...

    struts2框架源码分析及问题汇总

    本文将深入剖析Struts2的源码,揭示其工作原理,并汇总常见问题,帮助开发者更好地理解和使用这个框架。 一、Struts2框架基础 1. 框架结构:Struts2的核心组件包括Action、Result、Interceptor(拦截器)等。...

    留言板留言板struts2留言板struts2

    11. **安全考虑**:Struts2虽然强大,但也需要注意安全性问题,例如XSS、CSRF等。开发者应确保对用户输入进行校验和过滤,使用安全的插件,及时更新Struts2版本以修补潜在的安全漏洞。 以上就是关于"留言板留言板...

    Struts2升级到2.5.30,问题解决及过程记录

    在本文中,我们将探讨将Struts2从旧版本升级到2.5.30的过程中可能遇到的问题及其解决方案。 升级Struts2到2.5.30的主要目标是利用新版本提供的增强功能和安全补丁。Struts2的每个新版本通常会包含对前一版本的兼容...

    struts1和struts2的区别

    相比之下,Struts2的Action为每个请求创建一个新的实例,消除了线程安全问题,简化了资源管理。 在Servlet依赖性上,Struts1的Action直接依赖于Servlet API,执行方法接收HttpServletRequest和HttpServletResponse...

    Struts2VulsTools-Struts2系列漏洞检查工具

    优化部分EXP在部分情况下被WAF拦截的问题,提高检测成功率,优化自定义上传路径exp,文件所在目录不存在时自动创建目录,防止文件因为目录不存在,导致上传失败。 2018-08-24: 增加S2-057 Struts 2.3 to 2.3.34,...

    struts1和struts2区别

    - **Struts2**:Action对象为每个请求创建一个新的实例,消除了线程安全问题,提高了性能。 3. **Servlet依赖**: - **Struts1**:Action直接依赖于Servlet API,需要HttpServletRequest和HttpServletResponse...

    全网最全Struts 2 全版本漏洞检测工具,最新struts漏洞更新

    Struts 2是一款基于Java的开源MVC框架,它在Web应用开发中广泛使用,但同时也因其复杂的架构和历史遗留问题,成为了网络安全的焦点。这个标题提到的是一个全面的Struts 2漏洞检测工具,旨在帮助开发者和安全专家识别...

    struts1&struts2

    - **Struts2** 为每个请求创建新的Action实例,解决了线程安全问题,同时也更易于管理和测试。 5. **Servlet依赖** - **Struts1.x** 的Action类直接依赖于Servlet API,这使得测试变得更加困难。 - **Struts2** ...

Global site tag (gtag.js) - Google Analytics