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
属性。 @RestController
方法的示例:
@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();
}
这种身份验证形式安全吗?我的意思是,ServletRequest
中的属性仅在Java中添加并用于方法之间的通信吗?在到达服务器之前已经添加到请求中了吗?
使用Filter
进行身份验证的一种好方法是避免重复代码吗?
执行此操作的真正原因不是 only 身份验证。我也有Filter
s,它们需要处理每个请求并将对象传递给Controller
s。我绝对希望的是,即使是知道系统实现的人也无法伪造这些对象和信息。
答案 0 :(得分:0)
我想我已经从documentation of getAttribute
可以通过两种方式设置属性。 Servlet容器可以设置属性以使有关请求的自定义信息可用。例如,对于使用HTTPS发出的请求,属性
javax.servlet.request.X509Certificate
可用于检索有关客户端证书的信息。也可以使用ServletRequest#setAttribute
以编程方式设置属性。这样可以在RequestDispatcher
调用之前将信息嵌入到请求中。
因此,根据此信息(如果没有丢失的信息),传递自定义对象并知道它们始终由服务器创建应该是完全安全的。