有没有办法访问从Spring MVC控制器解析的URL - 例如
@RequestMapping("/{language}/news/{articleId}")
public String newsPage(...) {
}
解析为:
/en/news/63421
我想将此与会话存储在一起,以便我可以跟踪最后访问过的地方。这里的动机是如果页面是安全的,登录过滤器将起作用,我们已经使用
SavedRequestAwareAuthenticationSuccessHandler
将用户路由回他们尝试访问的页面。
但是,如果他们正在查看不安全的页面并选择使用从屏幕顶部(页面的菜单栏)下拉的表单登录,则“最后一页”似乎是登录表单,因此成功处理程序会删除它们回到根上下文。
我想截取控制器调用并在会话中存储单个URL,覆盖SavedRequestAwareAuthenticationSuccessHandler以允许我们修改RequestCache,然后让Spring重定向登录成功。
理想情况下,我们想要在所有控制器上执行此操作的通用方法,但不确定是否有可用于选择此过滤器的过滤器 - 过滤请求会获得各种噪声,如css,js,images和html片段页面所以我们希望有人知道如何通过控制器本身来做到这一点。
答案 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() {
}
}