精簡版javax.servlet.ServletRequest的方法是否setAttribute(<key>, <Object>)僅用作在 Java 代碼中的方法之間傳遞對象的一種手段?長版假設我有一個javax.servlet.Filter使用 cookie 處理所有登錄用戶身份驗證的實現:在 Spring Boot 中@Component@Order(Ordered.HIGHEST_PRECEDENCE)public class AuthFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { Cookie[] cookies = null; if (request instanceof HttpServletRequest) { cookies = ((HttpServletRequest) request).getCookies(); } Optional<User> user = mySessionAuthMethod(cookies); if (user.isPresent()) { request.setAttribute("user", user.get()); } chain.doFilter(request, response); }}然后,我可以避免在所有 Web API 方法中進行手動身份驗證,而只需檢查user屬性。@RestControllera的方法示例:@RequestMapping(value = "/profile")@CrossOrigin(origins = {MyProperties.ORIGIN}, allowCredentials = "true")public ResponseEntity getProfile(HttpServletRequest request, HttpServletResponse response) { String user = request.getAttribute("user"); if (user != null) { return myGetProfileResponse(user); } return myNotLoggedInResponse();}我的問題是:這種形式的身份驗證安全嗎?我的意思是,ServletRequestJava 中唯一添加和使用的屬性是用于方法之間的通信,還是可以在到達服務器之前將它們添加到請求中?這種身份驗證方式是否使用Filter良好的做法來避免重復代碼?附加說明這樣做的真正原因不僅僅是身份驗證。我還有Filters 需要處理每個請求并將對象傳遞給Controllers。我絕對想要的是,即使是知道系統實現的人也不能偽造這些對象和信息。
1 回答

翻翻過去那場雪
TA貢獻2065條經驗 獲得超14個贊
我想我已經從文檔中找到了答案getAttribute
可以通過兩種方式設置屬性。servlet 容器可以設置屬性以提供有關請求的自定義信息。例如,對于使用 HTTPS 發出的請求,該屬性
javax.servlet.request.X509Certificate
可用于檢索有關客戶端證書的信息。也可以使用 以編程方式設置屬性ServletRequest#setAttribute
。這允許在調用之前將信息嵌入到請求中RequestDispatcher
。
所以根據這個(如果沒有丟失信息),傳遞自定義對象應該是完全安全的,并且知道它們總是由服務器創建的。
添加回答
舉報
0/150
提交
取消