Spring MVCにおけるHandler InterceptorAdapterの使用


一般的に、ブラウザからの要求に対するブロッキングは、Filterを利用して実現され、このような方法は、Bean前処理、後処理を実現することができる. Spring MVCのブロックはFilterのすべての機能を実現するだけではなく、より正確にブロック精度を制御することができます. 
Springはorg.springframe ebork.web.servlet.handle.Handler InterceptorAdapterというアダプターを提供しています.このようなアダプターを受け継ぎます.とても便利に自分のスクリーンセーバーを実現できます.彼には三つの方法があります.
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
        throws Exception {  
        return true;  
    }  
    public void postHandle(  
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)  
            throws Exception {  
    }  
    public void afterCompletion(  
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
            throws Exception {  
            
    }
前処理、後処理(Serviceを呼び出してModelAndViewに戻るが、ページレンダリングは行われていない)、戻り処理(ページをレンダリングした)をそれぞれ実行します. preHandleでは、符号化、安全制御などの処理ができます. postHandleでModelAndViewを修正する機会があります. afterComplectionでは、exがnullであるかどうかを判定し、ログを記録することができます. xml構成に基づいてSpring MVCを使用すれば、SimpleUrlhandlerMapping、BenNameUrlhandlerMappingを利用してUrlマッピング(structsのpathマッピングに相当)とブロッキング要求(注入interceptors)を行うことができます.この注釈に基づいてSpring MVCを使用すれば、Default Annotionation Handlectoring Mandlepterpper Madenterceptoringを使用することができます.注意xmlに基づいても、注釈に基づいても、HandlerMapping beanはxmlに配置する必要があります. 一つのデモ: この例では、UserControllerにおける登録操作は9:00-12:00に開放されていると仮定すれば、スクリーンセーバーを使ってこの機能を実現することができる. 
public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {  
    private int openingTime;  
    private int closingTime;  
    private String mappingURL;//                
    public void setOpeningTime(int openingTime) {  
        this.openingTime = openingTime;  
    }  
    public void setClosingTime(int closingTime) {  
        this.closingTime = closingTime;  
    }  
    public void setMappingURL(String mappingURL) {  
        this.mappingURL = mappingURL;  
    }  
    @Override  
    public boolean preHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler) throws Exception {  
        String url=request.getRequestURL().toString();  
        if(mappingURL==null || url.matches(mappingURL)){  
            Calendar c=Calendar.getInstance();  
            c.setTime(new Date());  
            int now=c.get(Calendar.HOUR_OF_DAY);  
            if(now<openingTime || now>closingTime){  
                request.setAttribute("msg", "      :9:00-12:00");  
                request.getRequestDispatcher("/msg.jsp").forward(request, response);  
                return false;  
            }  
            return true;  
        }  
        return true;  
    }  
}
xml設定: 
<bean id="timeBasedAccessInterceptor" class="com.spring.handler.TimeBasedAccessInterceptor">  
    <property name="openingTime" value="9" />  
    <property name="closingTime" value="12" />  
    <property name="mappingURL" value=".*/user\.do\?action=reg.*" />  
</bean>  
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
    <property name="interceptors">  
        <list>  
            <ref bean="timeBasedAccessInterceptor"/>  
        </list>  
    </property>  
</bean>
ここでは、mappings URL属性を定義し、正規表現を用いてurlを整合させ、より細かい粒度でブロックすることを実現した.もちろん、mappingURLが定義されていない場合は、デフォルトではControllerに対するすべての要求をブロックします. UserController: 
@Controller  
@RequestMapping("/user.do")  
public class UserController{  
    @Autowired  
    private UserService userService;  
    @RequestMapping(params="action=reg")  
    public ModelAndView reg(Users user) throws Exception {  
        userService.addUser(user);  
        return new ModelAndView("profile","user",user);  
    }  
    // other option ...  
}
このコントロラーはStrutsのDisplatchアクションに相当します.