Spring MVC访问@Controller时存储url

Spring 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 将用户路由回他们试图

有没有一种方法可以访问从SpringMVC控制器解析的URL

@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有一个公共后缀,则可以将其用于筛选器映射。我们可以将其存储在会话中,因为我需要的行为仅在用户选择登录时发生,因此它只会影响登录成功重定向。不过,这一点很好,我将在属性警告中添加一些注释这个,谢谢。