经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java Cookie工具类
来源:cnblogs  作者:DingYu  时间:2018/10/21 20:30:33  对本文有异议

1.Cookie跨域

  Cookie不能跨顶级域名访问,但是二级域名可以共享Cookie,所以要实现跨域,有一定的局限性。

2.代码

  

  1. package com.DingYu.Cookie;
  2. import java.io.UnsupportedEncodingException;
  3. import java.net.URLDecoder;
  4. import java.net.URLEncoder;
  5. import javax.servlet.http.Cookie;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. /**
  9. *
  10. * Cookie 工具类
  11. *
  12. */
  13. public final class CookieUtils {
  14. /**
  15. * 得到Cookie的值, 不编码
  16. *
  17. * @param request
  18. * @param cookieName
  19. * @return
  20. */
  21. public static String getCookieValue(HttpServletRequest request, String cookieName) {
  22. return getCookieValue(request, cookieName, false);
  23. }
  24. /**
  25. * 得到Cookie的值,
  26. *
  27. * @param request
  28. * @param cookieName
  29. * @return
  30. */
  31. public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
  32. //获得所有的Cookie
  33. Cookie[] cookieList = request.getCookies();
  34. if (cookieList == null || cookieName == null) {
  35. return null;
  36. }
  37. String retValue = null;
  38. try {
  39. for (int i = 0; i < cookieList.length; i++) {
  40. if (cookieList[i].getName().equals(cookieName)) {
  41. //如果true 使用UTF-8 进行解码
  42. if (isDecoder) {
  43. retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");
  44. } else {
  45. retValue = cookieList[i].getValue();
  46. }
  47. break;
  48. }
  49. }
  50. } catch (UnsupportedEncodingException e) {
  51. e.printStackTrace();
  52. }
  53. return retValue;
  54. }
  55. /**
  56. * 得到Cookie的值,使用自定义的编码类型进行解码
  57. *
  58. * @param request
  59. * @param cookieName
  60. * @return
  61. */
  62. public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {
  63. Cookie[] cookieList = request.getCookies();
  64. if (cookieList == null || cookieName == null) {
  65. return null;
  66. }
  67. String retValue = null;
  68. try {
  69. for (int i = 0; i < cookieList.length; i++) {
  70. if (cookieList[i].getName().equals(cookieName)) {
  71. //使用自定义的编码类型进行解码
  72. retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);
  73. break;
  74. }
  75. }
  76. } catch (UnsupportedEncodingException e) {
  77. e.printStackTrace();
  78. }
  79. return retValue;
  80. }
  81. /**
  82. * 设置Cookie的值 不设置生效时间默认浏览器关闭即失效,也不编码
  83. */
  84. public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
  85. String cookieValue) {
  86. setCookie(request, response, cookieName, cookieValue, -1);
  87. }
  88. /**
  89. * 设置Cookie的值 在指定时间内生效,但不编码
  90. */
  91. public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
  92. String cookieValue, int cookieMaxage) {
  93. setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);
  94. }
  95. /**
  96. * 设置Cookie的值 不设置生效时间,但编码
  97. */
  98. public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
  99. String cookieValue, boolean isEncode) {
  100. setCookie(request, response, cookieName, cookieValue, -1, isEncode);
  101. }
  102. /**
  103. * 设置Cookie的值 在指定时间内生效, 编码参数
  104. */
  105. public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
  106. String cookieValue, int cookieMaxage, boolean isEncode) {
  107. doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);
  108. }
  109. /**
  110. * 设置Cookie的值 在指定时间内生效, 编码参数(指定编码)
  111. */
  112. public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
  113. String cookieValue, int cookieMaxage, String encodeString) {
  114. doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);
  115. }
  116. /**
  117. * 删除Cookie带cookie域名,删除原理,把原来的cookie的Value用""
  118. */
  119. public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,
  120. String cookieName) {
  121. doSetCookie(request, response, cookieName, "", -1, false);
  122. }
  123. /**
  124. * 设置Cookie的值,并使其在指定时间内生效
  125. *
  126. * @param cookieMaxage cookie生效的最大秒数
  127. */
  128. private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
  129. String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
  130. try {
  131. if (cookieValue == null) {
  132. cookieValue = "";
  133. } else if (isEncode) {
  134. //使用UTF-8进行编码
  135. cookieValue = URLEncoder.encode(cookieValue, "utf-8");
  136. }
  137. Cookie cookie = new Cookie(cookieName, cookieValue);
  138. if (cookieMaxage > 0)
  139. //设置Cookie的生存时间
  140. cookie.setMaxAge(cookieMaxage);
  141. if (null != request) {// 设置域名的cookie
  142. String domainName = getDomainName(request);
  143. System.out.println(domainName);
  144. if (!"localhost".equals(domainName)) {
  145. cookie.setDomain(domainName);
  146. }
  147. }
  148. cookie.setPath("/");
  149. response.addCookie(cookie);
  150. } catch (Exception e) {
  151. e.printStackTrace();
  152. }
  153. }
  154. /**
  155. * 设置Cookie的值,并使其在指定时间内生效
  156. *
  157. * @param cookieMaxage cookie生效的最大秒数
  158. */
  159. private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
  160. String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
  161. try {
  162. if (cookieValue == null) {
  163. cookieValue = "";
  164. } else {
  165. cookieValue = URLEncoder.encode(cookieValue, encodeString);
  166. }
  167. Cookie cookie = new Cookie(cookieName, cookieValue);
  168. if (cookieMaxage > 0)
  169. cookie.setMaxAge(cookieMaxage);
  170. if (null != request) {// 设置域名的cookie
  171. String domainName = getDomainName(request);
  172. if (!"localhost".equals(domainName)) {
  173. cookie.setDomain(domainName);
  174. }
  175. }
  176. cookie.setPath("/");
  177. response.addCookie(cookie);
  178. } catch (Exception e) {
  179. e.printStackTrace();
  180. }
  181. }
  182. /**
  183. * 得到cookie的域名
  184. */
  185. private static final String getDomainName(HttpServletRequest request) {
  186. String domainName = null;
  187. //获得请求的域名
  188. String serverName = request.getRequestURL().toString();
  189. if (serverName == null || serverName.equals("")) {
  190. domainName = "";
  191. } else {
  192. //全转为小写
  193. serverName = serverName.toLowerCase();
  194. //从第七个开始截取,过滤掉http://
  195. serverName = serverName.substring(7);
  196. //到后面的参数为止 比如 www.taobao.com/name=xxx
  197. final int end = serverName.indexOf("/");
  198. //把参数截取
  199. serverName = serverName.substring(0, end);
  200. //根据点来截取
  201. final String[] domains = serverName.split("\\.");
  202. int len = domains.length;
  203. if (len > 3) {
  204. // www.xxx.com.cn
  205. domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
  206. } else if (len <= 3 && len > 1) {
  207. // xxx.com or xxx.cn
  208. domainName = "." + domains[len - 2] + "." + domains[len - 1];
  209. } else {
  210. domainName = serverName;
  211. }
  212. }
  213. //去掉端口号
  214. if (domainName != null && domainName.indexOf(":") > 0) {
  215. String[] ary = domainName.split("\\:");
  216. domainName = ary[0];
  217. }
  218. return domainName;
  219. }
  220. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号