1.在A系统中部分菜单功能是需要访问B系统的,两个系统两套登录,现在有这样一个需求,省去登录B系统的操作,点击菜单直接跳转到B的功能页面。

思路是:写一个Controller 所有访问/grafana/**的请求都到这里,判断是否携带“grafana_session”cookie,如果没有携带,通过httpclient发送B系统的登录请求,将登录成功后返回的grafana_session写入cookie中,重定向到B系统。

package cn.com.bjev.admin.vms.controller;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import cn.com.bjev.admin.vms.common.HttpResponseEntity;/*** grafana登录*/
@RequestMapping("/grafana")
@Controller
public class GrafanaLogin {private static final Logger logger = LoggerFactory.getLogger(GrafanaLogin.class);private static final String USER="****";private static final String PASSWORD="****";@RequestMapping("/**")public String login(HttpServletRequest request, Model model, HttpServletResponse response){try {boolean isExist=false;String requestURI = request.getRequestURI();Cookie[] cookies = request.getCookies();for (int i = 0; i < cookies.length; i++) {if("grafana_session".equals(cookies[i].getName())){isExist=true;}}if(!isExist){Map<String, String> params=new HashMap<String, String>();params.put("user", USER);params.put("password", PASSWORD);HttpResponseEntity responseEntity = httpPostForm("http://***.com/login", params, null, null);if(responseEntity.getContent().contains("Logged in")){for (Header header : responseEntity.getHeaders()) {if("Set-Cookie".equals(header.getName())){HeaderElement[] elements = header.getElements();for (int i = 0; i < elements.length; i++) {HeaderElement headerElement = elements[i];Cookie cookie=new Cookie(headerElement.getName(),headerElement.getValue());cookie.setMaxAge(-1);cookie.setPath("/");cookie.setDomain(".*****.com");response.addCookie(cookie);}break;}}}}return "redirect:http://*******.com/"+requestURI.substring(requestURI.indexOf("/",2)+1);} catch (Exception e) {logger.error("grafana登录异常", e);}return "redirect:http://*******.com/";}/** * 发送 http post 请求,参数以form表单键值对的形式提交。 */  public HttpResponseEntity httpPostForm(String url,Map<String,String> params, Map<String,String> headers,String encode){  HttpResponseEntity result=new HttpResponseEntity();if(encode == null){  encode = "utf-8";  }  //HttpClients.createDefault()等价于 HttpClientBuilder.create().build();   CloseableHttpClient closeableHttpClient = HttpClients.createDefault();   HttpPost httpost = new HttpPost(url);  //设置headerif (headers != null && headers.size() > 0) {for (Map.Entry<String, String> entry : headers.entrySet()) {httpost.setHeader(entry.getKey(),entry.getValue());}}//组织请求参数  List<NameValuePair> paramList = new ArrayList <NameValuePair>();  if(params != null && params.size() > 0){Set<String> keySet = params.keySet();  for(String key : keySet) {  paramList.add(new BasicNameValuePair(key, params.get(key)));  }  }try {  httpost.setEntity(new UrlEncodedFormEntity(paramList, encode));  } catch (UnsupportedEncodingException e1) {  e1.printStackTrace();  }  String content = null;  CloseableHttpResponse  httpResponse = null;  try {  httpResponse = closeableHttpClient.execute(httpost);  HttpEntity entity = httpResponse.getEntity();  content = EntityUtils.toString(entity, encode); result.setContent(content);result.setHeaders(httpResponse.getAllHeaders());} catch (Exception e) {  e.printStackTrace();  }finally{  try {  httpResponse.close();  } catch (IOException e) {  e.printStackTrace();  }  }  try {  //关闭连接、释放资源  closeableHttpClient.close();  } catch (IOException e) {  e.printStackTrace();  }return result;}
}

遇到的问题:重定向设置cookie丢失,B系统获取不到设置的cookie。

解决方案:将cookie的domain属性设置为二级域名例如:.baidu.com

domain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。

URL 重定向 Cookie丢失 问题相关推荐

  1. python漏洞检测脚本_URL重定向漏洞,python打造URL重定向漏洞检测脚本

    前言: 今天学习了重定向漏洞,这个漏洞比较好理解 漏洞名:URL重定向漏洞 威胁:低 漏洞的来源:开发者对head头做好对应的过滤和限制 例子: 有漏洞的网站:http://a.com/x.php?u ...

  2. python get请求 url传参_requests的get请求url参数、url重定向处理及cookies

    需求:在百度搜索www.python66.com,然后将搜索结果保存到文件bd_python66.html 百度搜索的url:https://www.baidu.com/s?wd=搜索词 params ...

  3. android webview 设置cookie时间,解决Android webview设置cookie和cookie丢失的问题

    Android页面嵌套了一个h5,H5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败.和web那边商量一会,发现js写入的cookie丢失了.所有需要Android这边在重写写入 ...

  4. Nginx 使用 proxy_cookie_path 解决反向代理 cookie 丢失导致无法登录等问题

    语法 参考nginx官方文档 语法: proxy_cookie_path off;proxy_cookie_path path replacement; 默认: proxy_cookie_path o ...

  5. 使用ATS中的regex_remap插件实现正则匹配的url重定向

    要点总结如下: 1.正向和反向代理可以同时并存,并且remap可以兼容这两种模式. 2.在使用regex_map时,是借助remap的配置来设置,而且remap.so和regex_remap.so已经 ...

  6. Nginx特性验证-反向代理/负载均衡/页面缓存/URL重定向

    原文发表于cu:2016-08-25 参考文档: Nginx 反向代理.负载均衡.页面缓存.URL重写等:http://freeloda.blog.51cto.com/2033581/1288553 ...

  7. java httpclient 重定向_用Apache HttpClient实现URL重定向

    很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置.原因可能是多方面的,比如域名转发.URL缩写.隐私保护.在同一网站维持相似的域名等. 本文讲述怎样使用Apache HTTP ...

  8. 用Apache HttpClient实现URL重定向

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow <用Apac ...

  9. HttpClient_用Apache HttpClient实现URL重定向

    很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置.原因可能是多方面的,比如域名转发.URL缩写.隐私保护.在同一网站维持相似的域名等. 本文讲述怎样使用Apache HTTP ...

最新文章

  1. C语言易错图形题--打印n行n列的空心正方形图案
  2. 【VS开发】【DSP开发】WinDriver简介(或介绍)
  3. 从反编译的角度去观察C#6.0
  4. python图片识别-用10行Python代码进行图像识别
  5. 光流 | 特征光流之视频中物体检测一(论文分享)
  6. 为RecyclerView添加下拉刷新(PullToRefresh)功能
  7. android最新版本 note8,三星Note8官方国行版安卓9固件rom升级包:CHC-N9500ZCS4DSF5
  8. 2016/12/3-问鼎杯线上赛1-1-Misc
  9. 控件setVisible为false会导致控件被移除
  10. leetcode121买卖股票的最佳时机
  11. 如何构建流量无损的在线应用架构 | 专题开篇
  12. java map转string_【库学科技】32道常见的Java基础面试题
  13. 【python基础知识】-引入文件失败问题(同一文件夹和不同文件夹)
  14. (44)System Verilog数组逻辑运算
  15. [转]ASP.NET刷新页面的六种方法
  16. Oracle→简介、用户、数据字典、表空间及其文件
  17. sqlserver事务怎么开启 怎么提交 怎么回滚
  18. Web应用测试(一)Selenium介绍及环境搭建
  19. 把数组变换成字符串(8)
  20. Java项目Maven配置操作Pdf

热门文章

  1. 【点灯鼠教程】K210裸机点灯之旅(1)点亮SSD1306【C开发I2C】
  2. XCode 5 “ios模拟器未能安装此应用程序”解决办法
  3. ubuntu 上 ufw 配置
  4. win10恢复注册表初始状态该如何操作?
  5. H3C QOS流量均衡
  6. 【leetcode】412.Fizz Buzz (三种方法开阔思路,java实现)
  7. MongoDB Windows环境备份和还原
  8. Python:实现horizontal projectile motion平抛运动算法(附完整源码)
  9. 解决360浏览器兼容性问题的极速模式、兼容模式、IE11模式对同一页面的不同兼容性问题
  10. 2017年7月4日13:10:38