- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Spring 的 WebServiceGatewaySupport 连接到供应商的 SOAP Web 服务。该服务的要求之一是客户端必须维护服务器发送的 session cookie。
我能够确定 WebServiceGatewaySupport 在内部使用 HttpURLConnection 类来发出请求。简单调用
CookieHandler.setDefault(new CookieManager());
在聚会开始之前添加一个默认的 cookie 管理器,一切都在我本地的 Tomcat 实例上运行得非常愉快(我什至注意到我的机器旁边出现了一个小彩虹)。
但是,当我部署到 WebLogic 10.3.6.0 时,Miley Cyrus 一切顺利。它不像以前那样摇晃,我的 cookies 被扔掉了。
通过覆盖 CookieManager 的 get 和 put 方法,我能够证明 WebLogic 是罪魁祸首。在 Tomcat 中有很多关于这些的操作。不是来自 WebLogic 的杂音。
CookieHandler.setDefault(new CookieManager() {
@Override
public Map<String, List<String>> get(URI uri, Map<String, List<String>> stringListMap) throws IOException {
Map<String, List<String>> map = super.get(uri, stringListMap);
LOGGER.info("Cop that: " + uri + " " + map);
return map;
}
@Override
public void put(URI uri, Map<String, List<String>> stringListMap) throws IOException {
LOGGER.info("Hello sailor: " + uri + " " + stringListMap);
super.put(uri, stringListMap);
}
});
((CookieManager)CookieHandler.getDefault()).setCookiePolicy(CookiePolicy.ACCEPT_ALL);
我只能假设有某种“高级安全恶作剧”旨在用于传入的 servlet 请求,但也应用于传出连接。我找不到任何有用的 weblogic 部署描述符选项。
SCSS 。
我可能可以让它与 Axis 一起工作,但我宁愿用笔戳自己的脸。
我要回家了
更新:好的,我还没有解决根本原因,但这就是我让它工作的方式。我在想,如果我可以访问实际的 HttpURLConnection 对象,我可以对其进行手动 cookie 管理。我能够查看 Spring WS 源代码并设置一个新的 MessageSender,它的工作原理基本相同。
public class MyClient extends WebServiceGatewaySupport {
public MyClient(WebServiceMessageFactory messageFactory) {
super(messageFactory);
super.getWebServiceTemplate().setMessageSender(new WebServiceMessageSender() {
@Override
public WebServiceConnection createConnection(URI uri) throws IOException {
URL url = uri.toURL();
URLConnection connection = url.openConnection();
if (!(connection instanceof HttpURLConnection)) {
throw new HttpTransportException("URI [" + uri + "] is not an HTTP URL");
}
HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
prepareConnection(httpURLConnection);
HttpURLConnectionProxy httpURLConnectionProxy = new HttpURLConnectionProxy(url);
httpURLConnectionProxy.setHttpURLConnection(httpURLConnection);
httpURLConnectionProxy.setCookieManager(cookieManager);
return new MyHttpUrlConnection(httpURLConnectionProxy);
}
protected void prepareConnection(HttpURLConnection connection) throws IOException {
connection.setRequestMethod(HttpTransportConstants.METHOD_POST);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
// ORRRRR YEAAHHHHHHH!
cookieManager.setCookies(connection);
}
@Override
public boolean supports(URI uri) {
return true;
}
});
}
另一个复杂问题是我需要在调用 connect() 之前和之后设置和获取 cookie 数据。所以我创建了一个 HttpURLConnectionProxy 类,它代理对 url.openConnection() 生成的方法调用的所有方法调用,但在 connect() 之后执行 cookie 内容;
public void connect() throws IOException {
httpURLConnection.connect();
// WOOPWOOPWOOPWOOP!
cookieManager.storeCookies(httpURLConnection);
}
但它很奇怪
最佳答案
我认为您在扭曲 CookieManager API 的预期用途。请引用documentation和 CookieManager documentation .您的供应商的要求是维护服务器发送的 session cookie。要实现此要求,您需要两个步骤:
假设您使用的是 Spring 3.1 或更高版本,请在下面找到您的配置类:
@Configuration
@EnableWebMvc // this annotation imports the class WebMvcConfigurationSupport which bootstraps web mvc
@ComponentScan(basePackages = { "com.orgname" })
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/view/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
/**
* This method invocation bean stands for the method call:
* CookieHandler.setDefault(new CookieManager());
* which should be done at the beginning of an HTTP session to bootstrap
* the Java 6 Http state management mechanism for the application as a whole.
* (http://docs.oracle.com/javase/tutorial/networking/cookies/cookiehandler.html)
*
*/
@Bean(name="cookieHandlerSetDefaultBean")
public MethodInvokingFactoryBean methodInvokingFactoryBean() {
MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
methodInvokingFactoryBean.setTargetClass(CookieHandler.class);
methodInvokingFactoryBean.setTargetMethod("setDefault");
CookieManager cookieManager = new CookieManager();
methodInvokingFactoryBean.setArguments(new Object[]{cookieManager});
return methodInvokingFactoryBean;
}
}
鉴于您的客户端类是 Spring 服务或组件。请在下面找到它的代码。
/**
* This service aggregates the default CookieManager as explained in the API
* (http://docs.oracle.com/javase/6/docs/api/java/net/CookieManager.html).
* A system-wide CookieManager that is used by the HTTP protocol handler
* can be retrieved by calling CookieHandler.getDefault().
* A CookieManager is initialized with aآ CookieStoreآ which manages storage
* A CookieStore supports add(cookie) and getCookie() methods
* A CookieStore is responsible of removing Cookie instances which have expired.
*
*/
@Service(value="serviceConfigBean")
@DependsOn(value="cookieHandlerSetDefault") //This is the bean initialized in the Configuration class. It is needed to be initialized before the container initializes the Service
public class ClientCookiesStore {
private static final Logger logger = LoggerFactory.getLogger(ClientCookiesStore.class);
protected CookieStore inmemoryCookieStore;
protected URI clientURI;
/**
* The @PostConstruct (lifecycle callback method) indicates this method should be invoked after all
* dependency injection is complete. Thus helps in initializing any resources needed by the
* service.
*
* In this particular initializing method:
* (as per http://docs.oracle.com/javase/6/docs/api/java/net/CookieManager.html
* and http://docs.oracle.com/javase/tutorial/networking/cookies/cookiemanager.html)
* The CookieHandler default is installed in the application via
* a method invoking factory bean, namely "cookieHandlerSetDefault" which
* exists in the java configuration file WebConfig.java
* (1) A cookieManager property needs 2 steps setup as indicated in the code
* (2) The internal in-memory implementation of the CookieStore interface is initialized
* through the cookieManager defaults. It is assigned to the inmemoryCookieStore property.
* (3) Since a CookieStore aggregates many groups of cookies, each group is identified
* by a URI instance. ClientCookiesStore is associated with the Client URI as indicated in
* the code.
*
* @throws Exception
*/
@PostConstruct
protected void initializeBean() throws Exception {
// (1) Step#1 Initialize a CookieManager with the current Http session default
// which was already set in the configuration class
CookieManager cookieManager = (CookieManager)CookieHandler.getDefault();
// Step#2 Then set up the CookiePolicy.
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
// (2) Assign a CookieStore instance to the in-memory cookie store implemented by the API
inmemoryCookieStore = cookieManager.getCookieStore();
// (3) Initialize URI instance which will identify the Client cookies in the CookieStore
try {
clientURI = new URI("http://vendor.webservices.com/endpoint");
} catch (URISyntaxException e) {
throw new Exception("URISyntaxException created while creating a URI instance for url= "+clientUrl);
}
}
剩下的就是添加新 cookie 和从内存存储中检索 cookie 的 2 种方法。这两个方法都属于上面的 ClientCookiesStore 类。
public List<HttpCookie> getCookiesList() throws Exception {
List<HttpCookie> httpCookiesList = inmemoryCookieStore.get(clientURI);
return httpCookiesList;
}
public void addCookie(HttpCookie newCookie) {
inmemoryCookieStore.add(clientURI, newCookie);
}
关于java - 在 WebLogic 上设置默认的 CookieManager 没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20235207/
我正在尝试获取 m.facebook.com 的 cookie通过 CookieManager.getInstance().getCookie() 加载到 android.webkit.WebView
I've seen answers about how this should work with the old DefaultHttpClient but there's not a good e
很遗憾,Android 有大量的 cookie 管理器。 HttpURLConnection 的 cookie 由 java.net.CookieManager 维护,WebView 的 cookie
引用这个 How to secure a cookie in android? 我想在我的 android 应用程序中将 cookie 与 webview 一起使用。我想设置 cookie 的安全属性
我有一个应用程序,该应用程序进行多次网络调用以进行身份验证,然后返回一个 JSON。我的 Web 调用是针对 https 服务器的,我使用的是 HTTPURlConnection。 我需要将 se
我正在尝试通过线程建立多个连接。 但是每个连接似乎都会覆盖对方的 cookie,导致连接使用错误的 cookie。 在线程类的构造函数中: manager = new CookieManage
我正在尝试为每个 chromium 浏览器实例创建单独的用户 session ,但找不到任何有关如何创建的相关示例。目的是为每个浏览器实例单独存储 cookie。 谁能指出我正确的方向?我会发布相关代
我正在制作一个访问网站的 Java 程序,这取决于分发 cookie,以便我可以登录。我发现使用 CookieManager 将允许我的 URLConnection 至少收集这些 cookie,但是如
我正在使用 cookiemanager setcookie API 设置 cookie,当我执行 cookiemanager getcookie 时,我没有获取域和到期日期,下面是我的代码。 Stri
让我们为 cookie 存储做准备: CookieSyncManager.createInstance(getApplicationContext()); CookieSyncManager.getI
在我的 android 应用程序中,我有一个 webview。它从多个域加载 URL。我需要删除特定域中的所有 cookie。我想保留来自其他域的 cookie。但是我需要从一个域中删除所有 cook
在我的应用程序中,我从 HttpGet 请求中获取两个 cookie,并将它们存储在 CookieManager 中,如下所示: //Clear old cookies CookieManager.g
下面是我的代码,用于在 android 应用程序中获取一些 cookie 后身份验证。 String url = "https://host:port/sso/SSOServlet"; BasicCo
我需要将一个具有 native 登录屏幕的应用程序与在 web View (混合应用程序)内运行的应用程序的其余部分集成。这听起来像是一种常见的方法,但我在将 session 数据(cookie)从
OkHttpClient client = new OkHttpClient(); CookieManager cookieManager = new CookieManager(); cookieM
我使用以下命令向站点发出 HTTP 请求: //第一次调用服务器时执行 static { cookieManager = new CookieManager(); co
我知道 CookieManager 的存在, 但如何只删除域的 cookie? 有人可以帮我处理一些代码 fragment 吗? 最佳答案 public void clearCookies(Strin
对于 Android CookieManager类有一个方法——getCookie(String url) . 为此,我们需要知道正确的 url。 有没有办法获取 CookieManager 中的所有
如何将 cookie 从 Web 浏览器放入 Indy CookieManager 以进行 Http 请求。 我登录到这样的网站后会收到 cookie.. 测试项目 = http://www.mega
我正在使用 Spring 的 WebServiceGatewaySupport 连接到供应商的 SOAP Web 服务。该服务的要求之一是客户端必须维护服务器发送的 session cookie。 我
我是一名优秀的程序员,十分优秀!