2016-02-25 54 views
4

我需要處理所有來自某些Spring控制器的請求,以獲取某些請求者信息或拋出諸如安全過濾器之類的異常。某些控制器的彈簧mvc過濾器

我想是否有東西buildin在春天像過濾器控制器(我需要它不是所有的控制器,但只爲某人)。 我不想通過url請求應用此過濾器,但使用類/方法擴展名或註釋。

這是我的實際的解決方案:

@Controller 
public class MyFilteredController extends FilterController { 

    @RequestMapping("/filtered") 
    public void test1(HttpServletRequest req){ 
     InfoBean infobean=filter(req); 
     //... controller job 
    } 

} 

延伸一類的過濾器的方法的控制器。在使用SpringDispatcherServlet

public abstract FilterController{ 
    protected InfoBean filter(HttpServletRequest req){ 
     //... filter job 
     return infobean; 
    } 
} 

回答

0

一切都是基於URL,我不認爲你可以通過控制器做到這一點。

您將需要使用過濾器,看看這裏的API https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/filter/package-summary.html你可能會想使用OncePerRequestFilter。

public class MyFilter extends OncePerRequestFilter{ 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 
     // TODO Auto-generated method stub 

    } 

} 

,那麼你將需要添加過濾器在web.xml

<filter> 
     <filter-name>requestFilter</filter-name> 
     <filter-class>com.greg.MyFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>errorHandlerFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

現在哈克位,如果你想獲得的Spring bean在這裏你可以創建一個靜態類橋它。

public class Bridge { 

    private static PaymentService paymentService; 

    public PaymentService getPaymentService() { 
     return paymentService; 
    } 

    public void setPaymentService(PaymentService paymentService) { 
     Bridge.paymentService = paymentService; 
    } 

} 

如果你想在你的過濾一些Spring bean的注入該類

<bean id="paymentService" class="net.isban.example.service.PaymentService" /> 

    <bean class="net.isban.example.util.Bridge"> 
     <property name="paymentService" ref="paymentService" /> 
    </bean> 

然後(不是春類)。

PaymentService paymentService = new Bridge().getPaymentService(); 

很高興有人向我展示一個不太冒險的做法。

+0

,因爲我需要一些Spring上下文對象,如@服務,@庫等。這就是爲什麼我想裏面的過濾器,我不能使用這樣的過濾器的作者控制器。 – Tobia

+0

@Tobia請閱讀我的回答,我已經具體向您展示瞭如何通過Bridge類從非彈簧(過濾器)連接到彈簧容器(@Service等)將bean引入過濾器。 –

6

我不想通過URL請求,但有 類/方法擴展或註釋

您可以註冊用於此目的的HandlerInterceptor應用此過濾器。例如,您可以應用過濾器來與SomeAnnotation標註有下面的代碼的所有處理方法:

public class CustomHandlerIntercepter extends HandlerInterceptorAdapter { 
    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     if (handler instanceof HandlerMethod) { 
      HandlerMethod handlerMethod = (HandlerMethod) handler; 

      SomeAnnotation annotation = handlerMethod.getMethodAnnotation(SomeAnnotation.class); 
      if (annotation != null) { 
       // do stuff 
      } 
     } 
     return true; 
    } 
} 

此外,你應該在WebConfig註冊您的攔截:

@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new CustomHandlerIntercepter()); 
    } 
} 

你可以閱讀更多關於攔截在spring reference documentation

+0

「// do stuff」也意味着像@ Services一樣鏈接spring beans? – Tobia

+0

如果你想訪問spring的託管組件和服務,你應該使這個攔截器成爲一個'Component'和'Autowire'它們成爲攔截器。 –

+0

好的,真好!最後一件事,我可以訪問handlerMethod params嗎? – Tobia

0

看看SpringSandwich http://springsandwich.com/

它可以讓你設置你可以做到這一點過濾器(實際上是Spring Interceptors)作爲控制器註釋。與普通的servlet過濾器不同,您還可以完全訪問Spring上下文。

披露:我是這個框架:)

+0

SpringSandwich似乎比其他人更好。代碼更有條理,謝謝。我會試試看。 – HeisenBerg

+0

對不起,但是如何訪問三明治過濾器類中的@RequestParam屬性 – HeisenBerg