50

リクエストごとに何らかの情報を取得したいので、リクエストごとに関数を用意してリクエストから個別に情報を取得するよりも、フィルターを使用した方がよいと思います。
したがって、すべてのリクエストがそのフィルターを通過し、必要なものが得られます。


問題は、カスタム フィルターを作成するにはどうすればよいかということです。
定義済みのスプリング セキュリティ フィルターとは異なり、まったく新しいものであるとします。

4

2 に答える 2

47

標準の Java フィルターを使用できます。web.xml の認証フィルターの後に配置するだけです (これは、フィルター チェーンの後半に移動し、セキュリティ フィルター チェーンの後に呼び出されることを意味します)。

public class CustomFilter implements Filter{

    @Override
    public void destroy() {
        // Do nothing
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {

            HttpServletRequest request = (HttpServletRequest) req;

            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

            Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
            if (roles.contains("ROLE_USER")) {
                request.getSession().setAttribute("myVale", "myvalue");
            }

            chain.doFilter(req, res);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // Do nothing
    }

}

web.xml のフラグメント:

<!-- The Spring Security Filter Chain -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Your filter definition -->
<filter>
    <filter-name>customFilter</filter-name>
    <filter-class>com.yourcompany.test.CustomFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>customFilter</filter-name>
    <url-pattern>/VacationsManager.jsp</url-pattern>
</filter-mapping>

また、ログインが成功した後に呼び出されるハンドラーを追加することもできます ( SavedRequestAwareAuthenticationSuccessHandlerを拡張する必要があります)。これを行う方法はこちらをご覧ください。そして、これはさらに良いアイデアだと思います。


更新:
または、次のようにセキュリティ フィルターの最後にこのフィルターを配置することもできます。

<security:filter-chain-map>
    <sec:filter-chain pattern="/**"
            filters="
        ConcurrentSessionFilterAdmin, 
        securityContextPersistenceFilter, 
        logoutFilterAdmin, 
        usernamePasswordAuthenticationFilterAdmin, 
        basicAuthenticationFilterAdmin, 
        requestCacheAwareFilter, 
        securityContextHolderAwareRequestFilter, 
        anonymousAuthenticationFilter, 
        sessionManagementFilterAdmin, 
        exceptionTranslationFilter, 
        filterSecurityInterceptorAdmin,
        MonitoringFilter"/> <!-- Your Filter at the End -->
</security:filter-chain-map>

フィルターを作成するには、これを使用できます。

public class MonitoringFilter extends GenericFilterBean{
@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    //Implement this Function to have your filter working
}
于 2012-08-13T06:27:19.087 に答える