R工具简介

R工具,是request、response工具,封闭了实用的操作request、response、session的方法。

R工具中,提供了大量的从Request获取参数并转换为合适的类型的简便方法--是对getParameter()的封装(是最常使用工具方法)

在做web开发时,使用R工具,可以方便开发工作。

R工具使用注意事项

只可以controller层使用R工具。

禁止在service、dao层使用R工具,因为R工具依赖servlet环境的request,会导致无法运行单元测试。

R工具的API

(标红色的表示常用)

方法 说明

HttpServletRequest getRequest()

获得Request

HttpServletResponse getResponse()

获取Response

HttpSession getSession()

获取session

String get(String paramName )

最常用使用的方法

从Request中获取参数的值,并转换为String类型,并trim去掉前后半角空格
是对getParameter()方法的封装,是最常使用工具方法
如果Request中无此参数(==null),则返回null。
如果Request中参数值是"",则返回""。

会对参数值使用trim()去掉前后的空格

String get(String paramName , String defaultValue ) 从Request中获取参数的值,并转换为String类型,并trim去掉前后半角空格

是对getParameter()方法的封装,是最常使用工具方法
如果Request中无此参数(==null),则返回默认值。
如果Request中参数值是"",则返回""。

String[] getArray(String paramName ) 如果一个key对应多个value,可以使用 String[] getArray(String paramName) 方法获取
Map<String, String> getMap() 获取Request中的全部参数(如果一个key对应多个value,只保留第一个value)
Map<String,String[]> getMapAll() 获取Request中的全部参数(一个key可以对应多个value)
LinkedHashMap<String, String> getPrameterWithPrefix(String prefix , boolean usefullname ) 根据前缀名,取出一批值,是request.getParameter()的一个便捷工具方法

使用场景:当表单提交上来的数据有统一的前缀(attr_name,attr_image,attr_path)但数量不确定时,可使用本工具方法来取值。
使用示例:Map<String, String> attr = R.getPrameterWithPrefix(request, "attr_",false);
@param prefix 前缀
@param usefullname key名称的处理,是:表示保留前缀,否:截掉前缀。一般为false

String getIpAddress(HttpServletRequest request )

获取用户真实IP地址(只能获得用户的公网出口IP)

1、当客户端使用了透明代理时,可以通过本方法获取用户的公网出口IP。
2、当服务端使用反向代理时,request.getRemoteAddr()取到的是服务端的前端代理的局域网IP,可以通过本方法获取用户的公网出口IP。
3、当客户端使用了匿名代理时,无法获得用户的公网出口IP
4、当客户端在路由器内,无法获得用户的局域网IP

如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,要取X-Forwarded-For中第一个非unknown的有效IP字符串。
如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用户真实IP为: 192.168.1.110

String getCtx()

获取应用上下文的根路径

void writeJson(String json ,String encoding )

用Response写出 json

void writeHtml(String html ,String encoding )

用Response写出 html

String getAllParameter()

从Request中取出所有参数,拼成一个串:a=1&a=2&b=2&c=3
注意:a有两个值,分别是1和2,当使用复选框提交数据时会出现这种情况

void redirect(String url )

重定向

void forward(String path )

转发请求

void setAttr(String key ,Object value )

R工具中,void setAttr(String key,Object value) -- 是对setAttribute()的封装

Object getAttr(String key )

R工具中,Object getAttr(String key) -- 是对getAttribute()的封装

Float getFloat(String paramName , Float defaultValue )

从Request中获取参数的值,并转换为Float类型

如果Request中无此参数(==null),则返回默认值。
如果Request中有此参数,但在转换为Float类型是发生异常,则返回默认值。
如果Request中参数值是"1.5",则返回1.5。

@param paramName 参数名称
@param defaultValue 默认值,可传入null
@return Float类型的参数值

Float getFloat(String paramName )

从Request中获取参数的值,并转换为Float类型

如果Request中无此参数(==null),则返回null。
如果Request中有此参数,但在转换为Float类型是发生异常,则返回null。
如果Request中参数值是"1.5",则返回1.5。

@param paramName 参数名称
@return Float类型的参数值

Boolean getBoolean(String paramName , Boolean defaultValue )

从Request中获取参数的值("true","false"),并转换为Boolean类型

如果Request中无此参数(==null),则返回默认值。
如果Request中参数值是"true",则返回true。
如果Request中参数值是非"true",则返回false。

@param paramName 参数名称
@param defaultValue 默认值,可传入null
@return Boolean类型的参数值

Boolean getBoolean(String paramName )

从Request中获取参数的值("true","false"),并转换为Boolean类型

如果Request中无此参数(==null),则返回null。
如果Request中参数值是"true",则返回true。
如果Request中参数值是非"true",则返回false。

@param paramName 参数名称
@return Boolean类型的参数值

Boolean getBoolean4Int(String paramName , int _true )

从Request中获取参数的值("1","0",等等int值),并转换为Boolean类型
如果Request中无此参数(==null),则返回false

@param paramName 参数名称
@param _true 指定什么值代表true,若为1表示如果值是1就表示true,其它表示false。
@return Boolean类型的参数值

Boolean getBoolean4Int(String paramName )

从Request中获取参数的值, 如果遇到1就返回true,否则返回false
如果Request中无此参数(==null),则返回false

@param paramName 参数名称
@return Boolean类型的参数值

Double getDouble(String paramName , Double defaultValue )

从Request中获取参数的值,并转换为Double类型

如果Request中无此参数(==null),则返回默认值。
如果Request中有此参数,但在转换为Double类型是发生异常,则返回默认值。
如果Request中参数值是"1.5",则返回1.5。

@param paramName 参数名称
@param defaultValue 默认值,可传入null
@return Double类型的参数值

Double getDouble(String paramName )

从Request中获取参数的值,并转换为Double类型

如果Request中无此参数(==null),则返回null。
如果Request中有此参数,但在转换为Double类型是发生异常,则返回null。
如果Request中参数值是"1.5",则返回1.5。

@param paramName 参数名称
@return Double类型的参数值

Integer getInteger(String paramName , Integer defaultValue )

从Request中获取参数的值,并转换为Integer类型

如果Request中无此参数(==null),则返回默认值。
如果Request中有此参数,但在转换为Integer类型是发生异常,则返回默认值。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@param defaultValue 默认值,可传入null
@return Integer类型的参数值

Integer getInteger(String paramName )

从Request中获取参数的值,并转换为Integer类型

如果Request中无此参数(==null),则返回null。
如果Request中有此参数,但在转换为Integer类型是发生异常,则返回null。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@return Integer类型的参数值

Long getLong(String paramName , Long defaultValue )

从Request中获取参数的值,并转换为Long类型

如果Request中无此参数(==null),则返回默认值。
如果Request中有此参数,但在转换为Long类型是发生异常,则返回默认值。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@param defaultValue 默认值,可传入null
@return Long类型的参数值

Long getLong(String paramName )

从Request中获取参数的值,并转换为Long类型

如果Request中无此参数(==null),则返回null。
如果Request中有此参数,但在转换为Long类型是发生异常,则返回null。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@return Long类型的参数值

Byte getByte(String paramName , Byte defaultValue )

从Request中获取参数的值,并转换为Byte类型

如果Request中无此参数(==null),则返回默认值。
如果Request中有此参数,但在转换为Byte类型是发生异常,则返回默认值。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@param defaultValue 默认值,可传入null
@return Byte类型的参数值

Byte getByte(String paramName )

从Request中获取参数的值,并转换为Byte类型

如果Request中无此参数(==null),则返回null。
如果Request中有此参数,但在转换为Byte类型是发生异常,则返回null。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@return Byte类型的参数值

Short getShort(String paramName , Short defaultValue )

从Request中获取参数的值,并转换为Short类型

如果Request中无此参数(==null),则返回默认值。
如果Request中有此参数,但在转换为Short类型是发生异常,则返回默认值。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@param defaultValue 默认值,可传入null
@return Short类型的参数值

Short getShort(String paramName )

从Request中获取参数的值,并转换为Short类型

如果Request中无此参数(==null),则返回null。
如果Request中有此参数,但在转换为Short类型是发生异常,则返回null。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@return Short类型的参数值

Date getDate(String paramName , String format ,Date defaultValue )

从Request中获取参数的值,并转换为Date类型

如果Request中无此参数(==null),则返回默认值。
如果Request中有此参数,但在转换为Date类型是发生异常,则返回默认值。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@param format 日期时间的格式,一般如:"yyyy-MM-dd HH:mm:ss"
@param defaultValue 默认值,可传入null
@return Date类型的参数值

Date getDate(String paramName , String format )

从Request中获取参数的值,并转换为Date类型

如果Request中无此参数(==null),则返回null。
如果Request中有此参数,但在转换为Date类型是发生异常,则返回null。
如果Request中参数值是"1",则返回1。

@param paramName 参数名称
@param format 日期时间的格式,一般如:"yyyy-MM-dd HH:mm:ss"
@return Date类型的参数值


R工具的配置

使用R工具前,应先在web.xml中进行配置。

一般情况下请使用“配置2”。

“配置1”与“配置2”,至少使用一个,两个都使用也中以。R工具在取request时,先查找“配置1”再查找“配置2”。

配置1

优点:

  1. 在Controller内使用R工具没有问题,表示都很好。
  2. 由于使用的是listener,不需要考虑在web.xml中的配置的顺序问题。遇到特殊情况举例一、二,在Controller内总能拿到最终的request。

缺点:

  1. 在Controller外比如Filter中,无法取到Response,取到null。
  2. 在Controller外比如Filter中,遇到特殊情况举例二,取到的request是不对的,取到的是原始的request,我想取最终的request。(使用了DelegatingFilterProxy也不行)
  3. 网上说在Controller内,遇到特殊情况举例三,无法取到参数。
<!-- 在spring mvc中,为了随时都能取到当前请求的request对象,可以使用RequestContextHolder,需要配置RequestContextListener -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

配置2

缺点:由于使用的是filter,需要考虑在web.xml中的配置的顺序问题。遇到特殊情况举例一、二时,“特殊情况举例一、二”的filter要在前面,R工具的filter要在后面。这个R工具取出的Request才是被增强过的。

优点:在Controller外比如Filter中(注意顺序),都工作正常。

 	<!-- R工具过滤器 -->
	<filter>
		<filter-name>r</filter-name>
		<filter-class>com.sicheng.common.web.R</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>r</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>	

特殊情况举例一

HttpServletRequestWrapper类给了我们对Request进行包装增强的机会。

本系统中就有防止 xss 攻击过滤器:com.sicheng.common.xss.XssFilter,使用了这个原理。

XssFilter会创建一个新的XssHttpServletRequestWrapper对象来替换最原始的request对象。

特殊情况举例二

如果你想做一个分布式的系统,第一步要解决session的问题,你可以使用spring-session,它会接管seesion存储到Redis中。它创建一个新的Requet对象替换最原始的request对象。

特殊情况举例三

使用了文件上传,form表单的enctype类型为”multipart/form-data”,spring mvc对文件上传的处理类实际却为spring-mvc.xml文件中配置的CommonsMultipartResolver。

它创建一个MultipartHttpServletRequet对象替换最原始的request对象。

文章: https://dinguangx.iteye.com/blog/2227049 (我还未通过实验来证实)