2013-07-19 34 views
2

有沒有辦法訪問從Spring MVC控制器解析的URL - 例如,訪問@Controller時存儲URL Spring MVC

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

} 

解析爲:

/en/news/63421 

我想這個存儲與會話,這樣我就可以保持上次訪問的地方的軌道。這裏的動機是,如果是安全網頁登錄過濾器將發揮作用,我們已經使用

SavedRequestAwareAuthenticationSuccessHandler

路由用戶到他們曾經試圖訪問的頁面。

但是,如果他們正在查看不安全的頁面並選擇使用從屏幕頂部下拉的表單(頁面的菜單欄)登錄,則「最後一頁」似乎是登錄表單,因此成功處理程序將丟失他們回到根上下文。

我想攔截控制器調用並在會話中存儲單個URL,覆蓋SavedRequestAwareAuthenticationSuccessHandler以允許我們修改RequestCache,然後讓Spring重定向登錄成功。

理想情況下,我們希望通過一種通用的方式在所有控制器上執行此操作,但不確定是否有篩選器可用於選擇此篩選請求獲取各種噪聲,如css,js,圖像和html片段因此我們希望有人知道只有控制器本身才能做到這一點。

回答

1

要獲得URL路徑,你可以使用HttpServletRequest的 - 因此,例如您有:

www.mysite.com/en/news/63421

req.getPathInfo()=/EN /新聞/ 63421

將它存儲在會話中雖然可能會導致問題,如果有人要使用您的網站打開多個選項卡。

+0

我們確定存儲在會話中,因爲我只需要在用戶選擇登錄時發生的行爲,所以它只會影響登錄成功重定向。好點,但我會添加一些意見,警告這個屬性,謝謝。 – user1016765

1

有兩個問題:

1)獲得的URL在控制器方法

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

如果你需要這個非常頻繁,那麼你可以實現一個HandlerMethodArgumentResolver。 *看到這個答案https://stackoverflow.com/a/8769670/280244爲例(它實現了當前用戶HandlerMethodArgumentResolver,但你可以easyly適應它的URL)

2)存儲URL在會議

你每個請求可以實現Servlet Filter或春季HandlerInterceptor,都得到一個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() { 
    } 

} 
+0

選項1意味着爲我想要避免的每個控制器/方法添加樣板。 – user1016765

+0

選項2:我已經嘗試過,但是正在從過濾器鏈(css,js等)中獲取靜態資源的請求,而不是控制器的目標URI。 我正在尋找像這樣的addInterceptor:http://stackoverflow.com/questions/10391988/in-spring-3-1-can-mvcinterceptors-be-used-in-conjunction-with-configuration 問題是我關閉了@EnableMvc,因爲我們需要重新排序請求和資源處理程序命令(css/news.css干擾了{language} /新聞控制器映射)... – user1016765

+0

user1016765:如果您有一個通用後綴,由控制器映射,然後您可以將其用於過濾器映射。 – Ralph