3

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

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

}

决议:

/en/news/63421 

我想将其与会话一起存储,以便跟踪上次访问的地方。这里的动机是如果页面是安全的,登录过滤器就会发挥作用,我们已经使用了

SavedRequestAwareAuthenticationSuccessHandler

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

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

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

理想情况下,我们希望有一种通用的方式在所有控制器上执行此操作,但不确定是否有一个过滤器可以用来处理这个问题 - 过滤请求会产生各种噪音,例如 css、js、图像和 html 片段页面,所以我们重新希望有人知道一种仅使用控制器本身来执行此操作的方法。

4

2 回答 2

1

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

www.mysite.com/en/news/63421

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

但是,如果有人在打开多个选项卡的情况下使用您的网站,则将其存储在会话中可能会导致问题。

于 2013-07-19T09:41:24.860 回答
1

有两个问题:

1)在控制器方法中获取url

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

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

2.) 在会话中存储每个请求的 url

您可以实现一个Servlet 过滤器或 Spring HandlerInterceptor,两者都得到一个HttpServletRequest (在一个 Servlet 过滤器中,您需要将其ServletRequest转换为HttpServletRequest第一个。

然后你可以获取url和Session 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() {
    }

}
于 2013-07-19T09:49:46.187 回答