我正在使用SavedRequest
将用户登录后重定向到最初请求的URL。
我得到这样的网址:
public String requestedUrl(HttpServletRequest request, HttpServletResponse response) {
SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
if (savedRequest != null) {
return savedRequest.getRedirectUrl();
}
return "";
}
我想知道是否值得检查该URL,例如
SavedRequest
是否执行与此类似的清理?如果是,究竟是哪个?
答案 0 :(得分:0)
这不是一个答案,它基于对代码的调查,因为我很好奇。 :3
让我开始说,了解您如何在项目中配置Spring Security以真正解决问题的根源将非常有用。当您从SavedRequest
进行跟踪以了解它在Spring Security中的使用方式时,有很多可能的途径可以解决一切在开始时如何连接和配置的问题。
如前所述,直接与SavedRequest
相邻的代码非常简单,以至于通常与问题的根源无关。您的问题的重点可以扩大:“ Spring Security是否可以在应用SavedRequests时避免重定向循环到/ login?”
我认为文档10.1.4 Request Matching and HttpFirewall确实解决了您有关基本路径的问题:
Servlet规范为HttpServletRequest定义了一些属性,可以通过getter方法访问这些属性,我们可能希望将这些属性匹配。这些是contextPath,servletPath,pathInfo和queryString。 Spring Security只对保护应用程序中的路径感兴趣,因此将忽略contextPath。
强调我的。
在默认配置中,看来DefaultSavedRequest
将是根据SavedRequest
使用的HttpSessionRequestCache
的实现。
DefaultSavedRequest
并没有进行广泛的changes >
可以肯定地说,该类的实现非常简单,非常类似于bean,并且将其自身限制为保存提出的请求。除了排除某些标头(“跳过If-Modified-Since和If-None-Match标头”之外),它在构造期间不执行任何分析。
public DefaultSavedRequest(HttpServletRequest request, PortResolver portResolver) {
Assert.notNull(request, "Request required");
Assert.notNull(portResolver, "PortResolver required");
// Cookies
addCookies(request.getCookies());
// Headers
Enumeration<String> names = request.getHeaderNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
// Skip If-Modified-Since and If-None-Match header. SEC-1412, SEC-1624.
if (HEADER_IF_MODIFIED_SINCE.equalsIgnoreCase(name)
|| HEADER_IF_NONE_MATCH.equalsIgnoreCase(name)) {
continue;
}
Enumeration<String> values = request.getHeaders(name);
while (values.hasMoreElements()) {
this.addHeader(name, values.nextElement());
}
}
// Locales
addLocales(request.getLocales());
// Parameters
addParameters(request.getParameterMap());
// Primitives
this.method = request.getMethod();
this.pathInfo = request.getPathInfo();
this.queryString = request.getQueryString();
this.requestURI = request.getRequestURI();
this.serverPort = portResolver.getServerPort(request);
this.requestURL = request.getRequestURL().toString();
this.scheme = request.getScheme();
this.serverName = request.getServerName();
this.contextPath = request.getContextPath();
this.servletPath = request.getServletPath();
}
addCookies
,addHeader
,addLocales
和addParameters
同样简单。此类无法解析请求以防止无限重定向,甚至无法检查其基本路径。
因此,我们将进一步投放网络以寻找另一个嫌疑犯。接下来是HttpSessionRequestCache
。可以根据您对Spring Security的使用情况以各种方式创建Bean,因此事情HttpConfigurationBuilder
/ HttpSecurity
/ RequestCacheConfigurer
会逐渐发展。专家+您的更多信息确实将受到欢迎!