Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javafxwebview没有';不要保存饼干_Java_Javafx_Webview - Fatal编程技术网

javafxwebview没有';不要保存饼干

javafxwebview没有';不要保存饼干,java,javafx,webview,Java,Javafx,Webview,我是JavaFX新手,需要用浏览器窗口编写应用程序。浏览器将用于登录microstock agency fotolia,以解决登录时出现的验证码问题。显然,当关闭并稍后重新启动我的应用程序时,cookies不会被保存 有没有办法在JavaFX/webview中存储下一个会话的cookie?或者有人能告诉我,为什么饼干没有储存 javafxwebview使用内存中的cookie存储,因此不会在会话之间保存cookie。 您需要自己实现一个cookie存储 public class myCookie

我是JavaFX新手,需要用浏览器窗口编写应用程序。浏览器将用于登录microstock agency fotolia,以解决登录时出现的验证码问题。显然,当关闭并稍后重新启动我的应用程序时,cookies不会被保存


有没有办法在JavaFX/webview中存储下一个会话的cookie?或者有人能告诉我,为什么饼干没有储存

javafxwebview使用内存中的cookie存储,因此不会在会话之间保存cookie。 您需要自己实现一个cookie存储

public class myCookieStore implements CookieStore {...this is where you implement the interface...}
然后,在那个家商店里,你们会保存一份cookies列表。 可能是这样,但这取决于你

 private List<HttpCookie> cookies = new ArrayList<>();
在CookieStore的实现中,每当CookieStore发生更改时,您必须将该Cookie列表保存到一个文件(或数据库,或您放置它的任何位置),然后在应用程序重新加载时重新加载它

这就是我个人遇到障碍的地方,也是我如何找到你的问题的。HttpCookie没有实现serializable,并且具有不会反映的私有字段-这意味着不能简单地序列化和反序列化列表,并且使用gson.toJson()(此处列出的解决方案)也会失败。您可能需要手动保存cookie字段,然后重新生成cookie。如果我真的让它自己工作的话,我会用一个解决方案来更新它

///更新/// 事实证明,HTTPCookie的系列化问题始于Java9。如果您使用Java8,那么您可以简单地实现cookiestore接口,然后使用前面链接的文章中的Gson示例来持久化该列表。但是,如果您使用的是Java9或更高版本,那么就不能再这样做了,因为它会阻止gson用来访问私有字段的反射

我重新实现了HTTPCookie对象的可公开访问的成员,如下所示:

 public class myCookieClass implements Serializable{
    private URI uri;
    private String name;
    private String value;
    private String domain;
    private String path;
    private String portList;
    private String comment;
    private String commentURL;
    private boolean httpOnly;
    private boolean discard;
    private long maxAge;
    private boolean secure;
    private int version;



    public myCookieClass(URI uri, HttpCookie cookie){
        name = cookie.getName();
        value = cookie.getValue();
        domain = cookie.getDomain();
        maxAge =cookie.getMaxAge();
        path = cookie.getPath();
        httpOnly = cookie.isHttpOnly();
        portList = cookie.getPortlist();
        discard = cookie.getDiscard();
        secure = cookie.getSecure();
        version = cookie.getVersion();
        comment = cookie.getComment();
        commentURL = cookie.getCommentURL();
        this.uri = uri;
    }

    public HttpCookie toCookie(){
        HttpCookie cookie =  new HttpCookie(this.name,this.value);
        cookie.setSecure(secure);
        cookie.setDomain(domain);
        cookie.setMaxAge(maxAge);
        cookie.setPath(path);
        cookie.setHttpOnly(httpOnly);
        cookie.setPortlist(portList);
        cookie.setDiscard(discard);
        cookie.setVersion(version);
        cookie.setComment(comment);
        cookie.setCommentURL(commentURL);
        cookie.setValue(value);
        return cookie;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        myCookieClass that = (myCookieClass) o;
        return  uri.equals(that.uri) &&
                name.equals(that.name);

    }

    @Override
    public int hashCode() {
        return Objects.hash(uri, name);
    }
}
然后,我使用与之前基本相同的gson示例来保存和恢复该列表

   public void RestoreCookieStoreFromFile(){
    try {
        File file = new File(fileName);
        if (file.exists()) {
            System.out.println("RESTORE COOKIES");
            FileReader fileReader = new FileReader(fileName);
            String json = new String(Files.readAllBytes(Paths.get(fileName)));
            Gson gson = new GsonBuilder().create();
            Type type = new TypeToken<List<myCookieClass>>() {
            }.getType();
            cookies = gson.fromJson(json, type);

        }
        } catch(FileNotFoundException e){
            //file not found
            e.printStackTrace();
        } catch(IOException e){
            // cant create object stream
            e.printStackTrace();
        }


}

private void saveCookieStoreToFile(String location){
    try {
        Gson gson = new GsonBuilder().create();
        String jsonCookie = gson.toJson(cookies);
        Files.writeString(Path.of(fileName),jsonCookie);

    } catch (FileNotFoundException e) {
        // file not found
        System.out.println("Can't Save File");
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("Can't Save File OUTSTREAM");
        // can't create output stream
        e.printStackTrace();
    }
    catch (InaccessibleObjectException e){
        System.out.println("Can't Access object");
        e.printStackTrace();
    }
}
public void restorecookiesstorefromfile(){
试一试{
文件=新文件(文件名);
if(file.exists()){
System.out.println(“恢复COOKIES”);
FileReader FileReader=新的FileReader(文件名);
String json=新字符串(Files.readAllBytes(path.get(fileName));
Gson Gson=new GsonBuilder().create();
Type Type=new-TypeToken(){
}.getType();
cookies=gson.fromJson(json,类型);
}
}catch(filenotfounde异常){
//找不到文件
e、 printStackTrace();
}捕获(IOE异常){
//无法创建对象流
e、 printStackTrace();
}
}
私有void saveCookiesToFile(字符串位置){
试一试{
Gson Gson=new GsonBuilder().create();
字符串jsonCookie=gson.toJson(cookies);
Files.writeString(Path.of(fileName),jsoncokie);
}catch(filenotfounde异常){
//找不到文件
System.out.println(“无法保存文件”);
e、 printStackTrace();
}捕获(IOE异常){
System.out.println(“无法保存文件超流”);
//无法创建输出流
e、 printStackTrace();
}
捕获(不可访问对象异常e){
System.out.println(“无法访问对象”);
e、 printStackTrace();
}
}
这些是cookiestore接口成员,他们实际上正在做这项工作,至少在我的例子中是这样。还有一些成员,但似乎没有什么可以称之为这些

  @Override
public void add(URI uri, HttpCookie cookie)
{

        cookies.add(new myCookieClass(uri,cookie));

        saveCookieStoreToFile(fileName);

}


@Override
public List<HttpCookie> get(URI uri) {


    List<HttpCookie> uriCookies = new ArrayList<>();
    myCookieClass[] tempCookies = cookies.toArray(myCookieClass[]::new);
    for (myCookieClass c: tempCookies) {
        if(c.uri.toString().contains(uri.getRawAuthority())){
            uriCookies.add(c.toCookie());
        }
    }
        return uriCookies;
}


@Override
public List<HttpCookie> getCookies() {

        List<HttpCookie> httpCookies = new ArrayList<>();
        myCookieClass[] tempCookies = cookies.toArray(myCookieClass[]::new);
        for (myCookieClass c : tempCookies) {
            httpCookies.add(c.toCookie());
        }

        return httpCookies;

}
@覆盖
公共void添加(URI、HttpCookie cookie)
{
添加(新的mycokieclass(uri,cookie));
saveCookieStoreToFile(文件名);
}
@凌驾
公共列表获取(URI){
List uriCookies=新的ArrayList();
mycokieclass[]tempCookies=cookies.toArray(mycokieclass[]::新建);
对于(MyCookies c类:临时cookies){
如果(c.uri.toString().contains(uri.getRawAuthority())){
添加(c.toCookie());
}
}
退还饼干;
}
@凌驾
公共列表getCookies(){
List httpCookies=new ArrayList();
mycokieclass[]tempCookies=cookies.toArray(mycokieclass[]::新建);
对于(MyCookies c类:临时cookies){
添加(c.toCookie());
}
返回httpCookies;
}
为了完整起见,这是我记忆中保存cookies的列表

 private List<myCookieClass> cookies = new ArrayList<>();
private List cookies=new ArrayList();
一如既往,祝你好运

可能重复的
 private List<myCookieClass> cookies = new ArrayList<>();