Request.UrlReferrer 为空的问题

本文详细介绍了在不同浏览器及导航方式下Request.UrlReferrer属性的有效性和限制条件,并通过实例解决了一个具体问题。

From:http://hi.baidu.com/justin6852006/blog/item/b8b4e64e9cc196cdd0c86ac0.html

 

今天在开发时遇到了一个问题,在用Request.UrlReferrer获取上一页面的地址时发现该对象为空(IE下,FF下可以得到对象),于是上网搜索发现:

什么时候可以使用此方法,什么时候此属性的值为空,只有知道了其使用场合,才能更加有效的使用它,下面对其使用情况小结如下:

下列情况下,此属性值是有效的:

(1)直接使用<a href>链接;

(2)通过表单提交的方式,或者说是有PostBack动作的按钮,也或者是通过客户端脚本进行了form.submit()动作;

下面这些情况,此属性返回空值:

(1)通过IE的收藏,历史,最近链接,首页,或者是在地址栏中直接输入当前页面地址等方式;( ^_^,有些啰嗦 );

(2)使用了location.href or location.replace()等客户端脚本方法导航到了当前页面;

(3) 使用Response.Redirect / Server.Transfer方式,这个小解释下,如果是在上一页面的Page_Load直接使用了 Response.Redirect("Page2.aspx");或者Server.Transfer("Page2.aspx"),那么在 Page2.aspx中的Request.UrlReferrer是null,但如果是通过服务器按钮进行的,返回值是正确的;

(4)使用Response.AddHeader (302) or <meta http-equiv=refresh>转到的页面中;


原来我的转向按钮在update panel里面所以不能用事件redirect导向,所以我用button的onclinetclick()里写的location.href方法转向这样浏览器认为不是页面跳转过来的所以Request.UrlReferrer为空,于是换成<a>标签连接跳转,一切正常了!

你是一个熟悉Java代码的资深专家,将下方代码变换为符合阿里巴巴Java开发手册形式,如果出现private类型使用反射机制处理,最后输出完整代码 public long myPageLoad(HttpServletRequest request, Map<String, Object> requestData) throws IOException { final String methodName = "myPageLoad"; logUtils.writeLog(WebPageUtils.class, "[PT用](0/12)" + methodName); requestData = new HashMap<String, Object>(INITIAL_CAPACITY); try { logUtils.writeLog(WebPageUtils.class, "[PT用](1/12)" + methodName); StringBuilder message = new StringBuilder(); message.append(";【URL】; "); message.append(String.format("%s=%s ", "Url", request.getRequestURL())); message.append(String.format("%s=%s ", "UrlReferrer", request.getHeader("Referer"))); message.append(";【URL】"); long i = 0; long j = 0; // POST数据收集 Enumeration<String> postParams = request.getParameterNames(); while (postParams.hasMoreElements()) { String keydata = postParams.nextElement(); if (i++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](2/12)" + methodName); message.append(";【POST Data】;"); } if (keydata != null && !requestData.containsKey(keydata)) { if (j++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](3/12)" + methodName); } requestData.put(keydata, request.getParameter(keydata)); } message.append(String.format("%s=%s ", keydata, request.getParameter(keydata))); } if (i != 0) { message.append(";【POST Data】"); } // URL参数数据收集 i = 0; j = 0; String queryString = request.getQueryString(); if (queryString != null) { String[] params = queryString.split("&"); for (String param : params) { String[] keyValue = param.split("="); if (keyValue.length == 2) { String keydata = keyValue[0]; if (i++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](4/12)" + methodName); message.append(";【Query String】;"); } if (keydata != null && !requestData.containsKey(keydata)) { if (j++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](5/12)" + methodName); } requestData.put(keydata, keyValue[1]); } message.append(String.format("%s=%s ", keydata, keyValue[1])); } } } if (i != 0) { message.append(";【Query String】"); } // HTTP头数据收集 i = 0; j = 0; Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String keydata = headerNames.nextElement(); if (i++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](6/12)" + methodName); message.append(";【Request Headers】;"); } if (keydata != null && !requestData.containsKey(keydata)) { if (j++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](7/12)" + methodName); } requestData.put(keydata.toUpperCase(), request.getHeader(keydata)); } message.append(String.format("%s=%s ", keydata, request.getHeader(keydata))); } if (i != 0) { message.append(";【Request Headers】"); } // Cookie数据收集 i = 0; j = 0; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { String keydata = cookie.getName(); if (i++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](8/12)" + methodName); message.append(";【Request Cookies】;"); } if (keydata != null && !requestData.containsKey(keydata)) { if (j++ == 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](9/12)" + methodName); } requestData.put(keydata, cookie.getValue()); } message.append(String.format("%s=%s ", keydata, cookie.getValue())); } } if (i != 0) { message.append(";【Request Cookies】"); } // 请求体数据收集 i = 0; j = 0; StringBuilder requestBody = new StringBuilder(); try (BufferedReader reader = new BufferedReader( new InputStreamReader(request.getInputStream(), RESPONSE_ENCODING))) { String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } } String strRequest = requestBody.toString(); if (strRequest.length() > 0) { logUtils.writeLog(WebPageUtils.class, "[PT用](10/12)" + methodName); message.append(";【Request InputStream】;"); message.append(strRequest); message.append(";【Request InputStream】"); requestData.put("InputStream", strRequest); } // 输出信息日志 logUtils.writeLog(WebPageUtils.class, message.toString()); logUtils.writeLog(WebPageUtils.class, "[PT用](11/12)" + methodName); return SUCCESS_CODE; } catch (Exception ex) { logUtils.writeLog(WebPageUtils.class, "[PT用](12/12)" + methodName + "[" + ex.getMessage() + "]"); return FAILURE_CODE; } }
最新发布
09-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值