在访问Spring MVC @Controller时存储url

时间:2013-07-19 09:24:39

标签: spring spring-mvc spring-security

有没有办法访问从Spring MVC控制器解析的URL - 例如

@RequestMapping("/{language}/news/{articleId}")
public String newsPage(...) {

}

解析为:

/en/news/63421 

我想将此与会话存储在一起,以便我可以跟踪最后访问过的地方。这里的动机是如果页面是安全的,登录过滤器将起作用,我们已经使用

  

SavedRequestAwareAuthenticationSuccessHandler

将用户路由回他们尝试访问的页面。

但是,如果他们正在查看不安全的页面并选择使用从屏幕顶部(页面的菜单栏)下拉的表单登录,则“最后一页”似乎是登录表单,因此成功处理程序会删除它们回到根上下文。

我想截取控制器调用并在会话中存储单个URL,覆盖SavedRequestAwareAuthenticationSuccessHandler以允许我们修改RequestCache,然后让Spring重定向登录成功。

理想情况下,我们想要在所有控制器上执行此操作的通用方法,但不确定是否有可用于选择此过滤器的过滤器 - 过滤请求会获得各种噪声,如css,js,images和html片段页面所以我们希望有人知道如何通过控制器本身来做到这一点。

2 个答案:

答案 0 :(得分:1)

要获取URL路径,您可以使用HttpServletRequest - 例如,您有:

www.mysite.com/en/news/63421

req.getPathInfo()= / en / news / 63421

如果有人要在打开多个标签的情况下使用您的网站,那么将其存储在会话中会导致问题。

答案 1 :(得分:1)

有两个问题:

1)以控制器方法获取网址

@RequestMapping("/{language}/news/{articleId}")
public String newsPage(..., HttpServletRequest request) {
    String uri = request.getRequestUri();
    ...
}

如果您经常需要这个,那么您可以实现HandlerMethodArgumentResolver。 *有关示例,请参阅此答案https://stackoverflow.com/a/8769670/280244(它为当前用户实现了HandlerMethodArgumentResolver,但您可以轻松地将其调整为URL)。

2。)在会话中存储每个请求的网址

您可以实现Servlet Filter或Spring HandlerInterceptor,两者都获得HttpServletRequest(在Servlet过滤器中,您需要将ServletRequest强制转换为HttpServletRequest第一

然后您可以获取网址和会话httpServletRequest.getSession(),然后将网址存储在会话中。

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() {
    }

}