Servlet 是運行在服務端的 Java 類,負責接收客戶端請求(如瀏覽器)並做出響應。核心入口為 doGet 和 doPost 方法,分別處理 HTTP GET 和 POST 請求。
@WebServlet("/ServletLogin")
public class ServletLogin extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 解決 GET 亂碼:ISO-8859-1 -> UTF-8
String user = parse(request.getParameter("user"));
String pwd = parse(request.getParameter("pwd"));
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(user + " 登陸成功!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// POST 請求設置編碼即可解決亂碼
request.setCharacterEncoding("utf-8");
doGet(request, response); // 復用邏輯
}
private String parse(String msg) throws UnsupportedEncodingException {
return new String(msg.getBytes("iso8859-1"), "utf-8");
}
}
Java 原生 HttpURLConnection 可模擬瀏覽器發送 HTTP 請求,無需第三方庫。
public class HttpURLConnectionUtil {
public static InputStream getInputStreamByGet(String urlStr) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
return conn.getInputStream();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
public class HttpURLConnectionUtil {
private static String charset;
public static InputStream getInputStreamByPost(String urlStr, String params) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true); // 開啟輸出流寫入參數
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
try (OutputStream os = conn.getOutputStream()) {
os.write(params.getBytes("utf-8"));
}
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String contentType = conn.getContentType();
charset = contentType.split("=")[1]; // 提取 charset
return conn.getInputStream();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String getCharset() { return charset; }
}
public class InputStreamUtil {
public static String inputStreamToString(InputStream is, String charset) {
StringBuilder sb = new StringBuilder();
try (BufferedReader br = new BufferedReader(new InputStreamReader(is, charset))) {
char[] buffer = new char[1024];
int len;
while ((len = br.read(buffer)) != -1) {
sb.append(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
}
public class Test {
public static void main(String[] args) throws Exception {
String user = URLEncoder.encode("張三", "utf-8");
String pwd = URLEncoder.encode("你好", "utf-8");
String url = "https://192.168.2.11:8080/08-23/ServletLogin";
String params = "user=" + user + "&pwd=" + pwd;
InputStream is = HttpURLConnectionUtil.getInputStreamByPost(url, params);
String result = InputStreamUtil.inputStreamToString(is, HttpURLConnectionUtil.getCharset());
System.out.println(result);
}
}
setDoOutput(true) 是 POST 請求寫入請求體的前提。Content-Type 頭解析,避免硬編碼導致解碼錯誤。