分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

httpclient 登录成功后返回的cookie值访问下一页面

发布时间:2023-09-06 01:43责任编辑:熊小新关键词:http

HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。

如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所以只需要将登录成功返回的cookie复制到各个HttpClient使用即可。使用Cookie的方法有两种,可以自己使用CookieStore来保存(见TestCookieStore()方法),也可以通过HttpClientContext上下文来维持(见TestContext()方法)。

package com.sunbin.httpSession; import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry; import org.apache.http.HeaderIterator;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.ParseException;import org.apache.http.client.CookieStore;import org.apache.http.client.config.CookieSpecs;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.protocol.HttpClientContext;import org.apache.http.config.Registry;import org.apache.http.config.RegistryBuilder;import org.apache.http.cookie.CookieSpecProvider;import org.apache.http.impl.client.BasicCookieStore;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.cookie.BasicClientCookie;import org.apache.http.impl.cookie.BestMatchSpecFactory;import org.apache.http.impl.cookie.BrowserCompatSpecFactory;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.junit.Test; public class TestHttpClient { ??// 创建CookieStore实例 ?static CookieStore cookieStore = null; ?static HttpClientContext context = null; ?String loginUrl = "http://127.0.0.1:8080/CwlProClient/j_spring_security_check"; ?String testUrl = "http://127.0.0.1:8080/CwlProClient/account/querySubAccount.action"; ?String loginErrorUrl = "http://127.0.0.1:8080/CwlProClient/login/login.jsp"; ??@Test ?public void testLogin() throws Exception { ???System.out.println("----testLogin"); ????// // 创建HttpClientBuilder ???// HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); ???// // HttpClient ???// CloseableHttpClient client = httpClientBuilder.build(); ???// 直接创建client ???CloseableHttpClient client = HttpClients.createDefault(); ????HttpPost httpPost = new HttpPost(loginUrl); ???Map parameterMap = new HashMap(); ???parameterMap.put("j_username", "sunb012"); ???parameterMap.put("j_password", "sunb012"); ???UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity( ???????getParam(parameterMap), "UTF-8"); ???httpPost.setEntity(postEntity); ???System.out.println("request line:" + httpPost.getRequestLine()); ???try { ?????// 执行post请求 ?????HttpResponse httpResponse = client.execute(httpPost); ?????String location = httpResponse.getFirstHeader("Location") ?????????.getValue(); ?????if (location != null && location.startsWith(loginErrorUrl)) { ???????System.out.println("----loginError"); ?????} ?????printResponse(httpResponse); ??????// 执行get请求 ?????System.out.println("----the same client"); ?????HttpGet httpGet = new HttpGet(testUrl); ?????System.out.println("request line:" + httpGet.getRequestLine()); ?????HttpResponse httpResponse1 = client.execute(httpGet); ?????printResponse(httpResponse1); ???????// cookie store ?????setCookieStore(httpResponse); ?????// context ?????setContext(); ???} catch (IOException e) { ?????e.printStackTrace(); ???} finally { ?????try { ???????// 关闭流并释放资源 ???????client.close(); ?????} catch (IOException e) { ???????e.printStackTrace(); ?????} ???} ?} ??@Test ?public void testContext() throws Exception { ???System.out.println("----testContext"); ???// 使用context方式 ???CloseableHttpClient client = HttpClients.createDefault(); ???HttpGet httpGet = new HttpGet(testUrl); ???System.out.println("request line:" + httpGet.getRequestLine()); ???try { ?????// 执行get请求 ?????HttpResponse httpResponse = client.execute(httpGet, context); ?????System.out.println("context cookies:" ?????????+ context.getCookieStore().getCookies()); ?????printResponse(httpResponse); ???} catch (IOException e) { ?????e.printStackTrace(); ???} finally { ?????try { ???????// 关闭流并释放资源 ???????client.close(); ?????} catch (IOException e) { ???????e.printStackTrace(); ?????} ???} ?} ??@Test ?public void testCookieStore() throws Exception { ???System.out.println("----testCookieStore"); ???// 使用cookieStore方式 ???CloseableHttpClient client = HttpClients.custom() ???????.setDefaultCookieStore(cookieStore).build(); ???HttpGet httpGet = new HttpGet(testUrl); ???System.out.println("request line:" + httpGet.getRequestLine()); ???try { ?????// 执行get请求 ?????HttpResponse httpResponse = client.execute(httpGet); ?????System.out.println("cookie store:" + cookieStore.getCookies()); ?????printResponse(httpResponse); ???} catch (IOException e) { ?????e.printStackTrace(); ???} finally { ?????try { ???????// 关闭流并释放资源 ???????client.close(); ?????} catch (IOException e) { ???????e.printStackTrace(); ?????} ???} ?} ??public static void printResponse(HttpResponse httpResponse) ?????throws ParseException, IOException { ???// 获取响应消息实体 ???HttpEntity entity = httpResponse.getEntity(); ???// 响应状态 ???System.out.println("status:" + httpResponse.getStatusLine()); ???System.out.println("headers:"); ???HeaderIterator iterator = httpResponse.headerIterator(); ???while (iterator.hasNext()) { ?????System.out.println("\t" + iterator.next()); ???} ???// 判断响应实体是否为空 ???if (entity != null) { ?????String responseString = EntityUtils.toString(entity); ?????System.out.println("response length:" + responseString.length()); ?????System.out.println("response content:" ?????????+ responseString.replace("\r\n", "")); ???} ?} ??public static void setContext() { ???System.out.println("----setContext"); ???context = HttpClientContext.create(); ???Registry<CookieSpecProvider> registry = RegistryBuilder ???????.<CookieSpecProvider> create() ???????.register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory()) ???????.register(CookieSpecs.BROWSER_COMPATIBILITY, ???????????new BrowserCompatSpecFactory()).build(); ???context.setCookieSpecRegistry(registry); ???context.setCookieStore(cookieStore); ?} ??public static void setCookieStore(HttpResponse httpResponse) { ???System.out.println("----setCookieStore"); ???cookieStore = new BasicCookieStore(); ???// JSESSIONID ???String setCookie = httpResponse.getFirstHeader("Set-Cookie") ???????.getValue(); ???String JSESSIONID = setCookie.substring("JSESSIONID=".length(), ???????setCookie.indexOf(";")); ???System.out.println("JSESSIONID:" + JSESSIONID); ???// 新建一个Cookie ???BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", ???????JSESSIONID); ???cookie.setVersion(0); ???cookie.setDomain("127.0.0.1"); ???cookie.setPath("/CwlProClient"); ???// cookie.setAttribute(ClientCookie.VERSION_ATTR, "0"); ???// cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "127.0.0.1"); ???// cookie.setAttribute(ClientCookie.PORT_ATTR, "8080"); ???// cookie.setAttribute(ClientCookie.PATH_ATTR, "/CwlProWeb"); ???cookieStore.addCookie(cookie); ?} ??public static List<NameValuePair> getParam(Map parameterMap) { ???List<NameValuePair> param = new ArrayList<NameValuePair>(); ???Iterator it = parameterMap.entrySet().iterator(); ???while (it.hasNext()) { ?????Entry parmEntry = (Entry) it.next(); ?????param.add(new BasicNameValuePair((String) parmEntry.getKey(), ?????????(String) parmEntry.getValue())); ???} ???return param; ?}}

httpclient 登录成功后返回的cookie值访问下一页面

原文地址:https://www.cnblogs.com/zhimingxin/p/8472245.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved