Struts 2 异常处理的常用的解决方法
java三种异常处理方法
java三种异常处理方法Java是一种流行的编程语言,但是在编写程序时常常会遇到各种异常。
为了使程序更加健壮和稳定,我们需要使用异常处理机制。
Java中有三种异常处理方法:1. try-catch语句try-catch语句是最常用的异常处理方法。
它的基本语法如下: ```try {// 可能会抛出异常的代码} catch (Exception e) {// 异常处理代码}```在try块中,我们编写可能会抛出异常的代码。
如果这些代码抛出了异常,那么程序就会跳转到catch块中。
catch块中的代码会处理异常,可以输出异常信息,也可以进行其他操作。
2. throws关键字throws关键字可以将异常抛给调用该方法的上一级方法处理。
它的语法如下:```public void method() throws Exception {// 可能会抛出异常的代码}```在方法声明中使用throws关键字,表明该方法可能会抛出某种异常。
如果抛出了异常,异常将会被抛给该方法的调用者处理。
3. finally关键字finally关键字用于编写一段无论是否发生异常都会被执行的代码块。
它的语法如下:```try {// 可能会抛出异常的代码} catch (Exception e) {// 异常处理代码} finally {// 无论是否发生异常都会执行的代码}```在try-catch语句中使用finally块,可以确保无论是否发生异常,finally块中的代码都会被执行。
通常,finally块中会释放资源或者进行一些清理操作。
以上是Java中三种常见的异常处理方法。
在编写程序时,我们应该根据具体情况选择合适的方法处理异常,以保证程序的健壮性和稳定性。
学习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.struts2报错No result defined for action的解决方法 (1)2.ssh环境,Action报错后,此Action其他方法也不能访问 (3)1.struts2报错No result defined for action的解决方法1,在后台action类中重写ActionSupport中的void addActionError(String anErrorMessage)void addActionMessage(String aMessage)void addFieldError(String fieldName, String errorMessage)这三个方法,在并在其实现代码中设置断点,监控传入的参数,并可获知页面的相关报错具体原因.public void addActionError(String anErrorMessage){String s=anErrorMessage;System.out.println(s);}public void addActionMessage(String aMessage){String s=aMessage;System.out.println(s);}public void addFieldError(String fieldName, String errorMessage){String s=errorMessage;String f=fieldName;System.out.println(s);System.out.println(f);}2,在页面中加入以下标签,将错误显示出来:一、addActionError("错误内容"):Action级别的错误消息this.addActionError("错误信息1");this.addActionError("错误信息2");显示消息的标签是:<s:actionerror />显示全部的 Action级别的错误消息,可以加CSS二、addFieldError("字段名","错误信息")给一个字段(属性)添加错误消息this.addFieldError("pwd", "错误信息1");this.addFieldError("pwd", "错误信息2");显示消息的方法1:标签是:<s:fielderror />显示全部的错误消息;显示消息的方法2:<s:fielderror><s:param>field1 </s:param> 显示指定的 field1字段的错误消息<s:param>field2 </s:param> 显示指定的 field2字段的错误消息</s:fielderror>显示消息的方法3:如果什么都不写,则默认显示在相应字段上方三、addActionMessage("相关信息")需要在action中重写父类的validate方法,对参数进行校验,如果校验失败。
模块异常2处理方法
模块异常2处理方法模块异常处理方法模块异常是指在程序运行过程中,模块出现了意料之外的错误或者异常情况。
如何处理模块异常是每个程序员都必须掌握的技能。
在这里,将介绍几种处理模块异常的方法。
一、异常捕获和处理异常捕获和处理是最常用的处理模块异常的方法。
当程序运行过程中出现异常情况时,程序会自动跳转到异常处理程序所在的方法,并且执行后续的处理。
在程序中,可以使用try-catch语句来实现异常捕获和处理。
try{// 可能出现异常的代码块}catch(Exception e){// 异常处理代码块}其中,try语句块中包含可能出现异常的代码,catch语句块中包含异常处理代码。
当try语句块中出现了异常情况,程序会自动跳转到catch语句块进行异常处理。
因此,程序员需要在catch语句块中编写恰当的处理代码来解决异常问题。
二、日志记录日志记录是处理模块异常的另一种方法。
当程序出现异常情况时,程序可以通过日志记录系统将异常信息记录到日志文件中。
这些日志文件可以用于以后的分析和调试,帮助程序员更快地定位和解决问题。
一般来说,日志记录有两个级别:信息级别和错误级别。
对于信息级别的日志记录,程序通常记录程序执行过程中的一些关键信息,比如程序运行状态、数据交换情况等等。
对于错误级别的日志记录,程序将记录一些错误信息,比如程序崩溃、文件读写错误等等。
三、异常抛出异常抛出是一种将异常信息传递给其他方法或调用者的方法。
当一个方法出现异常情况时,程序可以通过它抛出异常的方式将异常信息传递给调用者或其他方法。
这样,调用者就可以更好地处理异常情况。
在Java中,可以通过throw关键字来抛出异常。
例如:if(a < 0){throw new Exception("a不能是负数");}在上述代码中,如果变量a小于0,程序会抛出一个异常,并且在异常信息中包含"a不能是负数"的提示。
struts2传值出现乱码问题
1、在struts.xml文件中添加:<constant name="struts.i18n.encoding" value="gb2312" />页面编码格式如果是gb2312那么value值就写gb2312,页面编码如果是GBK那么value值就写GBK;总之页面什么编码格式这里的value就写什么格式。
这样简单语句话就解决了乱码问题如下:<struts><constant name="struts.i18n.encoding" value="gb2312" /><package name="com" extends="convention-default">............</struts>2、url传值到Action的乱码解决方法jsp页面 URL传中文参数到Action里面出现乱码,用过滤器和控制器都解决不了,用了我两个多小时解决这个小问题!解决方法有以下几种:第一种:在Action中用 new String(str.getBytes("ISO8859_1"), "UTF8"),进行转码,因为传递的时候,中文默人的是ISO8859_1第二种:可通过配置TOMCAT来解决此问题,具体解决方法如下:在tomcat的server.xml里,找到<Connector port="8080"maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" redirectPort="8443"acceptCount="100"debug="0" connectionTimeout="20000"disableUploadTimeout="true"useBodyEncodingForURI="true" URIEncoding="gbk">其中是修改 disableUploadTimeout="true" useBodyEncodingForURI="true" URIEncoding="gbk" 其方法是防止在url中出现乱码然后在每个Jsp页面添加如下代码<%@ page pageEncoding=”gb2312″%><%@ page contentType=”text/html;charset=gb2312″%><%request.setCharacterEncoding(”gb2312″);%>第三种:直接在ACTION中利用以下方法解决:request.setCharacterEncoding("gb2312");response.setCharacterEncoding("gb2312");我用的是struct1.2+Hibernate3.0+Spring2.0在做那个两个action的页面的时候,jsp页面的下拉列表通过actionForm传值给action,老是得到乱码,过滤器+server.xml+页面编码统一后,仍不能解决。
struts2漏洞解决方案
struts2漏洞解决方案对于Struts2漏洞的修复和预防是非常重要的,因为它可能导致严重的安全问题和系统遭受攻击。
在本文中,我们将介绍一些可行的解决方案和建议,以帮助您防范和修复Struts2漏洞。
1. 及时更新Struts2框架版本Struts2团队经常发布新版本来修复安全漏洞和其他bug。
您应该始终关注Struts2的官方网站,了解最新版本的发布情况,并尽快将您的应用程序升级到最新版本。
新版本通常会修复旧版本中存在的已知漏洞,并提供更好的安全性和稳定性。
2. 安全配置在您的Struts2应用程序中,您可以配置一些安全设置来增加系统的安全性。
例如,可以禁用用于开发和调试的Struts2调试模式,禁用动态方法调用,并且仅允许受信任的主机进行访问。
这些配置可以减少潜在的攻击面并增强您的应用程序的安全性。
3. 过滤用户输入用户输入是导致Struts2漏洞的常见来源之一。
为了避免潜在的安全问题,您应该始终对用户的输入数据进行有效的过滤和验证。
使用适当的输入验证和过滤技术,如正则表达式、白名单和黑名单等,可以防止常见的漏洞攻击,如SQL注入和跨站脚本攻击。
4. 使用安全框架或插件除了Struts2框架本身的安全性措施外,您还可以考虑使用安全框架或插件来增强您的应用程序的安全性。
例如,Apache Shiro是一个强大而灵活的安全框架,可以与Struts2无缝集成,并提供更高级的安全功能,如认证、授权和会话管理等。
5. 日志和监控为了及时发现和应对潜在的Struts2漏洞攻击,您应该启用详细的日志记录和监控机制。
定期审查日志记录,以便及早识别异常活动和攻击尝试。
同时,您还可以使用安全监控工具来实时监视您的应用程序,以便及时发现和应对任何安全威胁。
总结:通过及时更新Struts2框架版本、配置安全设置、过滤用户输入、使用安全框架或插件以及启用日志和监控机制,您可以有效地解决和预防Struts2漏洞。
在保障应用程序的安全性方面,持续的关注和努力非常重要。
struts2 error处理
struts2 error处理Struts2错误处理可以通过以下几种方式进行处理:1. 全局异常处理器(Global Exception Handler):可以通过实现`com.opensymphony.xwork2.Action`接口,并定义`execute()`方法来处理所有的异常。
在struts.xml配置文件中添加如下内容:```xml<global-exception-mappings><exception-mapping exception="ng.Exception"result="error" /></global-exception-mappings>```2. Action级别的异常处理器:每个Action类可以通过实现`com.opensymphony.xwork2.Action`接口,并定义`execute()`方法来处理特定的异常。
在struts.xml配置文件中,为每个使用自定义处理器的Action配置异常处理器:```xml<action name="example" class="com.example.ExampleAction"> <exception-mapping exception="ng.Exception"result="error" /><result name="error">/error.jsp</result><result>/example.jsp</result></action>```3. 拦截器异常处理器:Struts2中的拦截器可以捕获并处理Action方法中的异常。
可以通过自定义拦截器来实现异常处理,然后在struts.xml配置文件中使用:```xml<action name="example" class="com.example.ExampleAction"><interceptor-ref name="exceptionInterceptor" /><result>/example.jsp</result></action>```以上是Struts2错误处理的几种典型方法,可以根据具体需求选择适合的方式进行处理。
Struts2的配置文件详解
1.3.包含配置:
在Struts2中可以将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。
<struts>
<includefile="struts-default.xml"/>
<includefile="struts-user.xml"/>
erName= userName;
}
/**
*@returnthepassword
*/
publicString getPassword() {
returnpassword;
}
/**
*@parampasswordthepasswordtoset
*/
publicvoidsetPassword(String password) {
</action>
</package>
</struts>
如上示例的配置,配置了一个名为default的包,该包下定义了一个Action。
1.2.命名空间配置:
考虑到同一个Web应用中需要同名的Action,Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
Struts2通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。
l public Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例。
l public void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。
常见异常
提示ng.UnsupportedClassVersionError: Bad version numberin .class fileMyeclipse 使用的JDK和Tomcat使用的JDK版本不一致解决方法:把它们的JDK版本改成一致步骤如下:1.Window --> Preferences -->Java --> compiler中的compiler compliance level对应的下拉菜单中选择JDK版本.2.Window --> Preferences -->MyEclipse --> Servers -->Tomcat --> Tomcat n.x -->JDK中的Tomcat JDK name下的下拉菜单中选择自身电脑上安装的JDK 版本1 、缺少文件上传JAR包commons-io-1.3.1.jar commons-fileupload-1.2.jarUnable to load beanorg.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]这个问题是在使用Struts2想做一个上传文件的页面时候Tomcat报出来的错误,详细信息如下:2007-7-19 21:34:09 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for servlet jsp threw exceptionng.RuntimeException: Unable to load beanorg.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]问题描述:使用Struts2.0.6+Sitemesh2.2.1+Freemark2.3.8的过程中,装饰Action请求的结果页面不会有问题,但是如果装饰直接访问的JSP页面会出现如下错误:java 代码1. javax.servlet.ServletException: Error applying decorator: null解决方案:经过调试发现是FreeMarkerPageFilter的getLocale方法没有对invocation添加非空判断造成的,错误代码如下:java 代码1. protected Locale getLocale(ActionInvocation invocation, Configurationconfiguration) {2. if (invocation.getAction() instanceof LocaleProvider) {3. return ((LocaleProvider) invocation.getAction()).getLocale();4. } else {5. return configuration.getLocale();6. }7. }改正后的代码如下:java 代码1. protected Locale getLocale(ActionInvocation invocation, Configurationconfiguration) {2. if (invocation != null && invocation.getAction() instanceof LocaleProvider) {3. return ((LocaleProvider) invocation.getAction()).getLocale();4. } else {5. return configuration.getLocale();6. }7. }问题描述:使用Struts2.0.6+Sitemesh2.2.3,我有一个请求/customer/page.action,其结果页面为WEB-INF/jsp/customer/list.jsp,我希望使用main装饰器对返回结果进行装饰,如果配置如下:xml 代码1. <decorator name="main" page="main.ftl">2. <pattern>/WEB-INF/jsp/customer/list.jsppattern>3. decorator>则无法成功进行装饰,如果配置如下:xml 代码1. <decorator name="main" page="main.ftl">2. <pattern>/*pattern>3. decorator>则可以成功进行装饰。
Struts2的Action被无故执行2次或执行多次
Struts2的Action被无故执行2次或执行多次
又郁闷了...
哎,...我都不想开Log4j了...
一开,一看,N多错误...
标题那个错误...有点搞笑...
具体是,你发出一个请求 ..../.../ssss.action
然后,你得到了一个结果...
好,你觉得你成功了!
但是一看后台(或者日志)
...
发现,你请求了一次,日志却出现了2次,而且是2次相同的...
吓死你...
然后你不信,以为日志错了,断点一看...
果然,一个Action被执行了2次!(甚至有多次的情况)
...
后来...
哎,原因在这里!
出现这种情况的人都是用 SSS!SSSS.action 来执行的
也就是说一个 Action类中,有N个方法被当成Action来用
...
具体就是你的方法名用了 getXXX 为方法名
也就是说,如果你的Action是一个方法,而且以叹号的方式请求,方法还以get开头
如:getUserById() 、getACL() 等...
那么...你就会出现上面的错误...
解决方法很简单,帮你的方法换个名字
如:loadUserById()... 哎...继续。
struts2 漏洞原理
struts2 漏洞原理Struts2 是一种开放源代码的 Java Web 应用框架,被广泛应用于构建 Web 应用程序。
然而,Struts2 框架的一个漏洞却给许多应用程序带来了安全隐患。
本文将解释Struts2 漏洞的原理,并提供对于修复漏洞的一些方法。
Struts2 框架漏洞的原理Struts2 框架漏洞源于框架自身的设计缺陷。
设计缺陷使得攻击者可以利用恶意的输入来欺骗 Struts2 框架,从而在应用程序中执行任意的代码。
这种攻击就被称为“远程代码执行攻击”( Remote Code ExecutionAttack )。
Struts2 框架的漏洞主要是由于以下两点原因所导致的:· Struts2 使用了 OGNL (Object-Graph Navigation Language) 来解析 EL (Expression Language) 表达式,但没有正确地对表达式进行过滤,这使得恶意行为成为可能。
· Struts2 框架中的相当一部分功能是通过拦截器来实现的。
攻击者可以利用 Struts2 框架中的拦截器漏洞,绕过应用程序的权限控制来访问关键数据或者执行任意代码。
这两点都是 Struts2 框架漏洞的主因。
攻击者可以利用这两个漏洞来构建恶意的请求,并欺骗 Struts2 框架来执行恶意代码。
导致 Struts2 漏洞的例子为了更好地理解 Struts2 漏洞,可以通过一些例子来说明。
以下是一些可能导致 Struts2 框架漏洞的例子:· 未正确过滤用户输入。
比如在 Struts2 编译以数据表格为基础的应用程序时,如果没有过滤 script 标记,那么攻击者就可以通过执行JavaScript来远程控制代码,这就是远程代码执行攻击。
· XML SSI 漏洞。
攻击者可以通过将恶意代码嵌入到XML 消息中来利用该漏洞。
此漏洞允许攻击者利用Struts2 使用 XML 包含的注入布局中的初始资源解析器来绕过安全检查并完成任意文件读取/写入操作。
Unabletoloadconfiguration(无法加载配置)的原因和解决方法
Unabletoloadconfiguration(⽆法加载配置)的原因和解决⽅法启动Tomcat时,提⽰如下错误信息:2012-11-6 15:20:12 org.apache.catalina.core.StandardContext filterStart严重: Exception starting filter MyStruts2Unable to load configuration. - bean - jar:file:/F:/Web/homesite/jsp/struts/WEB-INF/lib/struts2-convention-plugin-2.1.6.jar!/struts-plugin.xml:30:119at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:360)at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:403)at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:190)at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3693).......[原因&解决]:这是apache的失误。
struts2异常拦截处理
struts2异常拦截处理在实际开发中,我们需要将捕获的异常信息打印出来,换上通俗的语言让客户能够大概了解是原因引起的异常,所以我们需要将异常信息显示到页面上来,让客户能够看得见。
这里介绍以下struts2的异常处理机制。
在sturts2的struts-default.xml中,引用了struts2定义的拦截器:<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/下面是一个小例子来说明struts2中,应该如何捕获异常信息,并将异常信息显示到页面:一个简单的index.jsp页面,只有一个按钮,点击进入action:<s:form action="login"><s:submit value="submit"/></s:form>struts.xml的配置:<struts><package name="Action" extends="struts-default"><global-results><result name="all">/error.jsp</result></global-results><global-exception-mappings><exception-mapping result="all" exception="ng.Exception"></exception-mapping></global-exception-mappings><action name="login" class="com.action.LoginAction"><result name="success">/success.jsp</result></action></package></struts>Action:public class LoginAction extends ActionSupport {@Overridepublic String execute() throws Exception {try{int i = 9/0;}catch (Exception e) {throw new Exception(e);}return "success";}}打印错误信息的页面 error.jsp:<body><s:property value="exception.message"/></body>这样就可以把异常信息打印到指定的页面,当然也可以在struts.xml中定义局部的异常映射信息。
struts2_异常处理
Struts2___异常处理Struts2提供声明式的异常处理方式,内部通过配置的拦截器来实现,默认异常拦截器:com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor这样我们不需要在Action方法中catch异常,只需抛出相关的异常,都交由拦截器处理通过异常映射配置:<exception-mapping>元素exception属性:指定该异常映射所设置的异常类型result属性:指定Action出现该异常时,跳转到result属性所指向的结果异常映射类别分为两种:局部异常映射:<exception-mapping>配置<action name="exceptionAction"class="org.struts2.ch6.action.ExceptionAction"> <!-- 局部异常映射当Action 抛出指定异常时显示名为book_error指定的页面--><exception-mapping result="book_error"exception="ng.IllegalArgumentException"/><result>/ch6/book_add.jsp</result><result name="book_error">/ch6/book_error.jsp</result></action>全局异常映射:<global-exception-mappings>和<exception-mapping>配置<global-results><result name="error">/ch6/error.jsp</result></global-results><global-exception-mappings><exception-mapping result="error"exception="ng.Exception"/> </global-exception-mappings>页面输出异常信息:异常对象被封装成ExceptionHolder对象,压入ValueStack中<s:property value="exception.message"/> 输出异常对象消息<s:property value="exceptionStack"/> 输出异常堆栈信息Struts2 拦截器工作原理UML时序图:Struts2___类型转换◆内置的类型转换Stringboolean/Booleanchar/Characterint/Integer,float/Float,long/Long,double/Double date 默认时间格式为yyyy-MM-dd(当前时区的SHORT格式)数组假设每个单独的字符串都能转换成数组中元素的类型集合如果不能确定集合中元素的类型,会默认是String类型,并创建一个新的ArrayList对象◆自定义类型转换器主要方式:a.继承DefaultTypeConverter,重写convertValue方法b.继承StrutsTypeConverter,重写convertFromString和convertToString方法(推荐)public class DateTypeConverter extends StrutsTypeConverter {private String[] pattern = {"yyyy-MM-dd HH:mm:ss","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd","yyyy/MM/dd"};private SimpleDateFormat sdf=new SimpleDateFormat();/*** @param context action上下文* values[] 需要转换的String数组* toClass 转换后的目标类型** @return返回转换后的目标对象*/public Object convertFromString(Map context, String[] values, Class toClass) { /** 使用指定的日期格式解析字符串值,返回Date对象*/Date date=null;if(toClass==Date.class && values.length>0){if(values[0]!=null && !"".equals(values[0])){System.out.println("接收的参数值:"+values[0]);date=parse(values[0]);if(date==null){/** 解析出现异常,抛出TypeConversionException异常,以通知Struts2发生了转换错误*/System.out.println("抛出类型转换异常,通知struts处理");throw new TypeConversionException("类型转换异常");}}System.out.println("转换后的值:"+date);return date;}return null;}public String convertToString(Map context, Object o) {/**使用指定的日期格式格式化Date对象,返回字符串*/return sdf.format(o);private Date parse(String source) {for(String fmt:pattern){Date d=convert(source,fmt);if(d!=null){return d;}}return null;}private Date convert(String source, String fmt) { try {sdf.applyPattern(fmt);Date v = sdf.parse(source);return v;}catch (ParseException e) {return null;}}自定义类型转换器的注册方式:A、局部类型转换器:针对某个ActionB、全局类型转换器:针对所有ActionC、使用JDK1.5的注释1.局部类型转换器提供如下格式的properties 文件,存放在Action类同一路径下文件名:action类名-conversion.properties内容: Action属性名=转换器全路径类名如:birthday=org.struts2.ch6.conversion.DateTypeConverter2、全局类型转换器(一般使用)提供如下格式的文件,存放位置:WEB-INF/classes/目录下文件名: xwork-conversion.properties内容:需要转换的全路径的类名=转换器全路径类名如:java.Util.Date=org.struts2.ch6.conversion.DateTypeConverter 类型转换的流程(String转对应类型)类型转换异常提示处理类型转换由conversionError拦截器处理出错返回input指向页面使用<s:fielderror/>显示错误信息##默认类型转换错误消息(一般使用) 一般定义在全局资源包文件中xwork.default.invalid.fieldvalue=this.field{0}value invalid ##局部类型转换错误消息显示(一般定义action级别资源包)invalid.fieldvalue.属性名=错误提示invalid.fieldvalue.birthday=birthday convert error!!!示例参见ch6。
struts2.2.1文件下载及中文乱码问题解决
Struts2下载文件实现的说明contentType内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片inputName下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法contentDisposition文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。
取值为:attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。
如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline;filename="struts2.txt"bufferSize下载缓冲区的大小contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。
如下例:down.jsp<a href="<s:url value='test/fileDown.do?fileName=struts2配置参数详解.txt'> </s:url>">下载</a>struts.xml配置:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="com" namespace="/test" extends="struts-default"><action name="fileDown" class=".down.FileDown"><result type="stream"><!-- 下载文件类型定义--><param name="contentType">application/octet-stream</param><!-- 下载文件输出流定义--><param name="inputName">inputStream</param><!-- 下载文件处理方法--><param name="contentDisposition">attachment;filename="${fileName}"</param><!-- 下载文件的缓冲大小--><param name="bufferSize">4096</param></result></action></package></struts>文件下载Action:public class FileDown extends ActionSupport {private String fileName;public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public InputStream getInputStream() throws UnsupportedEncodingException {return ServletActionContext.getServletContext().getResourceAsStream( "/WEB-INF/" + fileName);}public String execute(){System.out.println(fileName+"----------");return "success";}}这个例子运行可,可能会出现:下载页面的文件名为:fileDown.do或htm等情况。
struts2漏洞自查报告
struts2漏洞自查报告struts2漏洞原理及解决办法1、原理Struts2的核心是使用的webwork框架,处理action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。
当我们提交一个http参数:user.address.city=Bishkek&user['favoriteDrink 9;]=kumysONGL将它转换为:action.getUser().getAddress().setCity("Bishkek") action.getUser().setFavoriteDrink("kumys")这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用ValueStack.setValue()。
为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,但如果使用了Java的unicode字符串表示\u0023,攻击者就可以绕过保护,修改保护Java方式执行的值:此处代码有破坏性,请在测试环境执行,严禁用此种方法进行恶意攻击('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023contex t[\'xwork.MethodAccessor.denyMethodExecution\' ]\u003d\u0023foo')(\u0023foo\u003dnew%ng. Boolean("false")))&(asdf)(('\u0023rt.ex it(1)')(\u0023rt\***************.Runtime@getRuntime ()))=1转义后是这样:('#_memberAccess['allowStaticMethodAccess 9;]')(meh)=true&(aaa)(('#context['xwork. MethodAccessor.denyMethodExecution']=#foo')(#f oo=new%ng.Boolean("false")))&(as df)(('#rt.exit(1)')(#rt=@ng.Runtime@getRunt ime()))=1OGNL处理时最终的结果就是ng.Runtime.getRuntime().exit(1); //关闭程序,即将web程序关闭类似的可以执行ng.Runtime.getRuntime().exec("net user 用户名密码/add");//增加操作系统用户,在有权限的情况下能成功(在URL中用%20替换空格,%2F替换/)只要有权限就可以执行任何DOS命令。
异常处理的方法及步骤
异常处理的方法及步骤引言:在编程过程中,我们经常会遇到各种各样的异常情况。
为了保证程序的稳定性和可靠性,我们需要对这些异常情况进行处理。
异常处理是指程序在运行过程中遇到错误或异常情况时,能够做出相应的处理措施,以保证程序的正常运行。
本文将介绍异常处理的方法及步骤,帮助读者更好地理解和应用异常处理的技术。
一、异常处理的方法1. try-catch块:try-catch块是最基本的异常处理方法。
它的结构如下:```try {// 可能会产生异常的代码} catch (Exception e) {// 异常处理代码}```在try块中,我们放置可能会产生异常的代码。
当这些代码运行时,如果产生了异常,程序会立即跳转到catch块,并执行catch块中的代码,以处理异常。
catch块中的Exception e是用来接收异常信息的变量,我们可以通过这个变量来获取异常的相关信息,并做出相应的处理。
2. 多个catch块:有时候,我们可能会遇到多种类型的异常,每种异常需要做出不同的处理。
这时,我们可以使用多个catch块来分别处理不同类型的异常,如下所示:```try {// 可能会产生异常的代码} catch (ExceptionType1 e1) {// 异常处理代码1} catch (ExceptionType2 e2) {// 异常处理代码2}```在多个catch块中,我们可以根据具体的异常类型来编写不同的处理代码。
当产生异常时,程序会根据异常类型的匹配情况,选择相应的catch块来执行。
3. finally块:有时候,我们希望无论是否发生异常,都能执行一些必要的代码,比如释放资源等。
这时,我们可以使用finally块来实现这个需求,如下所示:```try {// 可能会产生异常的代码} catch (Exception e) {// 异常处理代码} finally {// 必要的代码}```在finally块中的代码,无论是否发生异常,都会被执行。
Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射
}
public String getName() {
return name;
}
public void setName(String name) {
= name;
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
er = user;
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
或者使用myeclipse经常用的,指定basePath。
Action Method
配置:
<package name="user" extends="struts-default" namespace="/user">
<action name="userAdd" class="erAction" method="add">
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、第一个异常处理
严重: Servlet.service() for servlet jsp threw exception
The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]
at org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:60)
at
org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:44) at
ponentTagSupport.doStartTag(ComponentTagSupport.java:48) at
_005fstruts2_005flz.YpxxbQuery_jsp._jspx_meth_s_005fdebug_005f0(Ypxxb Query_jsp.java:108)
at
_005fstruts2_005flz.YpxxbQuery_jsp._jspService(YpxxbQuery_jsp.java:83)
解决的办法:(4种解决方案)
1.
web.xml 中添加一个filter
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/action/*</url-pattern>
</filter-mapping>
2.
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意<url-pattern>这里一定要是/*
3.
这通常是由于不经由Filter访问包含struts标签的jsp页面导致的。
那么,只要通过配置,使得对jsp页面的访问请求由Filter过滤转发即可。
方法1:在strut.xml中配置一个通用Action,通过这个Action转发到jsp页面。
这个时候,原先访问jsp的请求路径就要换成相应的Action路径了。
写法如下。
<action name="*">
<result>/{1}.jsp</result>
</action>
方法2:在web.xml中配置Filter的url-parttern。
写法如下。
其中struts2-dispatcher 是已定义的Filter。
<filter-mapping>
<filter-name>struts2-dispatcher</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2-dispatcher</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
方法3:在web.xml中配置扩展名。
写法如下。
配置完成后,就可以这样访问了:http://localhost:8080/yk_cpp/public/index.html
在web.xml中加
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>html</param-value>
</init-param>
在struts.xml中加
<constant name="struts.action.extension" value="html" />
方法4:修改struts.properties文件。
去struts2的包里看一下default.properties,里面默认的action 是struts.action.extension=action,,(注意有两个逗号,意思是第二个配置是空)空是全部拦截。
在这里修改要拦截的带扩展名的文件,比如struts.action.extension=action,jnlp,do
不过这些没有经过测试;因为我的本地服务器没有出500的错误,问题是出在正式服务器上的,所以没法调试。
下次设法在本地重现一下问题,然后挨个试一试。
4.
操作:struts2中直接访问jsp
异常:The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag.
环境:struts2
原因:如果想要在jsp文件中,采用 struts的tag,那么jsp必须是通过action跳转得到,也就是必须通过web.xml所配置的过滤器访问文件,否则会有异常。
解决办法:
方案一:将web.xml 的过滤器,从 *.action 修改为: /* 。
方案二:web.xml 中添加一个filter?
?<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/action/*</url-pattern>
</filter-mapping>。