2010-08-05 33 views
13

Tôi cần chuyển tiếp yêu cầu (đến jsp nhưng tôi không nghĩ đó là vấn đề) từ http.Filter nếu URI của yêu cầu ban đầu vượt qua một số xác thực mà bộ lọc của tôi chạy.Yêu cầu chuyển tiếp từ bộ lọc

Tôi thấy điều này page that faced similar task

Tôi vẫn cần phải tìm những điều sau đây:

  1. Làm thế nào tôi có thể nhận được ServletContext trong doFilter() phương pháp (theo thứ tự để gọi về phía trước API) getServletContext() không recignized

  2. Tôi có phải call chain.doFilter() trước khi chuyển tiếp, sau khi chuyển tiếp hay không? Ngoài ra, tôi có phải gọi số chain.doFilter() nếu xác thực của tôi được thông qua hoặc chỉ khi nó không thành công (vì trong trường hợp này tôi sẽ không tiếp tục chuyển tiếp trang của mình)?

Câu hỏi này thực sự tiếp tục this thread, được rõ ràng hơn, các mã có thể là một cái gì đó như:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     if (request instanceof HttpServletRequest) { 
      HttpServletRequest httpServletRequest = ((HttpServletRequest)request); 
      String requestURI = httpServletRequest.getRequestURI(); 
      String contextPath = httpServletRequest.getContextPath(); 
      if (<this is my implementation of the validation of this filter>){          
       getServletContext().getRequestDispatcher(
       "MySpecific.jsp").forward(request,response); 

      } 

     } 
     chain.doFilter(request,response); 

    } 

Trả lời

10

Làm thế nào tôi có thể nhận được ServletContext trong doFilter() phương pháp?

httpServletRequest.getSession().getServletContext(); 

Tôi có phải gọi chain.doFilter() trước khi về phía trước, sau khi phía trước hoặc không gì cả? Ngoài ra, tôi có phải gọi chain.doFilter() nếu xác thực của tôi được thông qua hoặc chỉ khi nó không thành công (vì trong trường hợp này tôi sẽ không tiếp tục chuyển tiếp trang của tôi)?

Tôi muốn nói rằng nếu bạn chuyển tiếp yêu cầu, bạn không nên gọi chain.doFilter() - yêu cầu được chuyển tiếp sẽ được lọc theo cấu hình bộ lọc của riêng nó. Tuy nhiên, nếu xác thực của bạn không thành công, nó phụ thuộc vào ngữ nghĩa của ứng dụng web của bạn là gì - nếu trang gốc là một loại lỗi chung/đăng nhập/màn hình chào mừng, bạn có thể muốn tiếp tục điều đó khi xác thực không thành công. Thật khó để nói mà không biết nhiều hơn về bối cảnh.

10

Để có được ServletContext, bạn đã có 2 lựa chọn:

  • cửa hàng ra khỏi FilterConfig trong khởi tạo và gọi FilterConfig.getServletContext()

  • gọi HttpServletRequest.getSession().getServletContext()

I don' t nghĩ rằng bạn nhất thiết cần ServletContext để có được RequestDispatcher như bạn có thể gọi HttpServletRequest.getRequestDispatcher().

Liên quan đến cuộc gọi FilterChain.doFilter(), nếu bạn đang chuyển tiếp, tôi nghĩ bạn sẽ không thực hiện cuộc gọi, như khi bạn chuyển tiếp, tôi cho rằng bạn không muốn bất kỳ hành vi chuẩn nào diễn ra. Nếu bạn không chuyển tiếp (bạn không rơi vào khối nếu bạn), thì tôi sẽ gọi phương thức FilterChain.doFilter(), tuy nhiên giả sử có một mục tiêu ở đầu kia được gọi.

+0

cả hai câu trả lời đều ổn. Cái kia là đầu tiên. – Spiderman

+0

Cất bộ lọc FilterConfig trong khi khởi tạo và gọi FilterConfig.getServletContext() Đây là phương pháp ưa thích của tôi vì không có phiên rõ ràng: – Gurnard

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