2010-05-26 29 views
5

Trong Spring MVC 2.5 với Jetty - có thể với bất kỳ thùng chứa servlet nào -, tôi muốn chuyển hướng đến một trang bên ngoài bằng cách sử dụng RedirectView thông qua ma thuật "redirect: "tiền tố cho tên chế độ xem trong ModelAndView.Spring MVC và Jetty: Ngăn chặn jsessionid không được sử dụng trong RedirectView khi chuyển hướng đến trang bên ngoài

Thật không may, RedirectView sử dụng response.encodeRedirectURL(), vì vậy, id phiên của tôi (otherwiese wanted) được thêm vào URL. Nó không chỉ là một nguy cơ bảo mật để mang id phiên tới trang bên ngoài, chuỗi "; jsessionid = gagnbaba" cũng có thể được hiểu là một phần của ContextPath/PathInfo trên trang web khác, dẫn đến một URL không hợp lệ.

Bất kỳ tùy chọn "mùa xuân" nào khác ngoài triển khai ExternalRedirectView của riêng tôi ... và cũng có thể tấn công ViewResolver để diễn giải tiền tố "externalRedirect:"? (Yêu cầu các tập tin cookie không phải là một lựa chọn.)

Moritz

+0

'RedirectView' không gọi' response.encodeURL() ', nó gọi' response.encodeRedirectURL() ' – skaffman

+0

đúng, cảm ơn. Sửa chữa trong câu hỏi. –

+0

Làm cách nào để bạn triển khai 'ExternalRedirectView' khác với' RedirectView' chuẩn? – skaffman

Trả lời

2

Bây giờ đây là ExternalRedirectView theo kế hoạch trong nhận xét của tôi ở trên ... đã làm nó theo cách đó.

import java.io.IOException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.view.RedirectView; 

/** variant of RedirectView, will not add a session id to the url 
*/ 
public class ExternalRedirectView extends RedirectView { 
    public ExternalRedirectView(String url, boolean contextRelative) { 
     super(url, contextRelative); 
    } 

    /** copied from @link{RedirectView#sendRedirect} and removed calls to 
    * reponse.encodeRedirectURL() 
    */ 
    @Override 
    protected void sendRedirect(HttpServletRequest request, 
      HttpServletResponse response, String targetUrl, 
      boolean http10Compatible) throws IOException { 
     if (http10Compatible) { 
      // Always send status code 302. 
      response.sendRedirect(targetUrl); 
     } 
     else { 
      // Correct HTTP status code is 303, in particular for POST requests. 
      response.setStatus(303); 
      response.setHeader("Location", targetUrl); 
     } 
    } 
} 

Tôi cũng đã có ViewResolver của riêng tôi mà tôi đã thêm các chức năng cho externalRedirect mới: kỳ diệu tên Vier tiền tố, mà bây giờ đọc:

class MyViewResolver extends AbstractCachingViewResolver implements BeanFactoryAware { 
[...] 
    private static final String EXTERNAL_REDIRECT_URL_PREFIX = "externalRedirect:"; 
[...] 
    @Override 
    protected View loadView(String viewName, Locale locale) throws Exception { 
     View view; 
     if (viewName.startsWith(UrlBasedViewResolver.REDIRECT_URL_PREFIX)) 
     { 
      view = new RedirectView(viewName.substring(UrlBasedViewResolver.REDIRECT_URL_PREFIX.length()), true); 
     } 
     else if (viewName.startsWith(EXTERNAL_REDIRECT_URL_PREFIX)) 
     { 
      view = new ExternalRedirectView(viewName.substring(EXTERNAL_REDIRECT_URL_PREFIX.length()), true); 
     } 
     else 

[...] Nhờ tất cả mọi người người đọc điều này và nghĩ về nó.

Các vấn đề liên quan