url重定向

Xml代码 
  1. 安装  
  2.   
  3. 1. 下载jar包, 并加入到WEB-INF/lib下  
  4. 2. 在WEB-INF/web.xml中增加下面的配置  
  5. <filter>  
  6. <filter-name>UrlRewriteFilter</filter-name>  
  7. <filter-class>  
  8. org.tuckey.web.filters.urlrewrite.UrlRewriteFilter  
  9. </filter-class>  
  10. </filter>  
  11. <filter-mapping>  
  12. <filter-name>UrlRewriteFilter</filter-name>  
  13. <!-- 拦截所有的url -->  
  14. <url-pattern>/*</url-pattern>  
  15. <dispatcher>REQUEST</dispatcher>  
  16. <dispatcher>FORWARD</dispatcher>  
  17. </filter-mapping>  
  18. 3. 在WEB-INF/下增加配置文件urlrewrite.xml  
  19. 4. 重启上下文环境  
  20. 过滤器的参数  
  21.   
  22. 1. confReloadCheckInterval: 配置文件重加载间隔. 0表示随时加载, -1表示不重加载, 默认-1  
  23. 2. confPath: 配置文件路径. 是相对context的路径, 默认/WEB-INF/urlrewrite.xml  
  24. 3. logLevel: 设置日志级别, 可以是: TRACE, DEBUG, INFO(默认), WARN, ERROR, FATAL, log4j, commons, slf4j, sysout:{level}(比如 sysout:DEBUG), 如果你使用普通的日志级别有一定困难, 可以调为: sysout:DEBUG(表明是使用控制台输出的调试级别)  
  25. 4. statusPath: 设置改变状态路径, 不能和已经安装的应用冲突(注意, 默认是/rewrite-status), 注意, 必须以/开始  
  26. 5. statusEnabled: 设置status是否开启, 期望得到的值是true, false, 默认true  
  27. 6. statusEnabledOnHosts: 设置允许status的主机, *可以被用作通配符, 默认是”localhost, local, 127.0.0.1”  
  28. 7. modRewriteConf: 设置rewrite模式, 默认是false, 使用mod-rewrite(可以参照apache服务器的mod_rewrite相关资料)方式的配置文件, 如果设置为true并且confPath没有设置则配置文件路径将会被默认为/WEB-INF/.htaccess  
  29. 8. modRewriteConfText: 从这些参数的值加从载mod_rewrite样式的配置, 设置这些参数则其他所有的参数都会被忽略. 比如:  
  30. <init-param>  
  31. <param-name>modRewriteConfText</param-name>  
  32. <param-value>  
  33. RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]  
  34. RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]  
  35. </param-value>  
  36. </init-param>  
  37. 9. allowConfSwapViaHttp: 设置是否允许通过HTTP方式交互设置参数, 比如, 通过调用/rewrite-status/?conf=WEB-INF/urlrewrite2.xml  
  38. 配置文件WEB-INF/urlrewrite.xml  
  39.   
  40. 1. DTD约束  
  41. <!DOCTYPE urlrewrite  
  42.         PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"  
  43.         "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">  
  44. 2. <urlrewrite />  
  45. 2.1. default-match-type(可选):  
  46. 2.1.1. regex, 默认. 所有未指定match-type属性的rule都使用java正则表达式进行匹配  
  47. 2.1.2. wildcard: 所有未指定match-type属性的rule都使用通配符匹配引擎匹配  
  48. 2.2. decode-using(可选):  
  49. 2.2.1. header, utf8: 默认. 使用request.getCharacterEncoding()得到的编码对URL解码, 如果是空, 使用utf8.  
  50. 2.2.2. null: 不进行解码. 设置为: decode-using=”null”  
  51. 2.2.3. header: 仅仅使用request.getCharacterEncoding()解码  
  52. 2.2.4. [encoding]: 仅仅使用一个指定的字符编码比如ISO-8859-1.  
  53. 2.2.5. header, [encoding]: 对一个URL解码时使用request.getCharacterEncoding(), 如果得到的值为空, 则使用encoding指定的编码.  
  54. 2.3. use-query-string(可选):  
  55. 2.3.1. false: 默认. 在from进行匹配的时候, 查询字符串不会参加  
  56. 2.3.2. true: 查询字符串参与from的匹配  
  57. 2.4. use-context(可选):  
  58. 2.4.1. false: 默认. from元素匹配时, application的contex路径将不会增加到url中  
  59. 2.4.2. true: application的contex路径参与from元素的匹配  
  60. 3. <rule />: 0个或多个  
  61. 3.1. enabled(可选):  
  62. 3.1.1. true: 默认.允许这个规则  
  63. 3.1.2. false: 废弃这个规则  
  64. 3.2. match-type(可选):  
  65. 3.2.1. regex: 默认. 使用java正则匹配  
  66. 3.2.2. wildcard: 使用通配符表达式引擎  
  67. 4. <outbound-ruld />: 0个或多个. 和普通的rule非常相似, 但是这里是在response.encodeURL()方法调用时进行重写的.  
  68. 4.1. enabled(可选):  
  69. 4.1.1. true: 默认. 允许规则  
  70. 4.1.2. false: 废弃规则  
  71. 4.2. encodefirst(可选):  
  72. 4.2.1. fasle: 默认, 在运行了encodeURL()方法之后运用这个重写规则  
  73. 4.2.2. true: 在encodeURL()之前运用这个重写规则  
  74. 5. <name />: 一个用于记录规则名称的可选元素, 可以在<rule /><outbound-rule />上使用  
  75. 6. <note />: 用于记录规则描述的一个简单可选元素, 可以用在<rule /><outbound-rule />上.  
  76. 7. <condition />: 针对规则的选择条件. 注意, 在规则运用的时候必须满足所有的条件.  
  77. 7.1. type(可选):  
  78. 7.1.1. header: 默认. 如果设置, 头名称必须通过<condition />的name属性指定  
  79. 7.1.2. method: 请求方法. GET, POST, HEAD等  
  80. 7.1.3. port: application运行的端口  
  81. 7.1.4. time: 服务器当前时间(使用Unix时间戳), 这个通常被用于确保内容仅在设置的时间存活  
  82. 7.1.5. year: 服务器的当前年  
  83. 7.1.6. month: 服务器的当前月份  
  84. 7.1.7. dayofmonth: 当天是一月的第几天, 每月第一天是1  
  85. 7.1.8. dayofweek: 当天是一周的第几天, 星期天是7  
  86. 7.1.9. ampm: 上午或下午  
  87. 7.1.10. hourofday: 一天的第多少小时(24小时制)  
  88. 7.1.11. minute: 当前服务器时间的分  
  89. 7.1.12. second: 当前服务器时间的秒  
  90. 7.1.13. millisecond: 当前服务器时间的毫秒  
  91. 7.1.14. attribute: 检查request的属性(getAttribute)值, 要检查的属性名称通过<condition />的name指定  
  92. 7.1.15. auth-type: 检查request属性的值.   request.getAuthType  
  93. 7.1.16. character-encoding: 接收到请求的编码  
  94. 7.1.17. content-length: 请求的长度(对于拒绝响应大请求很有用)  
  95. 7.1.18. content-type: 请求类型  
  96. 7.1.19. context-path: 请求的contex路径  
  97. 7.1.20. cookie: 检查cookie值, cookie的名称通过<condition />的name属性指定  
  98. 7.1.21. parameter: 检查请求参数, 参数名称通过<condition />的name属性指定  
  99. 7.1.22. path-info: 相当于request.getPathInfo()  
  100. 7.1.23. path-translated: 相当于request.getTranslated()  
  101. 7.1.24. protocol: 用于过滤协议  
  102. 7.1.25. query-string: 得到url后面的参数字符串  
  103. 7.1.26. remote-addr: IP地址过滤  
  104. 7.1.27. remote-host: 远程主机过滤(注意, 仅仅在应用服务器配置了查看(远程)主机名时才可用)  
  105. 7.1.28. remote-user: 当前登录用户, 如果用户被授权可用  
  106. 7.1.29. requested-session-id: 当前session的id  
  107. 7.1.30. request-uri: 请求URL的从协议名到查询字符串部分  
  108. 7.1.31. request-url: 重构后的URL, 返回的URL包含协议, 服务器名称, 端口, 路径, 但不包含查询字符串  
  109. 7.1.32. session-attribute: 检查session中的属性(getAttribute), 属性名称通过<condition />的name属性设置.  
  110. 7.1.33. session-isnew: 检查session是不是新的  
  111. 7.1.34. server-name: 请求发送到的服务器的主机名(从host这个头中得到的不是机器名)  
  112. 7.1.35. scheme: 请求的scheme  
  113. 7.1.36. user-in-role: 注意, 这里的值不能是正则表达式  
  114. 7.2. name: 配合一些特殊type使用的, 可以是任何值  
  115. 7.3. next:  
  116. 7.3.1. and: 默认. 下一个和这一个条件都必须匹配  
  117. 7.3.2. or: 下一个或这一个条件匹配  
  118. 7.4. operator:  
  119. 7.4.1. equal: 默认. 指定正则和真实值匹配  
  120. 7.4.2. notequal: 真实值和正则不匹配  
  121. 7.4.3. greater: 大于, 仅用于数值  
  122. 7.4.4. less: 小于  
  123. 7.4.5. greaterorequal: 大于等于  
  124. 7.4.6. lessorequal: 小于等于  
  125. 8. <from />: 通常在<rule /><outbound-rule />中都必须指定一个, 值可以是正则表达式(Perl5方式的正则), 注意: from指定的url是和contex相关的  
  126. 8.1. casesensitive:  
  127. 8.1.1. false: 默认. 大小写不敏感  
  128. 8.1.2. true: 大小写敏感  
  129. 9. <to />: 可以是一个perl5样式的正则替换表达式  
  130. 9.1. type:  
  131. 9.1.1. forward: 默认. 请求匹配这个<rule />的所有<condition />, 并且URL使用内部跳转到”to”指定的地址(注意, 这里forward到的URL必须和UrlRewriteFilter位于同一个容器中)  
  132. 9.1.2. passthrough: 和forward相同  
  133. 9.1.3. redirect: 请求匹配所有<condition />和这个<rule /><from />, 通知客户端跳转到<to />指定地址  
  134. 9.1.4. permanent-redirect: 相当于做了以下事情  
  135. response.setStatus(  
  136.         HttpServletResponse.SC_MOVED_PERMANENTLY  
  137. );  
  138. response.setHeader(“Location”, [<to />指定的值]);  
  139. 9.1.5. temporary-redirect: 相当于做了以下事情  
  140. response.setStatus(  
  141.         HttpServletResponse. SC_MOVED_TEMPORARILY  
  142. );  
  143. response.setHeader(“Location”, [<to />指定的值]);  
  144. 9.1.6. pre-include  
  145. 9.1.7. post-include  
  146. 9.1.8. proxy: 请求URL将会以全路径被代理, 使用此特性需要引入commons-http和commons-codec包  
  147. 9.2. last:  
  148. 9.2.1. false: 默认. 其余<rule />将会处理如果这个匹配  
  149. 9.2.2. true: 如果匹配这个规则将不会处理  
  150. 9.3. encode:  
  151. 9.3.1. false: <rule />下是默认值. 在rewrite之前, 用response.encodeURL([to的值])编码URL  
  152. 9.3.2. true: <outbound-rule />下默认值. 不会编码URL  
  153. 9.4. context:  
  154. 如果应用服务器配置了允许”穿透context”通信, 那么这个属性可以被用于forward(并且仅仅能用于forward)请求到另外一个serlvet context…..也就是跨应用forward  
  155. 在Tomcat上, server.xml或context.xml中配置crossContext=”true”, 例如: 允许两个应用”app”和”forum”之间通信, 那么可以如下配置:  
  156. <Context docBase=”app” path=”/app” reloadable=”true” crossContext=”true” />  
  157. <Context docBase=”forum” path=”/forum” reloadable=”true” crossContext=”true” />  
  158. 10. <to />的其他方面  
  159. 10.1. <to />可以是null, 意义为: 如果匹配请求不再继续, 相当于没有调用chain.doFilter  
  160. 10.2. 使用$N获取<from />中配置的子组, N必须是1至10之间的数  
  161. 10.3. 任何<condition />中可以使用的type中的值都可以在<to />中使用, 比如<to>/%{parameter:page}</to>  
  162. 10.4. 函数调用: ${函数名: 参数1:参数2}  可以在<set /><to />中使用  
  163. name  
  164. example  
  165. example returns  
  166. replace  
  167. ${replace:my cat is a blue cat:cat:dog}  
  168. my dog is a blue dog  
  169. replaceFirst  
  170. ${replace:my cat is a blue cat:cat:dog}  
  171. my cat is a blue dog  
  172. escape  
  173. ${escape:a b c}  
  174. a+b+c  
  175. unescape  
  176. ${unescape:a+b+c}  
  177. a b c  
  178. lower  
  179. ${lower:Hello World}  
  180. hello world  
  181. upper  
  182. ${upper:hello}  
  183. HELLO  
  184. trim  
  185. ${trim: abc def }  
  186. abc def  
  187. 11. <set />: 在匹配规则的时候, 允许设置一些值.  
  188. 11.1. type:  
  189. 11.1.1. request: 默认. 类似于request.setAttribute  
  190. 11.1.2. session: session.setAttribute  
  191. 11.1.3. response-header: response.setHeader  
  192. 11.1.4. cookie: 值以”[value][:domain[:lifetime[:path]]]”的格式设置.  是指给客户端浏览器设置cookie, cookie名称由<set />的name属性指定  
  193. 11.1.4.1. value: cookie的值  
  194. 11.1.4.2. domain: 服务器  
  195. 11.1.4.3. lifetime: 存货时间  
  196. 11.1.4.4. path: cookie的path  
  197. 11.1.5. status: response.setStatus  
  198. 11.1.6. content-type: response.setContentType  
  199. 11.1.7. charset: response.setCharacterEncoding  
  200. 11.1.8. expires: 设置HTTP头中的过期时间, 设置的格式为{数值 类型}, 比如: “1 day 2 seconds”  
  201. 11.1.9. locale: response.setLocale  
  202. 11.1.10. parameter: 允许将request.getParameter得到的某个参数的值在这里进行重新处理  
  203. 11.1.11. method: 允许将request.getMethod()得到的值进行重新处理  
  204. 11.2. name: type是request, session, response-header, cookie的时候, 必须设置name  
  205. 11.3. 举例:  
  206. <rule>  
  207.     <condition name=”user-agent”>Mozilla/3/.0 (compatible; AvantGo .*)</condition>  
  208.     <from>.*</from>  
  209.     <set name=”client”>AvantGo</set>  
  210. </rule>  
  211. <rule>  
  212.     <condition name=”user-agent”>UP/.Browser/3.*SC03 .*</condition>  
  213.     <from>.*</from>  
  214.     <set name=”client”>Samsung SCH-6100</set>  
  215. </rule>  
  216. 12. <run />: 允许在<rule /><condition />都匹配的时候, 执行一个对象方法  
  217. 12.1. class: 全限定名的类名, 期望调用方法的类名.  
  218. 12.2. method(可选): 默认值为run.  期望调用的方法名. 该方法必须有两个参数(HttpServletRequest request, HttpServletResponse response).  注意, 如果该对象有init(ServletConfig)或destroy()方法, 在创建和销毁对象的时候会自动调用, ServletConfig中可以得到初始化参数, 参数通过<init-param />的方式传递:  
  219. <run class=”selfimpr.MyServlet” method=”doGet”>  
  220.     <init-param>  
  221.            <param-name>id</param-name>  
  222.            <param-value>1</param-value>  
  223.     </init-param>  
  224. </run>  
  225. 12.3. neweachtime: 默认false. 表明是否每次请求都创建一个对象实例.  
  226. 13. Tip  
  227. 13.1. 在配置中如果要使用”&”, 用&amp;  
  228. 13.2. 简单起见, 给<from />的配置前面和后面分别加上^, $, 这两个是正则表达式中的强制开始和结尾标志  
  229. 13.3. 如果使用<outbound-rule>要记得代码中的url都是编码过的  
  230. 13.4. 正则表达式非常复杂灵活, 请阅读java.util.regex.Pattern中的java正则介绍  
  231. 13.5. 如果觉得正则难以理解, 可以使用通配符方式  
  232. 13.6. contex是非常重要的, 如果有一个应用的context是”/myapp”, 并且你的请求是”/myapp/somefolder/somepage.jsp”, 容器交给UrlRewriteFilter的url会是”/somefolder/somepage.jsp”, 这可能难以理解, 但是在你的<rule><condition>中不要包含context path, 它是容器负责处理的.  
  233. 14. 通配符:  
  234. 通配符匹配引擎可以替代正则表达式, 在<condition><rule>中设置match-type是wildcard用以开启支持通配符.(或者设置default-match-type)  
  235. 例如:  
  236. /big/url/*匹配/big/url/abc.html但是不匹配/big/url/abc/dir/或/big/url/abc/  
  237. /big/url/**匹配/big/url/abc.html, /big/url/abc/dir/和/big/url/abc/  
  238. 也可以和正则的替换一样, 每个*代表一个参数, 在<set><to>中用$N的方式使用  
  239. 使用mod-rewrite样式的配置  
  240.   
  241. filter配置  
  242.   
  243.      <filter>  
  244.          <filter-name>UrlRewriteFilter</filter-name>  
  245.          <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>  
  246.    
  247.          <!-- defaults to false. use mod_rewrite style configuration file (if this is true and confPath  
  248.          is not specified confPath will be set to /WEB-INF/.htaccess) -->  
  249.          <init-param>  
  250.              <param-name>modRewriteConfText</param-name>  
  251.              <param-value><![CDATA[ 
  252.   
  253.                  # redirect mozilla to another area 
  254.                  RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.* 
  255.                  RewriteRule  ^/no-moz-here$                 /homepage.max.html  [L] 
  256.   
  257.              ]]></param-value>  
  258.          </init-param>  
  259.    
  260.      </filter>  
  261.    
  262.      <filter-mapping>  
  263.          <filter-name>UrlRewriteFilter</filter-name>  
  264.          <url-pattern>/*</url-pattern>  
  265.          <dispatcher>REQUEST</dispatcher>  
  266.          <dispatcher>FORWARD</dispatcher>  
  267.      </filter-mapping>  
  268. WEB-INF/.htaccess下的具体匹配配置  
  269.   
  270. # redirect mozilla to another area  
  271.      RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*  
  272.      RewriteRule  ^/no-moz-here$                 /homepage.max.html  [L]  
  273. URL注解匹配  
  274.   
  275. 1. urlrewrite3.0之后, 使用JDK1.6及以上可以使用注解来生成urlrewrite的配置文件.  

 urlrewrite.xml

 

 

 

Xml代码 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.     <!DOCTYPE urlrewrite  
  3.     PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"  
  4.     "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">  
  5. <urlrewrite>  
  6.   
  7.     <!-- 不带参数的重写URL -->  
  8.     <rule>  
  9.         <from>(.*)/test.html</from>  
  10.         <to>$1/TestServlet1</to>  
  11.     </rule>  
  12.   
  13.     <!-- 带参数的重写URL   
  14.         Id=$2 ,.*代表所有传人的参数.  
  15.     -->  
  16.     <rule>  
  17.         <from>(.*)/test-(.*).html</from>  
  18.         <to>$1/TestServlet2?Id=$2</to>  
  19.     </rule>  
  20.   
  21. </urlrewrite>  
  22.       

 Web.xml

 

 

Xml代码 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6.   
  7.     <!--==========================重写URL配置=Begin=========================  -->  
  8.     <filter>  
  9.         <filter-name>urlrewriteFilter</filter-name>  
  10.         <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>  
  11.         <init-param>  
  12.             <param-name>logLevel</param-name>  
  13.             <param-value>info</param-value>  
  14.         </init-param>  
  15.         <init-param>  
  16.             <param-name>confReloadCheckInterval</param-name>  
  17.             <param-value>10</param-value>  
  18.         </init-param>  
  19.     </filter>  
  20.   
  21.     <filter-mapping>  
  22.         <filter-name>urlrewriteFilter</filter-name>  
  23.         <url-pattern>/*</url-pattern>  
  24.     </filter-mapping>  
  25.     <!--==========================重写URL配置=End=========================  -->  
  26.       
  27.       
  28.   <servlet>  
  29.     <servlet-name>TestServlet1</servlet-name>  
  30.     <servlet-class>com.servlet.TestServlet1</servlet-class>  
  31.   </servlet>  
  32.   <servlet>  
  33.     <servlet-name>TestServlet2</servlet-name>  
  34.     <servlet-class>com.servlet.TestServlet2</servlet-class>  
  35.   </servlet>  
  36.   
  37.   
  38.   <servlet-mapping>  
  39.     <servlet-name>TestServlet1</servlet-name>  
  40.     <url-pattern>/TestServlet1</url-pattern>  
  41.   </servlet-mapping>  
  42.   <servlet-mapping>  
  43.     <servlet-name>TestServlet2</servlet-name>  
  44.     <url-pattern>/TestServlet2</url-pattern>  
  45.   </servlet-mapping>  
  46.   
  47.   
  48.     <welcome-file-list>  
  49.         <welcome-file>index.jsp</welcome-file>  
  50.     </welcome-file-list>  
  51. </web-app>  

 

Html代码 
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML>  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.        
  17.   </head>  
  18.     
  19.   <body>  
  20.     
  21.   <a href="test.html">  
  22.     test  
  23.   </a>  
  24.   </body>  
  25. </html>  

 

Java代码   收藏代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7.   
  8. <!DOCTYPE HTML>  
  9. <html>  
  10.   <head>  
  11.     <base href="<%=basePath%>">  
  12.       
  13.     <title>My JSP 'index.jsp' starting page</title>  
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.        
  18.   </head>  
  19.     
  20.   <body>  
  21.     <c:if test="${!empty list}">  
  22.             <c:forEach items="${list}" var="list" varStatus="loop">  
  23.                 <div align="center">  
  24.                 <a href="test-${loop.count}.html">${list}</a>  
  25.                 </div>  
  26.                 </br>  
  27.             </c:forEach>  
  28.     </c:if>  
  29.     
  30.   </body>  
  31. </html>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值