在webview Android中打开新网址时维护会话attributte

时间:2014-01-22 04:44:25

标签: java android jsp session webview

我有一个Java / Jsp Web应用程序,在search_list.jsp页面,我在会话对象中设置结果,如下所示 -

<%

  Object resultdata = req.getSession().getAttribute("search_result");
  if(resultdata == null)
  { 
    resultdata  = (SearchResult)getSearchResult();
     request.getSession().setAttribute("search_result", resultdata);
 }

%>

当我点击另一个页面然后返回到search_list.jsp时,从Web浏览器中恢复会话中的结果对象工作正常,但同样的情况总是返回&gt;在android原生webview中resultdata为null。以下是Android原生应用程序的webview代码。

public class HomeActivity implements OnClickListener {

  public WebView mWebView;
  public String sessionCookie =  null;

  protected void onCreate(Bundle savedInstanceState) {

            mWebView = (WebView) findViewById(R.id.webView1);
            WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    webSettings.setLoadsImagesAutomatically(true);
              mWebView.loadUrl(appPrefer.getAppURL());          
         mWebView.setWebViewClient(new WebViewClient());

   }

  public void saveSession()
         CookieSyncManager cookieSyncManager =             CookieSyncManager.createInstance(mWebView.getContext());
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    if(mWebView!=null)
    {
            sessionCookie = cookieManager.getCookie(getCurrentURLLoad());               

    } 

}

private void addSession(String url) 
  {                 
    CookieSyncManager cookieSyncManager =  CookieSyncManager.createInstance(mWebView.getContext());
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);            
    if (sessionCookie != null) {            
            cookieManager.setCookie(url, sessionCookie);
            CookieSyncManager.getInstance().sync();         
        }

 }

这是按钮点击本机所在(它的快捷方式返回结果)我再次加载search_list.jsp以显示结果。但在网络级别,我们已经搜索并显示结果并查看profile.jsp页面。所以点击本机列表视图(网址是search_list.jsp)我添加会话如下:

public void onClick(View v) {
if(v.getId().== R.id.listview) 
   {
  saveSession();
  mWebView.loadUrl(HOST_URL + SEARCH_LIST );
      addSession();
    }
 }

我的问题是它保存/传递所有其他会话cookie值但是设置为request.session.attribute的值没有出现它们都是&gt; null,在jsp级别从本机点击更改url后,resultdata始终为null。< / p>

我已经尝试了在答案中提到的方法,也尝试了 - https://gist.github.com/arpit/610754方式,我总是看到我所有的cookie正确值(已经在我的帖子上工作了..)..但属性在HTTPRequest会话中设置不存在..我不认为它的一部分cookie是一个httpRequets属性(HttpServletRequest->httpSession->setAttribute()),我的结论是它不是来自Android webview或httpclient端。请有人让我知道是正确还是有办法读取http请求会话属性???

2 个答案:

答案 0 :(得分:1)

===============================这里的网页内容=====

您可能在Android中发现的事情是Web身份验证。大多数网站发布cookie来跟踪会话ID并保持用户登录。为了维护此身份验证,您需要在活动之间以及http客户端和Web视图之间保持Cookie同步。

我最终做的方法,似乎工作得很好,是创建一个扩展Application的类,然后定义一个HttpClient,用于整个Application的其余部分。该代码如下:

public class AppSettings extends Application {
    private static final DefaultHttpClient client = createClient();

    @Override
    public void onCreate(){
    }

    static DefaultHttpClient getClient(){
            return client;
    }
    private static DefaultHttpClient createClient(){
            BasicHttpParams params = new BasicHttpParams();
            SchemeRegistry schemeRegistry = new SchemeRegistry();
            schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
            schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
            ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
            DefaultHttpClient httpclient = new DefaultHttpClient(cm, params);
            httpclient.getCookieStore().getCookies();
            return httpclient;
    }

该类还创建了一个适用于AsyncTasks并同时发出多个http请求的HttpClient。对于ClientConnectionManager使用ThreadSafeClientConnManager,您可以在AsyncTasks中运行http请求,而不会在按下后退按钮并开始第二个或第三个时关闭力。

它还会创建一个可在您的所有活动中访问的默认Cookie存储。您可以通过调用getClient()方法在其他活动中使用它。

例如

public class SomeActivity extends Activity {
        static DefaultHttpClient mClient = AppSettings.getClient();
        ...
        try {

            HttpGet httpget = new HttpGet('URL');
            HttpResponse response;
            response = mClient.execute(httpget);
            ...
        }
        ...
    }

如果您发现有必要使用webview并且需要它来访问和使用与您的客户相同的cookie。您可以使用CookieManager同步客户端的cookie存储:(在onPageStarted方法中)

DefaultHttpClient mClient = AppSettings.getClient();


Cookie sessionInfo;
List<Cookie> cookies = mClient.getCookieStore().getCookies();

if (! cookies.isEmpty()){
        CookieSyncManager.createInstance(getApplicationContext());
        CookieManager cookieManager = CookieManager.getInstance();

        for(Cookie cookie : cookies){
                sessionInfo = cookie;
                String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain();
                cookieManager.setCookie("example.com", cookieString);
                CookieSyncManager.getInstance().sync();
        }
}

您需要使用正确的域名切换example.com。

答案 1 :(得分:0)

经过一段时间的调试并更好地理解我的问题后,我找到了以下内容:

1)如果在request.getSession()。setAttribute()中设置了对象/值,它保存在服务器端而不是http req / res,因此无法访问它们在原生方面。

2)但是每个服务器都会为JSESSIONID创建条件,这是获取服务器内存中每次命中或唯一命中数据的关键。

所以que是当我保存所有cookie并且传递(也有JSESSIONID cookie)仍然为什么它无法在服务器端获得正确的数据?

在我的结尾发现问题:[不确定这是一个常见的问题]

每次在原生方用户刷新或使用URL启动webview时(按钮点击的类型我只需在webview上重新加载url,启动新活动并关闭上一个活动)。这总是创建服务器端的新JSESSIONID .. ;(我尝试了很多方式来传递cookie,因此它不会启动新的Session,甚至保存最后的JSESSIONID cookie并注入新的加载URL但没有任何效果。:-( ..

所以最后我必须在URL中添加标头/参数来指示本机正在重新加载的服务器,并且会话将是新的,因此请相应处理并且不显示未找到结果的错误。