Spring MVC访问@Controller时存储url
有没有一种方法可以访问从SpringMVC控制器解析的URLSpring MVC访问@Controller时存储url,spring,spring-mvc,spring-security,Spring,Spring Mvc,Spring Security,有没有一种方法可以访问从SpringMVC控制器解析的URL @RequestMapping("/{language}/news/{articleId}") public String newsPage(...) { } 决心: /en/news/63421 我想将此存储在会话中,以便跟踪上次访问的地方。这里的动机是,如果页面是安全的登录过滤器将发挥作用,我们已经使用 SavedRequestStataWareAuthenticationSuccessHandler 将用户路由回他们试图
@RequestMapping("/{language}/news/{articleId}")
public String newsPage(...) {
}
决心:
/en/news/63421
我想将此存储在会话中,以便跟踪上次访问的地方。这里的动机是,如果页面是安全的登录过滤器将发挥作用,我们已经使用
SavedRequestStataWareAuthenticationSuccessHandler
将用户路由回他们试图访问的页面
但是,如果他们正在查看不安全的页面,并选择使用从屏幕顶部(页面菜单栏)下拉的表单登录,“最后一页”似乎是登录表单,因此成功处理程序会将其拖放回根上下文
我想截获控制器调用并在会话中存储单个URL,覆盖SavedRequestStataWareAuthenticationSuccessHandler以允许我们修改RequestCache,然后让Spring在登录成功时重定向
理想情况下,我们希望有一种通用的方法在所有控制器上实现这一点,但不确定是否有一个过滤器可以用来提取这一点-过滤请求会收到各种噪音,如css、js、,图像和html片段页面,因此我们希望有人知道一种仅使用控制器本身的方法。要获取URL路径,可以使用HttpServletRequest,例如: www.mysite.com/en/news/63421 req.getPathInfo()=/en/news/63421
如果有人在打开多个选项卡的情况下使用您的站点,则将其存储在会话中可能会导致问题。有两个问题: 1)在控制器方法中获取url
@RequestMapping("/{language}/news/{articleId}")
public String newsPage(..., HttpServletRequest request) {
String uri = request.getRequestUri();
...
}
如果您经常需要它,那么您可以实现HandlerMethodArgumentResolver*请参阅此答案的示例(它为当前用户实现了HandlerMethodArgumentResolver,但您可以轻松地将其改编为URL) 2.)存储会话中每个请求的url 您可以实现或Spring,两者都获得
HttpServletRequest
(在Servlet过滤器中,您需要首先将ServletRequest
转换为HttpServletRequest
)
然后可以获取url和会话httpServletRequest.getSession()
,然后将url存储在会话中
public class MyFilter implements Filter {
@Override
public void init(final FilterConfig filterConfig) throws ServletException {
//do nothing
}
@Override
public void doFilter(ServletRequest requ, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
if (requ instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = (HttpServletRequest) requ;
httpServletRequest.getSession().setAttribute(
"myFilter.LAST_URL",
httpServletRequest .getRequestURI());
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
选项1意味着向我试图避免的每个控制器/方法添加样板文件。选项2:我已经尝试过了,但正在从过滤器链(css、js等)获取对静态资源的请求而不仅仅是控制器的目标URI。我正在研究addInterceptor,如下所示:问题是我关闭了@EnableMvc,因为我们需要重新排序请求和资源处理程序顺序(css/news.css与{language}/news-controller映射相互干扰)…user1016765:如果您对控制器映射的URL有一个公共后缀,则可以将其用于筛选器映射。我们可以将其存储在会话中,因为我需要的行为仅在用户选择登录时发生,因此它只会影响登录成功重定向。不过,这一点很好,我将在属性警告中添加一些注释这个,谢谢。