java 发送post请求,内容为xml

一个web service 提供了post请求方式,用户发送一个xml请求文档比如:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>


name

zhangsan




info


服务端会返回zhangsan的信息。上面的xml文档在浏览器中通过post表单方式正常执行。
但是在java中就不行了java种代码如下:
[code="java"]
package common.post;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class PostTest {
void testPost(String urlStr) {
try {
URL url=new URL(urlStr);
URLConnection con=url.openConnection();
con.setDoOutput(true);
OutputStreamWriter out=new OutputStreamWriter(con.getOutputStream());
String request=readFile();
System.out.println("Exedata satart\n"+request+"\nExe end");
out.write(new String(request.getBytes("ISO-8859-1")));

        out.flush();
        out.close();
        BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line="";
        for(line=br.readLine();line!=null;line=br.readLine()) {
            System.out.println(line);
        }
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
private String readFile() {
    StringBuilder sb=new StringBuilder();
    try {
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("E:/raw.xml")));
                      //这里的raw.file内容就是 上面那个xml片段,就是读取内容,将请求的xml保存成字符串 进行post发送
        String line="";
        for(line=br.readLine();line!=null;line=br.readLine()) {
            sb.append(line+"\n");
        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return sb.toString();
}
public static void main(String[] args) {
    String url="http://localhost:9000/WebService";
    new PostTest().testPost(url);
}

}

[/code]

结果一直是
There went something wrong with parsing the POST data: Premature end of file.
这是什么原因

[b]问题补充:[/b]
好像发现问题了:
我在webservice中有这个代码,是用来截取请求的字段的:
[code="java"]
InputStream is=......;

DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
fac.setNamespaceAware(true);
//BufferedReader br=new BufferedReader(new InputStreamReader(is));
//FileOutputStream fos=new FileOutputStream("E:/is.xml");
//for(String line=br.readLine();line!=null;line=br.readLine()) {
// fos.write((line+"\n").getBytes());
//}
//fos.close();
//br.close();
// parse the InputStream to create a Document
doc = fac.newDocumentBuilder().parse(is);
[/code]

后来我把中间那个网文件写入的代码注释后 就没问题了 是不是一个InputStream只能用一次啊?
如果我想实现如上功能,就是先写入到文件中,然后解析,这个InputStream该怎么搞?复制一个?
[b]问题补充:[/b]
[quote]你都已经先写到文件中了,再解析就应该是对文件的内容进行解析了,而不是再去得到原来的InputStream输入流再进行操作 [/quote]

写到文件只是为了测试用的,这么说InputStream写入到文件后,就不能继续用了么?
[b]问题补充:[/b]
[quote]不是,看错了你的代码,

你只用了一次,程序看来是没什么问题[/quote]

现在问题已经解决了
[code="java"] 1. InputStream is=......;

  1. DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
  2. fac.setNamespaceAware(true);
  3. //BufferedReader br=new BufferedReader(new InputStreamReader(is));
  4. //FileOutputStream fos=new FileOutputStream("E:/is.xml");
  5. //for(String line=br.readLine();line!=null;line=br.readLine()) {
  6. // fos.write((line+"\n").getBytes());
  7. //}
  8. //fos.close();
    1. //br.close();
    2. // parse the InputStream to create a Document
    3. doc = fac.newDocumentBuilder().parse(is); [/code] 还是这个代码 如果注释部分去掉注释 也就是执行的话 就会出错 如果注释掉就没问题. 我现在的疑问是如果注释代码执行,InputStream就用了2次,是不是因为这个原因,第一次是写入文件,第二次是parse,第二次这个流是不是已经空了,所以异常发生? [quote]web service的调用,我怀疑是不能以out.write(new String(request.getBytes("ISO-8859-1")));把请求内容写进去就当是post [/quote] 我觉得可能不是这个问题 因为con.setDoOutput(true); 就意味着post了

6个回答

不是,看错了你的代码,

你只用了一次,程序看来是没什么问题,

web service的调用,我怀疑是不能以out.write(new String(request.getBytes("ISO-8859-1")));把请求内容写进去就当是post

URL url=new URL(urlStr);
HttpURLConnection con=(HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");

用httpclient去吧,
URLConnection 也应该是用HttpURLConnection才是支持 HTTP 特定功能的 URLConnection。

用以下代码试一下:
String inputLine = null;
StringBuffer sb = new StringBuffer();
URL url = new URL("http://127.0.0.1:8088/workflow/jsp/b.jsp");
HttpURLConnection httpConnection =(HttpURLConnection) url.openConnection();
BufferedReader br =new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));

    while ((inputLine = br.readLine()) != null) {
        sb.append(inputLine.trim());
    }
    br.close();
    httpConnection.disconnect();
    DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    factory.setNamespaceAware(false);
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputStream inputStream =new ByteArrayInputStream(sb.toString().trim().getBytes());
    Document doc = builder.parse(inputStream);
.       .
.other codes    .
.       .

不是InputStreamReader只能用一次,而是你有br已经读取到最底了.

[code="java"]for(String line=br.readLine();line!=null;line=br.readLine())[/code]

这里的br.readLine()已经把文件读完了

如果我想实现如上功能,就是先写入到文件中,然后解析,这个InputStream该怎么搞?复制一个?


你都已经先写到文件中了,再解析就应该是对文件的内容进行解析了,而不是再去得到原来的InputStream输入流再进行操作

你都已经先写到文件中了,那输入流的读取位置就变成了流的末尾

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
RESTer发送post请求与表单post请求的区别
## 测试时发现一个很蛋疼的问题, 使用form表单提交时servlet可以正常获取参数, 但是使用Rester测试则获取参数失败, 直接为null; ## 有没有前辈遇到过这种问题; ## 参数获取方法均采用最基础的req.getParameter(); ## 两组请求只有请求头不同; ## **失败的请求头** ``` Host: 127.0.0.1:9090 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 Accept: */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate content-type: text/plain;charset=UTF-8 origin: moz-extension://f6c667d7-d221-4f5e-aa91-67e75dfe5914 Content-Length: 44 Cookie: JSESSIONID=1833498450D841AEFAFBEA47328A6E4B Connection: keep-alive Pragma: no-cache Cache-Control: no-cache ``` **成功的请求头** ``` Host: 127.0.0.1:9090 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://127.0.0.1:9090/RequestResponseServlet/test.jsp Content-Type: application/x-www-form-urlencoded Content-Length: 44 Cookie: JSESSIONID=1833498450D841AEFAFBEA47328A6E4B Connection: keep-alive Upgrade-Insecure-Requests: 1 ```
java post请求下载银行端的对称密钥和公钥
如何通过银行提供的 URL 地址,企业客户系统 POST 请求到此地址下载银行的对称密钥和公钥,并且要传递2连个参数。这个下载请求怎么写?像这种要传参数的是用httpClient还是通过HttpUrlConnection?希望各位好心人能给个范例,小弟之前对网络编程没有做过。还有就是下载到的公钥和对称密钥正规的做法是如何存储的,是以字符串存储到到一个xml配置文件里还是把密钥和公钥写到一个文件里存储?(每次需要用密钥和公钥进行对银行返回进行解密、验签)
maven框架下添加了jersey-quickstart-webapp,如何将http请求转换为https请求?
目前用maven和jersey-quickstart-webapp框架实现了http形式的get请求和post请求,已经部署到tomcat上了,利用postman验证可以传输数据, 但是项目要求不用http而是https的,该如何实现呢? 代码如下 ## resource core的代码 ``` package com.ps.pcms; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; /** * Root resource (exposed at "*" path) */ @Path("*") @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public class Core { /** * Method handling HTTP GET requests. The returned object will be sent to the * client as "text/plain" media type. * * @return String that will be returned as a text/plain response. */ @GET @Path("/get") public String getIt(String str) { return "GET_SUCCESS!!\r\n" + str; } @POST @Path("/post") public String postIt(String str) { return "POST_SUCCESS!!\r\n" + str; } } ``` ## webxml配置代码 ``` <?xml version="1.0" encoding="UTF-8"?> <!-- This web.xml file is not required when using Servlet 3.0 container, see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html --> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.ps.pcms</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey Web Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> ``` ## poem文件配置代码 ``` <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ps</groupId> <artifactId>pcms</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>pcms</name> <build> <finalName>pcms</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <inherited>true</inherited> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencyManagement> <dependencies> <dependency> <groupId>org.glassfish.jersey</groupId> <artifactId>jersey-bom</artifactId> <version>${jersey.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <!-- use the following artifactId if you don't need servlet 2.x compatibility --> <!-- artifactId>jersey-container-servlet</artifactId --> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> </dependency> </dependencies> <properties> <jersey.version>2.30</jersey.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project> ``` 文件夹目录如下: ![图片说明](https://img-ask.csdn.net/upload/202001/30/1580367418_761657.png)
http的post请求能进行多次数据交换吗?
             (发送http的post请求,xml格式数据) client 客户端 -------------------------》server服务端,server服务端解析xml返回xml格式的数据响应给client客户端,然后客户端还能根据上一次响应接着发送http请求给服务端吗??(如果可以请付上详细的方法,谢谢大牛们!!)
Android POST请求上传中文到 JAVA 后台服务器显示乱码
Android这边使用的是OKHTTP3作为网络框架的,我查了一下发现它的默认编码就是UTF-8,请求时使用了一个工具类来提交POST请求,代码如下: ``` public static Object[] postHttp(Context context, String url, HashMap<String, String> params, String cachetype, int cacheseconds) { try { // 缓存文件夹 File cacheFile = new File(context.getExternalCacheDir().toString(), "cache"); // 缓存大小为50M int cacheSize = 50 * 1024 * 1024; // 创建缓存对象 final Cache cache = new Cache(cacheFile, cacheSize); OkHttpClient mOkHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .cache(cache) .build(); FormBody.Builder formBodyBuilder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) formBodyBuilder.add(entry.getKey(), entry.getValue()); RequestBody formBody = formBodyBuilder.build(); CacheControl cacheControl = null; if (cachetype.equals(TYPE_CACHE_CONTROL)) { cacheControl = new CacheControl.Builder() .maxAge(cacheseconds, TimeUnit.SECONDS).build(); } if (cachetype.equals(TYPE_FORCE_CACHE)) { cacheControl = FORCE_CACHE; } if (cachetype.equals(TYPE_FORCE_NETWORK)) { cacheControl = FORCE_NETWORK; } Request request = new Request.Builder() .cacheControl(cacheControl) .url(url) .post(formBody) .build(); Response response = mOkHttpClient.newCall(request).execute(); String result = response.body().string(); // ... } catch (Exception e) { // ... } } ``` JAVA后台已经设置了编码: ``` request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); ``` TOMCAT中的server.xml中也进行了设置: ``` <Connector port="8080" protocol="HTTP/1.1" useBodyEncodingForURI="true" URIEncoding="utf-8" connectionTimeout="20000" redirectPort="8443" /> ``` Android上传中文的时候,服务器接收到的是%E5%95%A6%E5%95%A6%E5%95%A6这样的编码。 这个问题困扰了我很久,请问有大神知道解决方案吗?
使用java的Http请求里的Url对象调用第三方接口返回的数据中文乱码
URL url = new URL("http://apis.5118.com/morerank/baidupc"); // 将url 以 open方法返回的urlConnection 连接强转为HttpURLConnection连接 (标识一个url所引用的远程对象连接) // 此时cnnection只是为一个连接对象,待连接中 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置连接输出流为true,默认false (post 请求是以流的方式隐式的传递参数) connection.setDoOutput(true); // 设置连接输入流为true connection.setDoInput(true); // 设置请求方式为post connection.setRequestMethod("POST"); connection.setRequestProperty("Charsert", "UTF-8"); //设置请求编码 // post请求缓存设为false connection.setUseCaches(false); // 设置该HttpURLConnection实例是否自动执行重定向 connection.setInstanceFollowRedirects(true); // 设置请求头里面的各个属性 (以下为设置内容的类型,设置为经过urlEncoded编码过的from参数) // application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据 // ;charset=utf-8 必须要,不然妙兜那边会出现乱码【★★★★★】 //addRequestProperty添加相同的key不会覆盖,如果相同,内容会以{name1,name2} connection.addRequestProperty("from", "sfzh"); //来源哪个系统 //setRequestProperty添加相同的key会覆盖value信息 //setRequestProperty方法,如果key存在,则覆盖;不存在,直接添加。 //addRequestProperty方法,不管key存在不存在,直接添加。 connection.setRequestProperty("Authorization", " APIKEY D9FD7C014E8E4367B2891EF5B4B493"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 建立连接 (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行) connection.connect(); // 创建输入输出流,用于往连接里面输出携带的参数,(输出内容为?后面的内容) DataOutputStream dataout = new DataOutputStream(connection.getOutputStream()); // 格式 parm = aaa=111&bbb=222&ccc=333&ddd=444 String parm = "taskid="+taskid; System.out.println("传递参数:" + parm); // 将参数输出到连接 dataout.writeBytes(parm); // 输出完成后刷新并关闭流 dataout.flush(); dataout.close(); // 重要且易忽略步骤 (关闭流,切记!) //System.out.println(connection.getResponseCode()); // 连接发起请求,处理服务器响应 (从连接获取到输入流并包装为bufferedReader) BufferedReader bf = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); String line; StringBuilder sb = new StringBuilder(); // 用来存储响应数据 // 循环读取流,若不到结尾处 while ((line = bf.readLine()) != null) { //sb.append(bf.readLine()); String lin=new String(line.getBytes(), "utf-8"); sb.append(lin); } bf.close(); // 重要且易忽略步骤 (关闭流,切记!) connection.disconnect(); // 销毁连接 return sb.toString(); 返回的数据中文乱码使用java的Http请求里的Url对象调用第三方接口返回的数据中文乱码
这段关于http协议实现xml的代码如何实现?用tomcat+eclipse
客户端发送请求、以及处理服务端响应代码为: //发送xml请求 URL url = new URL("http://127.0.0.1:8080/Test/sendXmlAndReturnXml.do"); String xml = "<aaa><ddd>cccccc客户端请求的xml数据cccccccc</ddd></aaa>"; URLConnection conn = null; conn = url.openConnection(); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestProperty("Content-Length", Integer.toString(xml.length())); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); OutputStream ops = conn.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(ops, "GBK"); osw.write(xml); osw.flush(); osw.close(); //发送成功后,获取服务器的响应xml串: StringBuffer sb = new StringBuffer(); String line = ""; InputStream is = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is));//三层包装 while ((line = br.readLine()) != null) { sb.append(line+ "\r\n"); } System.out.println(sb.toString()); 服务器端: @Controller public class TestXMLAction { @RequestMapping("/sendXmlAndReturnXml.do") public void sendXmlAndReturnXml(HttpServletRequest request, HttpServletResponse response) throws IOException{ //获取请求的xml System.out.println("请求的xml数据为:\n" + getXmlFromRequest(request)); //服务端响应xml数据 response.getWriter().print("<aaa><ddd>bbbccc服务端返回响应xml数据,在客户端可以获取到</ddd></aaa>"); } //从HTTP请求中取出请求的XML private String getXmlFromRequest(HttpServletRequest request)throws IOException { String reqXml = ""; reqXml = request.getQueryString(); //GET请求 if (StringUtils.isBlank(reqXml)) { //POST请求 BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream())); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } br.close(); reqXml = sb.toString(); } return reqXml; } } ———————————————— 版权声明:本文为CSDN博主「weiwei358」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weiwei358/article/details/83670278
JAVA POST登录异常问题?
网上找的HTTP登录代码,登录后返回能200,但是不用用户名密码也返回200,且用Cookie[] cookies = httpClient.getState().getCookies(); StringBuffer tmpcookies = new StringBuffer(); for (Cookie c : cookies) { tmpcookies.append(c.toString() + ";"); System.out.println("cookies = "+c.toString()); } 能取到Cookies,这个搞不懂 登录成功后跳到另一个网页,但是用System.out.println("ResponseBody:\n" + stringBuffer.toString());返回如下: ``` <html> <head><title></title> <SCRIPT LANGUAGE="JavaScript"> var currentWindow = window; if(currentWindow != null){ currentWindow.top.location = "/NMMP/jsp/login.jsp"; } </SCRIPT> </head> ``` 感觉跳转时少了东西,所以跳转后的网页不对,请各们大神帮分析下,或者给个思路,本人不是搞程序的,只是想做一个来应对自己的重复工作,完整代码如下:本人无C币,如果有兴趣帮我做可商量 ``` import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; /** * * @ClassName: HttpLogin * @Description: java通过httpclient获取cookie模拟登录 * @author zeze * @date 2015年11月10日 下午4:18:08 * */ public class HttpLogin { public static void main(String[] args) { // 登陆 Url String loginUrl = "http://10.154.13.82:7011/NMMP/jsp/login.jsp"; // 需登陆后访问的 Url String dataUrl = "http://10.154.13.82:7011/NMMP/wyMainAction!init.ilf"; //http://10.154.13.82:7011/NMMP//jsp/wyService/mytasklist.jsp HttpClient httpClient = new HttpClient(); // 模拟登陆,按实际服务器端要求选用 Post 或 Get 请求方式 PostMethod postMethod = new PostMethod(loginUrl); // 设置登陆时要求的信息,用户名和密码 NameValuePair[] data = { new NameValuePair("useraccount", ""), new NameValuePair("password", "Hn_yd45") }; postMethod.setRequestBody(data); try { // 设置 HttpClient 接收 Cookie,用与浏览器一样的策略 httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); int statusCode=httpClient.executeMethod(postMethod); // 获得登陆后的 Cookie Cookie[] cookies = httpClient.getState().getCookies(); StringBuffer tmpcookies = new StringBuffer(); for (Cookie c : cookies) { tmpcookies.append(c.toString() + ";"); System.out.println("cookies = "+c.toString()); } System.out.println(statusCode); if(statusCode==200){//重定向到新的URL System.out.println("模拟登录成功"); // 进行登陆后的操作 GetMethod getMethod = new GetMethod(dataUrl); // 每次访问需授权的网址时需带上前面的 cookie 作为通行证 // getMethod.setRequestHeader("cookie", tmpcookies.toString()); // 你还可以通过 PostMethod/GetMethod 设置更多的请求后数据 // 例如,referer 从哪里来的,UA 像搜索引擎都会表名自己是谁,无良搜索引擎除外 // postMethod.setRequestHeader("Referer", "http://passport.mop.com/"); getMethod.setRequestHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"); getMethod.setRequestHeader("Referer","http://10.154.13.82:7011/NMMP/login.ilf"); getMethod.setRequestHeader("Accept-Encoding","gzip, deflate"); getMethod.setRequestHeader("Accept-Language","zh-CN,zh;q=0.9"); getMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" ); httpClient.executeMethod(getMethod); statusCode=httpClient.executeMethod(getMethod); System.out.println("模拟登录成功"+statusCode); // 打印出返回数据,检验一下是否成功 // String text = getMethod.getResponseBodyAsString(); InputStream inputStream = getMethod.getResponseBodyAsStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); StringBuffer stringBuffer = new StringBuffer(); String str= ""; while((str = br.readLine()) != null){ stringBuffer .append(str ); } System.out.println("ResponseBody:\n" + stringBuffer.toString()); HttpRequestProxy hrp = new HttpRequestProxy(); Map date = new HashMap(); date.put("jyidApplet", "1"); date.put("codeNumApplet", "1"); date.put("jymxIdApplet", "447"); date.put("patientIdApplet", "1118"); String str1 = hrp.doRequest(dataUrl,date, null, null); System.out.println("sd"+str1); } else { System.out.println("登录失败"); } } catch (Exception e) { e.printStackTrace(); } } } ``` 登录网页源码如下: ``` <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>综合管理系统</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <style type="text/css"> *{ margin:auto; } html,body{ overflow:hidden; width:100%; height:100%; margin:auto; } body{ background:url(/NMMP/common-skins/maintain/images/login_bg_1.0.gif); } #login_panel{ background-image:url(/NMMP/common-skins/maintain/images/login_panel_bg_1.0.png); background-repeat:repeat-x; height:640px; width:100%; text-align:center; position:relative; } #login_input{ background-image:url(/NMMP/common-skins/maintain/images/login_input_1.0.png); background-repeat:no-repeat; width:668px; height:403px; position:relative; } #useraccount{ border:none; position:absolute; left:392px; top:149px; height:24px; width:136px; background-color:#99deff; } #password{ border:none; position:absolute; left:392px; top:183px; height:24px; width:136px; background-color:#99deff; } #login_botton{ position:absolute; left:537px; _left:538px; top:147px; } #message{ position:absolute; left:348px; top:218px; color:#F00; font-size:14px; font-weight:bold; } #technical{ position:absolute; left:375px; top:258px; text-align:left; color:#CCC; font-size:12px; line-height:30px; } #copyright{ position:absolute; bottom:65px; right:0px; color:#CCC; font-size:12px; text-align:right; line-height:20px; } </style> <!--[if IE 6]> <script language="javascript" type="text/javascript" src="/NMMP/common-skins/default/jslib/DD_belatedPNG.js"> </script> <script language="javascript" type="text/javascript"> DD_belatedPNG.fix('#login_panel'); DD_belatedPNG.fix('#login_input'); </script> <![endif]--> </head> <body windowc_onresizez="true"> <div id="login_panel"> <div id="login_input" style="top: 110.5px;"> <form name="form1" action="/NMMP/CtrlUser.action?action=login&amp;surl=jsp/home/main.jsp&amp;furl=jsp/login.jsp" method="post" 360chrome_form_autofill="2"> <input name="useraccount" id="useraccount" style="background-color: rgb(250, 255, 189);" required="true" type="text"> <input name="password" id="password" style="background-color: rgb(250, 255, 189);" required="true" type="password"> <input id="login_botton" type="image" src="/NMMP/common-skins/maintain/images/login_botton.png"> <div id="message"> </div> <!-- div id="technical"><a style="color:orange" href="javascript:void(0)" onclick="resetpwd();">密码重置</a></div--> <div id="copyright">版权所有:</div> </form> </div> </div> <script language="javascript" type="text/javascript"> document.getElementById("login_input").style.top=(document.body.clientHeight-403)/2+"px"; function resetpwd(){ var url = "/NMMP/resetpwdAction.ilf"; window.location.href=url; } </script> </body></html> ```
java 调用 rest 接口 怎么写请求行的信息?
Rest接口格式:每一个请求通常由三部分组成:请求行、请求报头、请求正文(可选)。 请求样例: Post <basic_uri>/services/ita/login HTTP/1.1 Host: https://<ip>:<port> Accept:application/json;charset=UTF-8;Content-Type:application/json; charset=UTF-8 Accept-Language:zh_CN X-Auth-User:user X-Auth-Key:password 通过下面的代码,我可以设置请求属性。 URL httpurl = new URL(url); HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setDefaultUseCaches(false); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); conn.setRequestProperty("Content-Length", String.valueOf(xml.length())); conn.setRequestProperty("SOAPAction", ""); conn.setConnectTimeout(60*1000); conn.setReadTimeout(60*1000); conn.setRequestMethod("POST"); 但是怎么在java代码里写请求行:Post <basic_uri>/services/ita/login HTTP/1.1的信息呢?
基于springmvc+mybatis的登录表单提交后404
前端填写正确的用户名和密码后,提交登录,浏览器显示404,前端提交的地址是/userlogin,后端对接的/user/userlogin也是对的,浏览器f12里显示请求的确成功传给了后端,但是不知道为什么404。用的是tomcat8.5,java版本1.8,phpstudy最新版,mysql5.7.26。 ## 这是所用到的包: ![图片说明](https://img-ask.csdn.net/upload/202002/01/1580567617_880785.jpg) ## 这是目录结构: ![图片说明](https://img-ask.csdn.net/upload/202002/01/1580567511_223692.jpg) ## 这是web.xml: ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>springmvc_test</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 配置spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 加载spring配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/context-config.xml</param-value> </context-param> <!-- 配置前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- DispatcherServlet在初始化方法里面会读取该初始化参数的值来获得 spring配置文件的位置 ,然后启动spring容器。 --> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 配置字符编码 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> ``` ## 这是context-config.xml: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描service包下的注解 --> <context:component-scan base-package="com.test.service"></context:component-scan> <!-- 配置数据库 --> <!-- 加载配置文件 --> <!-- <context:property-placeholder location="classpath:jdbc.properties"/> --> <bean id="dateSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driver" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/Eday_Test"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <!-- 配置Sqlsessionfactory并将数据源注入 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 引入数据源 --> <property name="dateSource" ref="dateSource"></property> <!-- 载入mybatis配置文件 --> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!-- 载入配置mapper映射的xml --> <property name="mapperLocations" value="classpath:com/test/mapper/*.xml"></property> </bean> <!-- 配置扫描mapper接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackge" value="com.test.mapper"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dateSource" ref="dateSource"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans> ``` ## 这是mybatis-config.xml: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <!-- 配置别名 --> <typeAlias alias="User" type="com.test.pojo.User"/> </typeAliases> </configuration> ``` ## 这是springmvc-config.xml: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 扫描controller包下的注解 --> <context:component-scan base-package="com.test.controller"></context:component-scan> <!-- 开启注解 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 静态资源访问 --> <mvc:default-servlet-handler/> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置试图解析的默认路径,即配置页面的根路径 --> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans> ``` ## 这是UserController.java: ```java package com.test.controller; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.test.pojo.User; import com.test.service.UserService; //声明控制器 @Controller //设置bean的scope属性为多例(prototype) @Scope("prototype") //设置请求映射,当客户端请求/user时,转到该控制器处理 @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value="/userlogin") public ModelAndView login(String user_Name,String user_pwd,ModelAndView mv,HttpSession session){ //调用userService中的login方法处理user实体类对象 User user = userService.login(user_Name,user_pwd); //登录的逻辑判断,判断条件是返回结果不为空 if(user!=null){ //登陆成功,将user对象设置到HttpSession作用范围域中,相当于服务端的cookie,有效时间默认30分钟 //在程序运行期间,在任意页面都可以提取它的值。 session.setAttribute("user",user); //转发到main请求 //登录成功,跳转页面 mv.setViewName("login/login-success"); }else{ //登录失败,向前端传递失败信息 mv.addObject("message","用户名或密码错误,请重新输入!"); //登录失败,跳转到登录页面 mv.setViewName("login"); } return mv; } //跳转到用户注册界面 @RequestMapping(value="/userregister"/*,method=RequestMethod.POST*/) public String register(User user){ String user_Name = user.getUser_Name(); //如果数据库中没有该用户,可以注册,否则跳转页面 if(userService.findByUserName(user_Name)==null){ //添加用户 userService.register(user); //注册成功,跳转到主页面 return "index"; }else{ //注册失败,跳转到错误页面 return "error"; } } } ``` ## 这是UserMapper.java: ```java package com.test.mapper; import org.apache.ibatis.annotations.Param; import com.test.pojo.User; public interface UserMapper { //根据用户名和密码查找,mybatis中有多个参数时,需要使用@Param注解 User findByUserNameAndPassword(@Param("user_Name")String user_Name,@Param("user_Pwd")String user_Pwd); //增加用户 void addUser(User user); //根据用户名查询 User findByUserName(String user_Name); } ``` ## 这是UserMapper.xml: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.tes.mapper.UserMapper"> <!-- 根据用户名和密码查询 --> <select id="findByUserNameAndPasssword" resultType="User"> select * from user where user_Name=#{user_Name} and user_Pwd=#{user_Pwd} </select> <!-- 增加用户 --> <insert id="addUser" parameterType="User"> insert into user (user_Name,user_Pwd,user_Email,user_NickName,user_Birth,user_Phone,user_InvitationCode) values(#{user_Name},#{user_Pwd},#{user_Email},#{user_NickName},#{user_Birth},#{user_Phone},#{user_InvitationCode}) </insert> <!-- 根据用户名查询 --> <select id="findByUserName" resultType="User"> select * from user where user_Name=#{user_Name} </select> </mapper> ``` ## 这是User.java: ```java package com.test.pojo; import java.sql.Timestamp; public class User { private int user_Id; private String user_Name; private int user_Pwd; private String user_Email; private String user_NickName; private Timestamp user_Time; private String user_Birth; private int user_Fans; private int user_Follow; private int user_Score; private String user_HeadImgAddr; private int user_Phone; private String user_InvitationCode; public int getUser_Id() { return user_Id; } public void setUser_Id(int user_Id) { this.user_Id = user_Id; } public String getUser_Name() { return user_Name; } public void setUser_Name(String user_Name) { this.user_Name = user_Name; } public int getUser_Pwd() { return user_Pwd; } public void setUser_Pwd(int user_Pwd) { this.user_Pwd = user_Pwd; } public String getUser_Email() { return user_Email; } public void setUser_Email(String user_Email) { this.user_Email = user_Email; } public String getUser_NickName() { return user_NickName; } public void setUser_NickName(String user_NickName) { this.user_NickName = user_NickName; } public Timestamp getUser_Time() { return user_Time; } public void setUser_Time(Timestamp user_Time) { this.user_Time = user_Time; } public String getUser_Birth() { return user_Birth; } public void setUser_Birth(String user_Birth) { this.user_Birth = user_Birth; } public int getUser_Fans() { return user_Fans; } public void setUser_Fans(int user_Fans) { this.user_Fans = user_Fans; } public int getUser_Follow() { return user_Follow; } public void setUser_Follow(int user_Follow) { this.user_Follow = user_Follow; } public int getUser_Score() { return user_Score; } public void setUser_Score(int user_Score) { this.user_Score = user_Score; } public String getUser_HeadImgAddr() { return user_HeadImgAddr; } public void setUser_HeadImgAddr(String user_HeadImgAddr) { this.user_HeadImgAddr = user_HeadImgAddr; } public int getUser_Phone() { return user_Phone; } public void setUser_Phone(int user_Phone) { this.user_Phone = user_Phone; } public String getUser_InvitationCode() { return user_InvitationCode; } public void setUser_InvitationCode(String user_InvitationCode) { this.user_InvitationCode = user_InvitationCode; } @Override public String toString() { return "User [user_Id=" + user_Id + ", user_Name=" + user_Name + ", user_Pwd=" + user_Pwd + ", user_Email=" + user_Email + ", user_NickName=" + user_NickName + ", user_Time=" + user_Time + ", user_Birth=" + user_Birth + ", user_Fans=" + user_Fans + ", user_Follow=" + user_Follow + ", user_Score=" + user_Score + ", user_HeadImgAddr=" + user_HeadImgAddr + ", user_Phone=" + user_Phone + ", user_InvitationCode=" + user_InvitationCode + "]"; } } ``` ## 这是UserService.java: ```java package com.test.service; import com.test.pojo.User; public interface UserService { //通过用户名及密码核查用户登录 User login(String user_Name,String user_Pwd); //增加用户 void register(User user); //根据用户名查询 User findByUserName(String user); } ``` ## 这是UserServiceImpl.java: ```java package com.test.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.test.mapper.UserMapper; import com.test.pojo.User; import com.test.service.UserService; @Service @Transactional public class UserServiceImpl implements UserService { //注入UserMapper接口 @Autowired private UserMapper userMapper; //登录,根据用户名和密码进行查询 @Override public User login(String user_Name,String user_Pwd){ return userMapper.findByUserNameAndPassword(user_Name,user_Pwd); } //注册,增加用户 @Override public void register(User user){ userMapper.addUser(user); } //根据用户名查询 @Override public User findByUserName(String user_Name){ return userMapper.findByUserName(user_Name); } } ``` ##这是login.jsp ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="../css/login.css" /> <title>登录</title> </head> <body> <!--导航栏--> <nav class="nav"> <ul> <li class="logo"><a href="#">Eday</a></li> <li class="shouye"><a href="../index.jsp" class="neirong">首页</a></li> <li class="fgx">|</li> <li><a href="#" class="neirong">文章列表</a></li> <li class="fgx">|</li> <li><a href="#" class="neirong">留言板</a></li> <li class="fgx">|</li> <li><a href="#" class="neirong">更新日志</a></li> </ul> </nav> <!--登录板块--> <header class="header"> <p class="logintitle"> <b>登录</b> </p> <form action="${pageContext.request.contextPath }/user/userlogin" method="post" class=login-form> <p class= login-username-p> <label for="username" class="login-username-text">用户名:</label> <input type=text name="user_Name" class="login-username-input"> <br><a href="register.jsp" class=login-register>注册</a> </p> <p class="login-psw-p"> <label for="psw" class="login-psw-text">密码:</label> <input type=password name="user_Pwd" class="login-psw-input"> <br><a href="#" class=login-forget>忘记密码</a> </p> <div class=login-button-div> <label for=button></label> <button type=sublim class=login-button>登录</button> </div> </form> </header> </body> </html> ``` ## 这是login-success.jsp: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登录成功,请等待跳转...</title> <script type="text/javascript"> onload=function(){ setInterval(go, 1000); }; var x=3; //利用了全局变量来执行 function go(){ x--; if(x>0){ document.getElementById("sp").innerHTML=x; //每次设置的x的值都不一样了。 }else{ location.href='../index.jsp'; } } </script> </head> <body> <!--导航栏--> <nav class="nav"> <ul> <li class="logo"><a href="#">Eday</a></li> <li class="shouye"><a href="../index.jsp" class="neirong">首页</a></li> <li class="fgx">|</li> <li><a href="#" class="neirong">文章列表</a></li> <li class="fgx">|</li> <li><a href="#" class="neirong">留言板</a></li> <li class="fgx">|</li> <li><a href="#" class="neirong">更新日志</a></li> </ul> </nav> <header> <div> <p>登录成功!页面将在3秒后自动跳转,请稍等...</p> </div> </header> </body> </html> ``` ## 这是数据库: ![图片说明](https://img-ask.csdn.net/upload/202002/01/1580568589_694404.jpg)
java接收到post参数后,怎么将参数传递给html页面,将跳转后页面写入到流中?
需要传递参数的html页面,接受两个表单参数,一个是username,另一个是password 如果客户端发送的http请求是这样的 POST / HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:20.0) Gecko/20100101 Firefox/20.0 Host: 127.0.0.1 Connection: close Accept-Language: zh-CN,en;q=0.5 Accept-Encoding: gzip, deflate Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Content-type: application/x-www-form-urlencoded Content-length: 34 username=admin&password=123456 用java写的服务器,获取到username和password后,怎么将其作为参数传递给html页面?
用java解析HTTP请求报头
<p>在上次WEB项目的总结中</p> <p>我就已经花了很多时间</p> <p>总结了HTTP协议</p> <p>详细的叙述了HTTP请求,应答</p> <p>并用Telnet自己写过一个HTTP请求</p> <p> </p> <p>这次</p> <p>在山寨Tomcat雏形的时候</p> <p>因为需要服务器端</p> <p>根据请求的信息</p> <p>作出相应回应</p> <p> </p> <p>而请求信息</p> <p>又都是通过浏览器封装好的</p> <p>Http请求类型</p> <p> </p> <p> </p> <p>在服务器端</p> <p>通过一个客户线程</p> <p>使用客户线程的输入流</p> <p>即可完全得到</p> <p>经过浏览器封装好的</p> <p>向服务器端发送的信息</p> <p>源代码如下</p> <p> </p> <pre name="code" class="java"> /** * 传入一个Socket对象,解析出通过该对象传入这个链接中的所有HTTP请求信息 * * @param client */ private void getRequset(Socket client) { try { InputStream in = client.getInputStream(); InputStreamReader reader = new InputStreamReader(in); BufferedReader bd = new BufferedReader(reader);//三重封装 String t = null; while ((t = bd.readLine()) != null) { System.out.println(t); parser(t);//解析每一句的方法 } } catch (Exception ef) { ef.printStackTrace(); System.out.println("getRequset error---&gt;"); } }</pre> <p> </p> <p> </p> <p> </p> <p>信息如下</p> <p> </p> <table border="0"><tbody><tr> <td>GET /index HTTP/1.1<br>User-Agent: Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.6.30 Version/10.63<br>Host: localhost:81<br>Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1<br>Accept-Language: zh-CN,zh;q=0.9,en;q=0.8<br>Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1<br>Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0<br>Connection: Keep-Alive<br>//注意,此处两行空格也为HTTP请求的一部分<br><br> </td> </tr></tbody></table> <p> </p> <p> </p> <p>我们又都知道</p> <p>在Tomcat中</p> <p>所有的请求信息</p> <p> </p> <p>我们都已经封装好</p> <p>放入一个HttpRequest对象中</p> <p> </p> <p>在我们自己山寨的Tomcat中</p> <p>因为得到的Http请求是一个字符串</p> <p>要得到我们需要的信息</p> <p> </p> <p>也必须对此字符串进行解析</p> <p>将解析后的字符串放入一个Request对象中</p> <p> </p> <p>Requst类源码如下</p> <p> </p> <pre name="code" class="java">public class Request { private String method;// 请求方法 private String protocol;// 协议版本 private String requestURL; private String requestURI;//请求的URI地址 在HTTP请求的第一行的请求方法后面 private String host;//请求的主机信息 private String Connection;//Http请求连接状态信息 对应HTTP请求中的Connection private String agent;// 代理,用来标识代理的浏览器信息 ,对应HTTP请求中的User-Agent: private String language;//对应Accept-Language private String encoding;//请求的编码方式 对应HTTP请求中的Accept-Encoding private String charset;//请求的字符编码 对应HTTP请求中的Accept-Charset private String accept;// 对应HTTP请求中的Accept; getter() setter() }</pre> <p> </p> <p> </p> <p>  有了用来存放封装后信息的Request类</p> <p>  有了请求信息的字符串</p> <p>  接下来</p> <p>  我们只需要将字符串解析</p> <p>  并且存放在Request对象中</p> <p> </p> <p> 源代码如下</p> <p>  </p> <pre name="code" class="java"> /** * 传入HTTP请求中需要解析的某一句 解析该句,并请放入对应的Request对象中 * * @param s */ private void parser(String s) { if (s.startsWith("GET")) { String method = "Get"; request.setMethod(method); int index = s.indexOf("HTTP"); System.out.println("index---&gt;" + index); String uri = s.substring(3 + 1, index - 1);// 用index-1可以去掉连接中的空格 System.out.println("uri---&gt;" + uri); request.setRequestURI(uri); String protocol = s.substring(index); System.out.println("protocol----&gt;" + protocol); request.setProtocol(protocol); } else if (s.startsWith("POST")) { String method = "POST"; request.setMethod(method); int index = s.indexOf("HTTP"); System.out.println("index---&gt;" + index); String uri = s.substring(3 + 1, index - 1);// 用index-1可以去掉连接中的空格 System.out.println("uri---&gt;" + uri); request.setRequestURI(uri); String protocol = s.substring(index); System.out.println("protocol----&gt;" + protocol); request.setProtocol(protocol); } else if (s.startsWith("Accept:")) { String accept = s.substring("Accept:".length() + 1); System.out.println("accept---&gt;" + accept); request.setAccept(accept); } else if (s.startsWith("User-Agent:")) { String agent = s.substring("User-Agent:".length() + 1); System.out.println("agent---&gt;" + agent); request.setAgent(agent); } else if (s.startsWith("Host:")) { String host = s.substring("Host:".length() + 1); System.out.println("host---&gt;" + host); request.setHost(host); } else if (s.startsWith("Accept-Language:")) { String language = s.substring("Accept-Language:".length() + 1); System.out.println("language---&gt;" + language); request.setLanguage(language); } else if (s.startsWith("Accept-Charset:")) { String charset = s.substring("Accept-Charset:".length() + 1); System.out.println("charset---&gt;" + charset); request.setCharset(charset); } else if (s.startsWith("Accept-Encoding:")) { String encoding = s.substring("Accept-Encoding:".length() + 1); System.out.println("encoding---&gt;" + encoding); request.setEncoding(encoding); } else if (s.startsWith("Connection:")) { String connection = s.substring("Connection:".length() + 1); System.out.println("connection---&gt;" + connection); request.setConnection(connection); } }</pre>   <p>   封装好请求的Request对象后</p> <p>  接下来</p> <p>  我们就来封装进行应答的Response对象</p> <p> </p> <p>  MOVE ON</p><br/><strong>问题补充</strong><br/><div class="quote_title">lihuan5120 写道</div><div class="quote_div">看楼主的头像。。。该不会是长沙理工大学的吧???<img src="/images/smiles/icon_cry.gif"/> </div> <br />中南<br/><strong>问题补充</strong><br/><div class="quote_title">http4j 写道</div><div class="quote_div">鼓励一下,多写写协议级的纯Java代码会提高些水准。目前我和楼主相反,在研究纯Client端的Java HTTP。楼主可以借鉴Apache HTTP Component. <br />不过有一点建议,楼主你的If-else能不能处理一下,这种代码太让人眼花缭乱了。 <br />我给你个建议,用Annotation对Request中字段进行标注,比如charset可以标注@RequestAttribute(name="Accept-Charset"),通过反射自动根据标注名称赋值。 <br /> <br />我写的纯client在http://code.google.com/p/http4j <br />欢迎多多交流。</div> <br /> <br />感谢兄弟的指导,受教了。
使用spring security提示Access is denied?
``` org.springframework.security.access.AccessDeniedException: Access is denied at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:84) at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:233) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:124) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) ``` +++++++++++++++++++++++ 配置文件: spring-security.xml ``` <security:global-method-security pre-post-annotations="enabled" jsr250-annotations="enabled" secured-annotations="enabled"></security:global-method-security> <!-- 配置不拦截的资源 --> <security:http pattern="/pages/login.jsp" security="none"/> <security:http pattern="/failer.jsp" security="none"/> <security:http pattern="/css/**" security="none"/> <security:http pattern="/img/**" security="none"/> <security:http pattern="/plugins/**" security="none"/> <security:http auto-config="true" use-expressions="true"> <!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" --> <security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/> <!-- 定义跳转的具体的页面 --> <security:form-login login-page="/pages/login.jsp" login-processing-url="/login" default-target-url="/index.jsp" authentication-failure-url="/failer.jsp" authentication-success-forward-url="/pages/main.jsp" /> <!-- 关闭跨域请求 --> <security:csrf disabled="true"/> <!-- 退出 --> <security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/pages/login.jsp"/> </security:http> <!-- 切换成数据库中的用户名和密码 --> <security:authentication-manager> <security:authentication-provider user-service-ref="userService"> <!-- 配置加密的方式--> <security:password-encoder ref="passwordEncoder"/> </security:authentication-provider> </security:authentication-manager> <!-- 配置加密类 --> <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> <security:authentication-manager> <security:authentication-provider> <security:user-service> <security:user name="123" password="{noop}123" authorities="ROLE_USER"/> </security:user-service> </security:authentication-provider> </security:authentication-manager> ``` +++++++++++++++++++++++ web.xml ![图片说明](https://img-ask.csdn.net/upload/201912/29/1577584767_128990.png) +++++++++++++++++++++++ login.jsp ![图片说明](https://img-ask.csdn.net/upload/201912/29/1577584799_61926.png) +++++++++++++++++ 请问大神是怎么回事呢?
python爬虫爬取时提示org.xml.sax.SAXParseException: Content is not allowed in prolog.
最近在研究爬虫,请求方法是POST,请求内容类型是application/x-www-form-urlencoded,说明以表单的方式提交。 观察响应正文,可以发现,响应内容类型是xml,其中想要提取的数据就在new节点内: ![图片说明](https://img-ask.csdn.net/upload/201908/28/1566957248_729059.png) 首先构造headers: ![图片说明](https://img-ask.csdn.net/upload/201908/28/1566957271_146204.png) 请求参数在请求正文中: ![图片说明](https://img-ask.csdn.net/upload/201908/28/1566957295_533999.png) 可以发现请求参数也是放在xml中,将__xml参数解码后可以发现内容如下: ![图片说明](https://img-ask.csdn.net/upload/201908/28/1566957318_627236.png) 提交的参数放在p标签里,每次提交请求变化的也只有那些参数,并没有发现加密的迹象 因此构造params: ![图片说明](https://img-ask.csdn.net/upload/201908/28/1566957346_765493.png) 代码如下: ```python import requests target = ".../dorado/smartweb2.RPC.d?__rpc=true" # 公司内网地址,外网无法访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", "Referer": ".../pages/policynewbiz/inputapplication/pmGDVehicleQuery.jsp?VEHICLELICENSE=&VIN=LEFYECG257HN34234&LICENSETYPE=&Kind=AUTOCOMPRENHENSIVEINSURANCE2014PRODUCT&", "Content-Type": "application/x-www-form-urlencoded", "Cookie": "jsessionidp09=X2tfdlLTBZH7xzKwnhSgh2W2N5374T0HnHWYQkl2MRShjBxfpKpW!1484787398; F5cookie=1410712842.6521.0000" } params = { "__type": "loadData", "__viewInstanceId": "org.view.policynewbiz.inputapplication.pmGDVehicleQuery~org.view.common.viewmodel.CpicViewModel", "__xml": '%3Crpc%20id%3D%22datasetResult%22%20type%3D%22wrapper%22%20objectClazz%3D%22%22%20pi%3D%221%22%20ps%3D%22100%22%20pc%3D%221%22%20prc%3D%220%22%20fs%3D%22vin%2ClicensePlateNo%2ClicensePlateType%2CengineNo%2CpmVehicleType%2CpmUserNature%2CineffectualDate%2CrejectDate%2CfirstRegisterDate%2ClastCheckDate%2CtransferDate%2CwholeWeight%2CratedPassengerCapacity%2Ctonnage%2Cdisplacement%2CmadeFactory%2Cmodel%2CbrandCN%2CbrandEN%2Chaulage%2Ccolor%2CfuelType%2CvehicleStatus%2CmotorTypeCode%22%3E%3Cps%3E%3Cp%20name%3D%22flag%22%3E1%3C/p%3E%3Cp%20name%3D%22carMark%22/%3E%3Cp%20name%3D%22RackNo%22%3E2FMDK3J95DBC93811%3C/p%3E%3C/ps%3E%3C/rpc%3E%0D%0A', "__rpc": "true", } res = requests.post(url=target, headers=headers, data=params) html = res.content.decode("utf-8") print(html) ``` 执行结果报错: ```python D:\Users\CPIC\AppData\Local\Programs\Python\Python37\python.exe E:/Workspace/Python/SchoolInfo/test56.py <?xml version="1.0"?> <result succeed="false" > <errorMessage>org.xml.sax.SAXParseException: Content is not allowed in prolog.</errorMessage> <stackTrace><![CDATA[com.bstek.dorado.utils.xml.dom4j.Dom4jXmlBuilder.buildDocument(Dom4jXmlBuilder.java:59) com.bstek.dorado.view.rpc.AbstractRPCHandler.init(AbstractRPCHandler.java:58) com.bstek.dorado.view.rpc.LoadDataRPCHandler.init(LoadDataRPCHandler.java:41) com.bstek.dorado.core.FilterHandle.doFilter(FilterHandle.java:131) com.bstek.dorado.core.DoradoFilter.doFilter(DoradoFilter.java:70) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43) com.cpic.p09.auto.common.filter.CompatibleFilter.doFilter(CompatibleFilter.java:34) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43) com.cpic.p09.auto.common.filter.ClientCacheFilter.doFilter(ClientCacheFilter.java:71) weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3242) weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1916) weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366) weblogic.work.ExecuteThread.run(ExecuteThread.java:181) ]]></stackTrace> <viewProperties></viewProperties> </result> Process finished with exit code 0 ``` 有哪位大神遇到过这种情况,小弟要抓狂了
Java中加入登陆拦截器后,post put delete请求全部405,只有get请求可以访问。请问应该怎么解决?
下面是我拦截器的代码。 ``` public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 获得在下面代码中要用的request,response,session对象 HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; HttpSession session = httpRequest.getSession(true); String[] str = {"login","docs"}; // 路径中包含这些字符串的,可以不用登录直接访问 StringBuffer url = httpRequest.getRequestURL(); // 特殊用途的路径可以直接访问 if (str != null && str.length > 0) { for (String s : str) { if (url.indexOf(s) >= 0) { filterChain.doFilter(servletRequest, servletResponse); return; } } } // 从session中获取用户信息 String loginInfo = (String) session.getAttribute("username"); if (null != loginInfo && !"".equals(loginInfo)) { // 用户存在,可以访问此地址 filterChain.doFilter(servletRequest, servletResponse); } else { // 用户不存在,踢回登录页面 // String a = httpRequest.getContextPath()+"/login/notLogin"; servletRequest.getRequestDispatcher("/login/notLogin").forward(servletRequest, httpResponse); return; } } ``` 这里是我web.xml的配置 ``` <!-- 登录过滤器 --> <filter> <filter-name>LoginFilter</filter-name> <filter-class>aa.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/aa/*</url-pattern> <url-pattern>/bb/*</url-pattern> <url-pattern>/cc/*</url-pattern> <url-pattern>/dd/*</url-pattern> <url-pattern>/ee/*</url-pattern> </filter-mapping> ``` 接口是restful接口。 有大神知道原因吗?
servlet该如何返回值给AJAX呢?
js代码 //声明XMLHttpRequest对象 var xmlrequest; //初始化XMLHttpRequest function createXMLHttpRequest(){ if(window.XMLHttpRequest){ xmlrequest = new XMLHttpRequest(); }else if(window.ActiveXObject){ try{ xmlrequest = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ xmlrequest = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ } } } } //定义回调函数 function processResponse(){ //响应完成 if(xmlrequest.readyState == 4){ //响应正常 if(xmlrequest.status == 200){ var head = xmlrequest.responseText; alert(head); } } } //事件处理函数 function change(){ //初始化XMLHttpRequest对象 createXMLHttpRequest(); //设置请求的URI var uri = "servlet/LoginServlet"; //打开与服务器响应地址的连接 xmlrequest.open("POST", uri, true); //设置请求头 xmlrequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //设置处理响应的回调函数 xmlrequest.onreadystatechange = processResponse; var account = document.form.account.value; var password = document.form.password.value; //发送请求 xmlrequest.send("account=" + account + "&password=" + password); } servlet代码 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("post被触发了"); request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); String account = request.getParameter("account"); String password = request.getParameter("password"); System.out.println(account); System.out.println(password); PrintWriter out = response.getWriter(); out.print("124578"); } 配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>shangGou</display-name> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/servlet/LoginServlet</url-pattern> </servlet-mapping> </web-app> 请求页面:![图片说明](https://img-ask.csdn.net/upload/201505/28/1432751963_284806.gif) 响应后的页面:![图片说明](https://img-ask.csdn.net/upload/201505/28/1432751982_544755.gif) 请大神帮我解答解答,AJAX向服务器发送请求后,servlet要如何响应页面才不会刷新呢?
C# winform程序实现JAVA josn 请求接
第一次写winfrom 不知道怎么写,以下是给的接口说明 HTTP请求方式:GET http://ip:port/lanshuijsdService/3.0/hts/queryCyr?param_key=?&secret_key=? 1) 注意: 以JSON格式传入输入参数 1) 请求参数 参数名称 类型 必需 描述 param_key 字符串 是 输入参数值 secret_key 字符串 是 Md5摘要信息 Param_key中包含的输入json中的字段描述如下: 参数名称 类型 必需 描述 meraccount string 是 商户账户(321000000) method string 是 API的资源操作方法名(queryCyr) timestamp number 是 用户发起请求时的unix时间戳。 v number 是 API版本号,默认使用最高版本(1.0)。 ⦁ 请求示例: 将param_key内的json中元素按照参数名排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串后进行MD5,以形成secret_key值 param_key值=RSA(URLEncoder ({”name2”:”value2”, “name1”:”value1”,”name3”:”value3”},”UTF-8”)) secret_key值= URLEncoder (md5(name1=value1& name2=value2&name3=value3) ,”UTF-8”) ⦁ 签名算法 服务API使用的签名算法如下: ⦁ 获取请求的HTTP method; ⦁ 获取请求的URL,包括host和scheme,但不包括query_string的部分 ⦁ 将所有参数(包括GET或POST的参数,但不包含签名字段)格式化为“key=value”格式,如“k1=v1”、“k2=v2”、“k3=v3”; ⦁ 将格式化好的参数键值对以字典序升序排列后,拼接在一起,如“k1=v1&k2=v2&k3=v3”,并将HTTP method和URL按顺序拼接在这个字符串前面; ⦁ 在拼接好的字符串末尾追加上应用的secret_key,并进行urlencode形成base_string; ⦁ 上述字符串的MD5值即为签名的值: sign= urlencode(MD5(k1=v1&k2=v2&k3=v3)); ⦁ 安全加密 为了确保敏感数据的可靠传输。必须对传输数据使用RSA的公钥进行非对称加密,私钥由服务提供方妥善保管,公钥由客户端经过身份验证之后获得。安全加密算法如下: RSA(URLEncoder ({”name2”:”value2”, “name1”:”value1”,”name3”:”value3”},”UTF-8”)) 分配的RSA公钥如下: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsoGCMo/XE+fNlLQBLK4VBYe8pVZe71Eb5fZOxd213vvshmWA/9c+vSM/uUAcD/W/It+xnJE1TECCTbV6uCqgfmrztwe2OQS2kGhLPGIYfo9ha2NufghUNAHAB9M0m1lp7y2m8T27iPhy 下面我写的代码: string strURL = "http://192.168.200.207:8088/lsjsdService/3.0/hts/queryJsd?param_key="; string md5 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GyRRxv35xuamvvnzQDOerH3yrrCLnJ6bQIDAQAB"; string pk="{\"val\":\"200005719465\",\"scode\":\"321000006\",\"date\":\"20180625\",\"flag\":\"0\",\"meraccount\":\"321000000\",\"method\":\"queryJsd\",\"v\":\"3.0\",\"timestamp\":\"20180707\",}"; string param_key = ToUrlEncode(pk); string sk = "var=200005719465&scode=321000006&date=20180625&flag=0&meraccount=321000000&method=queryJsd&v=3.0&timestamp=20180707"; string secret_key = sign(sk, md5, "UTF-8"); strURL = "http://192.168.200.207:8088/lsjsdService/3.0/hts/queryJsd?param_key=" + param_key + "&secret_key=" + secret_key; string h = HttpApi(strURL, "{}", "get"); public static string ToUrlEncode(string strCode) { StringBuilder sb = new StringBuilder(); byte[] byStr = System.Text.Encoding.UTF8.GetBytes(strCode); //默认是System.Text.Encoding.Default.GetBytes(str) System.Text.RegularExpressions.Regex regKey = new System.Text.RegularExpressions.Regex("^[A-Za-z0-9]+$"); for (int i = 0; i < byStr.Length; i++) { string strBy = Convert.ToChar(byStr[i]).ToString(); if (regKey.IsMatch(strBy)) { //是字母或者数字则不进行转换 sb.Append(strBy); } else { sb.Append(@"%" + Convert.ToString(byStr[i], 16)); } } return (sb.ToString()); } public static string sign(string content, string privateKey, string input_charset) { Encoding code = Encoding.GetEncoding(input_charset); byte[] Data = code.GetBytes(content); RSACryptoServiceProvider rsa = DecodePemPrivateKey(privateKey); SHA1 sh = new SHA1CryptoServiceProvider(); byte[] signData = rsa.SignData(Data, sh); return Convert.ToBase64String(signData); } /// <summary> /// 调用api返回json /// </summary> /// <param name="url">api地址</param> /// <param name="jsonstr">接收参数</param> /// <param name="type">类型</param> /// <returns></returns> public static string HttpApi(string url, string jsonstr, string type) { Encoding encoding = Encoding.UTF8; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址 request.Accept = "text/html,application/xhtml+xml,*/*"; request.ContentType = "application/json"; request.Method = type.ToUpper().ToString();//get或者post byte[] buffer = encoding.GetBytes(jsonstr); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } 文档里说的:param_key,secret_key 这两个值我都不知道我转换对没?以上我拼接的字符串正确吗?sign方法老是报错 ![图片说明](https://img-ask.csdn.net/upload/201807/08/1531032895_957209.png) 请大神帮忙指教下。
关于用java开发微信公众平台开发 token验证失败的问题
大家好,最近在学习用java开发微信公众平台,第一次写的代码token验证通过了,用的是阿里云的服务器换系统(server2008->2003)后就怎么也通过不过验证。直接输入域名www.zhenggufang.com/aip/longin网页显示404.域名也已经备过案。服务器上的tomcat也启动正常tomcat/conf/server也修改了。多谢提交还是token验证失败。请各位帮忙看看代码如下: package service; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import message.resp.TextMessage; import util.ValidationUtil; public class LoginServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(get 请求); String signature = request.getParameter(signature); String timestamp = request.getParameter(timestamp); String nonce= request.getParameter(nonce); String echostr=request.getParameter(echostr); PrintWriter out=response.getWriter(); System.out.println(signature+ signature); System.out.println(timestamp+ timestamp); System.out.println(nonce+ nonce); System.out.println(echostr+ echostr); 验证请求确认成功原样返回echostr参数内容,则接入生效,成为开发者成功,否则 if(ValidationUtil.chechSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); } 接受微信服务器发过来的xml数据包(通过post)形式发过来的 @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String respXml=;响应的xml串 request.setCharacterEncoding(utf-8); response.setCharacterEncoding(utf-8); String signature = request.getParameter(signature); String timestamp = request.getParameter(timestamp); String nonce= request.getParameter(nonce); PrintWriter out=response.getWriter(); if(ValidationUtil.chechSignature(signature, timestamp, nonce)) { 接收并解析来自用户的xml数据包中的内容 MapString,String reqMap=MessageUtil.parseXml(request); String ToUserName=reqMap.get(ToUserName); String FromUserName=reqMap.get(FromUserName); String MsgType=reqMap.get(MsgType); String Content=reqMap.get(Content); System.out.println(用户给公众号发的消息+Content); 开始响应消息给用户 String respContent=;要响应的文本内容 构建一条文本消息 TextMessage textMsg=new TextMessage(); textMsg.setFromUserName(FromUserName); textMsg.setFromUserName(ToUserName); textMsg.setCreateTime(new Date().getTime()); textMsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); if(MsgType.equals(MessageUtil.RESP_MESSAGE_TYPE_TEXT)) { respContent=大家好,来自工作公众平台的测试消息!!; } textMsg.setContent(respContent); respXml=MessageUtil.messageToXml(textMsg); System.out.println(respXml+respXml); 接受打印的字符 out.println(respXml); } out.close(); out=null; } } package util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 微信请求校验工具类 * @author y * */ public class ValidationUtil { private static String token="wlghr0479"; public static boolean chechSignature(String signature,String timestamp,String nonce) { //1.将token,timestamp,nonce三个参数排序 String[] str= new String[]{token,timestamp,nonce}; Arrays.sort(str); //2.将三个参数字符串接成一个字符串 StringBuilder buff=new StringBuilder(); for (int i=0;i<str.length;i++) { buff.append(str[i]); } //3.进行sha1加密 MessageDigest md=null; String result=""; try { md= MessageDigest.getInstance("SHA-1"); byte[]date =md.digest(buff.toString().getBytes()); //将字节数组转换成字符串 result=bytesToStr(date); System.out.println("加密后的"+result); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result!=null ?(result.equals(signature.toUpperCase())) :false; } //将直接数组转换成十六进制字符串 private static String bytesToStr(byte[] byteArray) { String strDigest=""; for (int i=0;i<byteArray.length;i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } //将一个字节转换成16进制字符串 private static String byteToHexStr(byte mByte) { char[]Digit ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char[]temp1=new char[2]; temp1[0]=Digit[mByte>>>4 & 0X0F]; temp1[1]=Digit[mByte & 0X0F]; String str=new String(temp1); return str; } } <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- 部署配置 --> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>service.LoginServlet</servlet-class> </servlet> <!-- 配置映射 --> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/api/login</url-pattern> </servlet-mapping> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
java-Content-Type=“x-www-form-urlencoded”的参数中文乱码
java --jfinal框架使用的是sevlet2.5,接收post请求的带Content-Type=“x-www-form-urlencoded”的参数中文乱码如何处理?使用postman测试的,![图片说明](https://img-ask.csdn.net/![图片说明](https://img-ask.csdn.net/upload/201709/26/1506440640_977752.png)upload/201709/26/1506440618_961791.png)请求参数是一个xml,本来的参数是 ``` <TimeStamp>2017-09-20 10:02:29</TimeStamp> <ServiceName>测试中文web.order</ServiceName> ``` 到服务端,用request.inputStream拿不到数据,所以用paraMap取的参数,结果就是下面的中文乱码了,在网上查了很多方法,试了都无效,包括配置filter,字符串的getBytes("iso-8859-1")转utf-8,进行各种组合的先urlencode再urldecode或者先urldecode再urlencode等等都不行,确定数据传过来的CharEncoding是utf-8,但是日志输出从request中获取到的paraMap就是乱码的了。 ``` <TimeStamp>2017-09-20 10:02:29</TimeStamp> <ServiceName>₩ᄉヒ│ᆵユ¦ᄌᆳ₩ヨヌweb.order</ServiceName> ``` 想问下各位大神有什么办法吗?
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
程序员,职场上请远离这种人!
对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
一个读研让我损失了一百万的真实故事
关注我!只要10分钟,包你学会数据分析 毕业后,应该就业还是考研? 我刚出国留学那会儿,就惊讶的发现,外国local95%都不会选择读研 他们说,硕士学费很贵,时间宝贵,老板不认,所以很费 当几乎所有人都是本科学历时,硕士学历反而像个异类 在老板眼里,三年硕士远远不如3年的工作经验实用 他们甚至专门为拒绝高学历者发明了一个词,叫overoccupie...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
杭漂程序员2019的心路历程,还不起助学贷款,交不起房租,披荆斩棘终雨过天晴
一个杭漂2019的心酸历程,一路披荆斩棘终于还是雨过天晴。
我采访了同事,让他掏出了每天都会浏览的干货网站
前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y在周六的晚上,我日常去到公司写文章。想写...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问