精簡版javax.servlet.ServletRequest的方法是否setAttribute(<key>, <Object>)僅用作在 Java 代碼中的方法之間傳遞對象的一種手段?長版假設(shè)我有一個javax.servlet.Filter使用 cookie 處理所有登錄用戶身份驗證的實現(xiàn):在 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 方法中進(jìn)行手動身份驗證,而只需檢查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 中唯一添加和使用的屬性是用于方法之間的通信,還是可以在到達(dá)服務(wù)器之前將它們添加到請求中?這種身份驗證方式是否使用Filter良好的做法來避免重復(fù)代碼?附加說明這樣做的真正原因不僅僅是身份驗證。我還有Filters 需要處理每個請求并將對象傳遞給Controllers。我絕對想要的是,即使是知道系統(tǒng)實現(xiàn)的人也不能偽造這些對象和信息。
1 回答

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