Spring MVCにおけるHandler InterceptorAdapterの使用
一般的に、ブラウザからの要求に対するブロッキングは、Filterを利用して実現され、このような方法は、Bean前処理、後処理を実現することができる. Spring MVCのブロックはFilterのすべての機能を実現するだけではなく、より正確にブロック精度を制御することができます.
Springはorg.springframe ebork.web.servlet.handle.Handler InterceptorAdapterというアダプターを提供しています.このようなアダプターを受け継ぎます.とても便利に自分のスクリーンセーバーを実現できます.彼には三つの方法があります.
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アクションに相当します.