java学习路线|java学习遇到的常见问题整理

更新时间:2019-09-23    来源:常见问题    手机版     字体:

【www.bbyears.com--常见问题】

java模拟https登陆

首先我要登陆,然后保存cookie,然后利用cookie来访问后续的网页,发包,处理包这样,然后,为了方便,我选择了 org.apache.http 这个库,典型的一个登陆场景应该是这样的,以后遇到问题一定先要去看官方的例子,别人给出的例子一般要么是不能用,要么是用的方法都是一些过时的,虽然能用,但看到警告还是不舒服。

public static BasicCookieStore cookieStore;
//整个过程用一个client
public static CloseableHttpClient httpclient;
cookieStore = new BasicCookieStore();
httpclient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
//先访问一下首页,然后cookie、会填充进来
HttpGet httpget = new HttpGet(“https://leaver.me/index.htm“);
httpclient.execute(httpget);
CloseableHttpResponse responseCookie = null;
//然后post请求登陆
HttpPost httpost = new HttpPost(“https://leaver.me/login.htm“);
//通过键值对来作为post参数
List < NameValuePair > nameValuePairs = new ArrayList < NameValuePair > (1);
nameValuePairs.add(new BasicNameValuePair(“loginType”, “1”));
nameValuePairs.add(new BasicNameValuePair(“loginName”, username));
nameValuePairs.add(new BasicNameValuePair(“Password”, password));
httpost.setEntity(new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8));
CloseableHttpResponse responLogin = null;
responLogin = httpclient.execute(httpost);


但是,这个过程报了如下的错

e: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

google之,发现时访问https的原因。需要先安装对应站点的证书。这里要用到一个通用的java类,我贴下链接

编译这个工具类,然后执行java InstallCert [:port] 会生成一个证书文件

然后在项目里通过

System.setProperty(“javax.net.ssl.trustStore”,
                “证书路径”);


设置即可,你可以吧证书文件放到资源目录,就更好了。

java正则替换反斜线

我在某个地方需要把字符串里的所有反斜线替换成两个,我就写了

str.replaceAll(““,”“)

结果发现我还是too young,实际上,

java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠 例如

str1=”aabbb”;

要想替换成

str1=”aabbb”;

必须这样替换:

str1 = str1.replaceAll(““, “\“);

原因如下: String 的 replaceAll() 方法,实际是采用正则表达式的规则去匹配的, ,java解析为交给正则表达式, 正则表达式再经过一次转换,把转换成为 也就是java里面要用正则来表示一个. 必须写成4个 如果要表示,那就要写8个 所以如果写成: str1 = str1.replaceAll(““, ““); 就会报正则表达式的错误。

httpClient如何模拟表单上传文件

这个还是要去看官方例子,网上没找到,需要添加

org.apache.http.entity包

//文件部分
FileBody csvFile = null;
//表单的其他部分
StringBody filelog = null;
StringBody dataItemDefine = null;
csvFile = new FileBody(new File(file));
filelog = new StringBody(“ADD”, ContentType.TEXT_PLAIN);
dataItemDefine = new StringBody(GlobalSetting.getValueOfKey(type), ContentType.TEXT_PLAIN);
//关键代码,此处来构造请求数据
HttpEntity reqEntity = MultipartEntityBuilder.create().addPart(“filelog”, changeLogAction).addPart(“dataItemDefine”, dataItemDefine).addPart(“fileName”, csvFile).build();
HttpPost httppost = new HttpPost(“https://leaver.me/uploadFile.action“);
httppost.setEntity(reqEntity);
CloseableHttpResponse response = null;
response = httpclient.execute(httppost);

其他都和普通的post请求没啥区别了

json-lib的一个问题

在maven里添加了json-lib的依赖后,启动报错

missing net.sf.json-lib,但实际上这个我的确是加载进来了。去了SO,才知道,还需要知道classifier 依赖,把jdk的版本添加上就行。这个应该是我当时添加的时候没有去maven中央库填写造成的


        net.sf.json-lib
        json-lib
        2.4
        jdk15
   


maven生成可执行jar包

写好的工具要打包,需要在pom文件,(我用mave来管理)里添加如下的配置


    maven-assembly-plugin
   
    false
   
        jar-with-dependencies
   

   
       
        *.account.core.GenerateAccount
       

   
   

   
   
        make-assembly
        package
       
        assembly
       

   

   



然后在工程目录执行

mvn assembly:assembly

就会在target目录生成jar包啦

java调用webservice

有一些已有的webservice服务,由xfire生成发布,有些有参数,有些无参数,无参数的直接我直接使用org.codehaus.xfire这个包里的Client来动态生成客户端。然后调用就可以了。非常简单

Client client = null;
        try {
            client = new Client(
                    new URL(
                            “http://leaver.me/testService?wsdl“));
            client.invoke(“refreshAllCache”, new Object[0]);

    } catch (MalformedURLException e) {

        e.printStackTrace();
    } catch (Exception e) {

        e.printStackTrace();
    }

但对于有参的,且是服务器自定义的类作为参数的时候,实在是搞不定。。不管是把自定义的类放到本地,包名一致,在invoke的时候生成这个对象还是其他什么方法。都无法完成。

最终换了直接发送soap报文来完成。dirty hack啊。如果你有一些好的方法希望不吝赐教。

解决方案来源自stackoverflow,因为stackoverflow现在国内好像有时候打不开。因此把代码贴过来。有疑问的话留言讨论。

import javax.xml.soap.;
import javax.xml.transform.;
import javax.xml.transform.stream.*;

public class SOAPClientSAAJ {

/**
 * Starting point for the SAAJ - SOAP Client Testing
 */
public static void main(String args[]) {
    try {
        // Create SOAP Connection
        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();

        // Send SOAP Message to SOAP Server
        String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";
        SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);

        // Process the SOAP Response
        printSOAPResponse(soapResponse);

        soapConnection.close();
    } catch (Exception e) {
        System.err.println("Error occurred while sending SOAP Request to Server");
        e.printStackTrace();
    }
}

private static SOAPMessage createSOAPRequest() throws Exception {
    MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage soapMessage = messageFactory.createMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();

    String serverURI = "http://ws.cdyne.com/";

    // SOAP Envelope
    SOAPEnvelope envelope = soapPart.getEnvelope();
    envelope.addNamespaceDeclaration("example", serverURI);

    /*
    Constructed SOAP Request Message:
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="http://ws.cdyne.com/">
        <SOAP-ENV:Header/>
        <SOAP-ENV:Body>
            <example:VerifyEmail>
                <example:email>mutantninja@gmail.com</example:email>
                <example:LicenseKey>123</example:LicenseKey>
            </example:VerifyEmail>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
     */

    // SOAP Body
    SOAPBody soapBody = envelope.getBody();
    SOAPElement soapBodyElem = soapBody.addChildElement("VerifyEmail", "example");
    SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("email", "example");
    soapBodyElem1.addTextNode("mutantninja@gmail.com");
    SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("LicenseKey", "example");
    soapBodyElem2.addTextNode("123");

    MimeHeaders headers = soapMessage.getMimeHeaders();
    headers.addHeader("SOAPAction", serverURI  + "VerifyEmail");

    soapMessage.saveChanges();

    /* Print the request message */
    System.out.print("Request SOAP Message = ");
    soapMessage.writeTo(System.out);
    System.out.println();

    return soapMessage;
}

/**
 * Method used to print the SOAP Response
 */
private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception {
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    Source sourceContent = soapResponse.getSOAPPart().getContent();
    System.out.print("nResponse SOAP Message = ");
    StreamResult result = new StreamResult(System.out);
    transformer.transform(sourceContent, result);
}

}

Access restriction on class due to restriction on required library rt.jar? 报错

总么都感觉是环境问题,系统bug。解决如下:

    进入project properties的 Build Path 设置里.
    移除 JRE System Library
    再添加回来,方法是: 选择 “Add Library” ,然后选择 JRE System Library.
    
SSHManager类报错:com.jcraft.jsch.JSchException: UnknownHostKey

我使用的一个SSHManager类如下:

package me.leaver.Util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class SSHManager {
private static final Logger LOGGER = Logger.getLogger(SSHManager.class
.getName());
private JSch jschSSHChannel;
private String strUserName;
private String strConnectionIP;
private int intConnectionPort;
private String strPassword;
private Session sesConnection;
private int intTimeOut;

private void doCommonConstructorActions(String userName, String password,
        String connectionIP, String knownHostsFileName) {
    jschSSHChannel = new JSch();

    try {
        jschSSHChannel.setKnownHosts(knownHostsFileName);
    } catch (JSchException jschX) {
        logError(jschX.getMessage());
    }

    strUserName = userName;
    strPassword = password;
    strConnectionIP = connectionIP;
}

public SSHManager(String userName, String password, String connectionIP,
        String knownHostsFileName) {
    doCommonConstructorActions(userName, password, connectionIP,
            knownHostsFileName);
    intConnectionPort = 22;
    intTimeOut = 60000;
}

public SSHManager(String userName, String password, String connectionIP,
        String knownHostsFileName, int connectionPort) {
    doCommonConstructorActions(userName, password, connectionIP,
            knownHostsFileName);
    intConnectionPort = connectionPort;
    intTimeOut = 60000;
}

public SSHManager(String userName, String password, String connectionIP,
        String knownHostsFileName, int connectionPort,
        int timeOutMilliseconds) {
    doCommonConstructorActions(userName, password, connectionIP,
            knownHostsFileName);
    intConnectionPort = connectionPort;
    intTimeOut = timeOutMilliseconds;
}

public String connect() {
    String errorMessage = null;

    try {
        sesConnection = jschSSHChannel.getSession(strUserName,
                strConnectionIP, intConnectionPort);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        sesConnection.setConfig(config);
        sesConnection.setPassword(strPassword);
        sesConnection.connect(intTimeOut);
    } catch (JSchException jschX) {
        errorMessage = jschX.getMessage();
    }

    return errorMessage;
}

private String logError(String errorMessage) {
    if (errorMessage != null) {
        LOGGER.log(Level.SEVERE, "{0}:{1} - {2}", new Object[] {
                strConnectionIP, intConnectionPort, errorMessage });
    }

    return errorMessage;
}

private String logWarning(String warnMessage) {
    if (warnMessage != null) {
        LOGGER.log(Level.WARNING, "{0}:{1} - {2}", new Object[] {
                strConnectionIP, intConnectionPort, warnMessage });
    }

    return warnMessage;
}

public String sendCommand(String command) {
    StringBuilder outputBuffer = new StringBuilder();

    try {
        Channel channel = sesConnection.openChannel("exec");
        ((ChannelExec) channel).setCommand(command);
        channel.connect();
        InputStream commandOutput = channel.getInputStream();
        int readByte = commandOutput.read();

        while (readByte != 0xffffffff) {
            outputBuffer.append((char) readByte);
            readByte = commandOutput.read();
        }

        channel.disconnect();
    } catch (IOException ioX) {
        logWarning(ioX.getMessage());
        return null;
    } catch (JSchException jschX) {
        logWarning(jschX.getMessage());
        return null;
    }

    return outputBuffer.toString();
}

public void close() {
    sesConnection.disconnect();
}

}


报这个错是因为

public String connect() {
        String errorMessage = null;

    try {
        sesConnection = jschSSHChannel.getSession(strUserName,
                strConnectionIP, intConnectionPort);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        sesConnection.setConfig(config);
        sesConnection.setPassword(strPassword);
        sesConnection.connect(intTimeOut);
    } catch (JSchException jschX) {
        errorMessage = jschX.getMessage();
    }

    return errorMessage;
}

连接这段代码里少了config.put(“StrictHostKeyChecking”, “no”);这段设置,这个是去掉了严格的安全检查,一般只用于测试目的。

navicat连接oracle数据库

之前使用PL/SQL操作Oracle数据库,使用Heidisql操作mysql数据库。。切换麻烦。而且PL/SQL搜索的时候中文有问题。于是打算使用navicat统一管理

方法是:

1.首先下载Instant Client 的32位版本和Navicat Premium

2.然后解压Instant Client,配置navicat

navicat_oracle

选择oci文件即可

然后新建oracle配置,选择basic模式,其他的根据你的数据库信息自己填写即可。

本文来源:http://www.bbyears.com/jiaocheng/68938.html

热门标签

更多>>

本类排行