public void referer(HttpServletRequest request, HttpServletResponse response) throws Exception {
String referer = request.getHeader("referer");
// 校驗來源:非本站或為空則重定向
if (referer == null || !referer.startsWith("https://localhost")) {
response.sendRedirect("/webTwo/index.jsp");
return;
}
response.getOutputStream().write("welcome".getBytes());
}
原理:Referer 頭記錄來源頁面 URL,可用於圖片防盜鏈、表單來源校驗。注意:Referer 可偽造,安全場景需配合 Token。
給服務器用(轉發、
web.xml映射):以/開頭,不寫 應用上下文名給瀏覽器用(重定向、超鏈接、AJAX URL):必須包含 應用上下文名
// ✅ 轉發 - 服務器端解析
request.getRequestDispatcher("/index.jsp").forward(req, resp);
// ✅ 重定向 - 瀏覽器端解析
response.sendRedirect("/webTwo/index.jsp"); // 必須帶上下文
特徵:一次請求,共享 request/response,瀏覽器地址欄不變。
| 方法 | 路徑規則 | 適用場景 |
|---|---|---|
ServletContext.getRequestDispatcher(path) | 以 / 開頭,相對應用根目錄 | 通用、推薦 |
ServletRequest.getRequestDispatcher(path) | 相對當前資源路徑,可不以 / 開頭 | 相對路徑轉發 |
ServletContext.getNamedDispatcher(name) | web.xml 中 <servlet-name> | 按名稱轉發 Servlet |
// 攜帶數據轉發
request.setAttribute("user", userObj);
request.getRequestDispatcher("/detail.jsp").forward(request, response);
request.setCharacterEncoding("UTF-8"); // 必須在 getParameter() 前調用
String value = request.getParameter("username");
// ISO-8859-1 → 字節數組 → UTF-8 字符串
String decoded = new String(value.getBytes("ISO-8859-1"), "UTF-8");
原理:Tomcat 默認用 ISO-8859-1 解碼 URL 參數字節,需「逆向還原字節 → 正確編碼解碼」。
// 單值
String ua = request.getHeader("User-Agent");
// 多值(如 Accept-Language)
Enumeration langs = request.getHeaders("Accept-Language");
// 所有 Header 名稱
Enumeration names = request.getHeaderNames();
setCharacterEncoding,後 getParameterServletContext.getRequestDispatcher("/path")UTF-8,Tomcat server.xml 配置 URIEncoding="UTF-8"request.getParameterValues() 防單值覆蓋,配合過濾器統一 XSS/注入防護