Spring MVCの中のスクリーンセーバー/フィルターHandler InterceptorAdapterの使用
8240 ワード
原文の住所https://www.cnblogs.com/EasonJim/p/7704740.html
一般的に、ブラウザからの要求に対するブロッキングは、Filterを利用して実現されます.
Springでは、Filterという方法に基づいてビーン前処理、後処理を実現することができる. 例えばFilterRegistration Beanを注入して、このBeanにFilterを引き継いで実現するカスタムFilterを渡すだけでいいです.
Spring MVCにもスクリーンがあり、Filterのすべての機能を実現するだけでなく、より正確にブロック精度を制御することができます.
Spring MVCが提供しているorg.springframewark.web.servlet.handler.Handler InterceptorAdapterというアダプターは、このようなアダプターを引き継いで、非常に便利に自分のスクリーンセーバーを実現することができます.
3つの方法があります.
preHandleは、トラフィックプロセッサ処理要求の前に呼び出しられる.前処理は、符号化、安全制御などの処理が可能である.
postHandleは、トラフィックプロセッサ処理要求の実行が完了したら、ビューを生成する前に実行します.後処理(Serviceを呼び出してModelAndViewに戻りますが、ページのレンダリングは行われていません)、ModelAndViewを変更する機会があります.
afterComplectionは、DispacterServletが要求を完全に処理した後に呼び出しられ、リソースのクリーンアップなどに利用できます.リターン処理(既にページをレンダリングしました)は、exがnullかどうかで異常が発生したかどうかを判定し、ログ記録を行います.
XML構成に基づいてSpring MVCを使用すれば、SimpleUrlHandlerMapping、BenNameUrlhandlerMappingを利用してUrlマッピング(structsのpathマッピングに相当)とブロッキング要求(注入interceptors)を行うことができます.
注釈に基づいてSpring MVCを使うと、Default AnnotationHandlerMappingを使ってinterceptorsに注入することができます.
注意XMLに基づいても、注釈に基づいても、HandlerMapping BeanはXMLに配置する必要があります.
例1:
この例では、UserControllerにおける登録操作は9:00-12:00に開放されていると仮定すれば、スクリーンセーバーを使ってこの機能を実現することができる.
ここでは、mappings URL属性を定義し、正規表現を用いてurlを整合させ、より細かい粒度でブロックすることを実現した.もちろん、mappingURLが定義されていない場合は、デフォルトではControllerに対するすべての要求をブロックします.
UserController:
複数のスクリーンショットを配置しても良いし、各ブロックは異なる分業を行うことができます.
例2:
主にXMLの配置が違います.
参考:
http://blog.csdn.net/liuwenbo0920/article/details/7283757(以上の内容はこの文章に変わります)
http://www.cnblogs.com/xingele0917/p/4318008.html
http://blog.csdn.net/ye_sheng/articale/detail/48395663 (以上の内容はこの文章に変わります)
一般的に、ブラウザからの要求に対するブロッキングは、Filterを利用して実現されます.
Springでは、Filterという方法に基づいてビーン前処理、後処理を実現することができる. 例えばFilterRegistration Beanを注入して、このBeanにFilterを引き継いで実現するカスタムFilterを渡すだけでいいです.
Spring MVCにもスクリーンがあり、Filterのすべての機能を実現するだけでなく、より正確にブロック精度を制御することができます.
Spring MVCが提供しているorg.springframewark.web.servlet.handler.Handler InterceptorAdapterというアダプターは、このようなアダプターを引き継いで、非常に便利に自分のスクリーンセーバーを実現することができます.
3つの方法があります.
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 {
}
preHandleは、トラフィックプロセッサ処理要求の前に呼び出しられる.前処理は、符号化、安全制御などの処理が可能である.
postHandleは、トラフィックプロセッサ処理要求の実行が完了したら、ビューを生成する前に実行します.後処理(Serviceを呼び出してModelAndViewに戻りますが、ページのレンダリングは行われていません)、ModelAndViewを変更する機会があります.
afterComplectionは、DispacterServletが要求を完全に処理した後に呼び出しられ、リソースのクリーンアップなどに利用できます.リターン処理(既にページをレンダリングしました)は、exがnullかどうかで異常が発生したかどうかを判定し、ログ記録を行います.
XML構成に基づいてSpring MVCを使用すれば、SimpleUrlHandlerMapping、BenNameUrlhandlerMappingを利用してUrlマッピング(structsのpathマッピングに相当)とブロッキング要求(注入interceptors)を行うことができます.
注釈に基づいてSpring MVCを使うと、Default AnnotationHandlerMappingを使ってinterceptorsに注入することができます.
注意XMLに基づいても、注釈に基づいても、HandlerMapping BeanはXMLに配置する必要があります.
例1:
この例では、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(nowclosingTime){
request.setAttribute("msg", " :9:00-12:00");
request.getRequestDispatcher("/msg.jsp").forward(request, response);
return false;
}
return true;
}
return true;
}
}
XML設定:
ここでは、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 ...
}
複数のスクリーンショットを配置しても良いし、各ブロックは異なる分業を行うことができます.
例2:
主にXMLの配置が違います.
package com.alibaba.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.alibaba.util.RequestUtil;
public class CommonInterceptor extends HandlerInterceptorAdapter{
private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);
public static final String LAST_PAGE = "com.alibaba.lastPage";
/*
*
private String mappingURL;
public void setMappingURL(String mappingURL) {
this.mappingURL = mappingURL;
}
*/
/**
*
* false
* afterCompletion(),
* true
* ,
* Controller
* ,
* postHandle()
* afterCompletion()
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if ("GET".equalsIgnoreCase(request.getMethod())) {
RequestUtil.saveRequest();
}
log.info("============== : 1、preHandle================");
String requestUri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = requestUri.substring(contextPath.length());
log.info("requestUri:"+requestUri);
log.info("contextPath:"+contextPath);
log.info("url:"+url);
String username = (String)request.getSession().getAttribute("user");
if(username == null){
log.info("Interceptor: login !");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;
}else
return true;
}
/**
* ,
* modelAndView ,
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("============== : 2、postHandle================");
if(modelAndView != null){ //
modelAndView.addObject("var", " postHandle");
}
}
/**
* DispatcherServlet ,
*
* , afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
log.info("============== : 3、afterCompletion================");
}
}
参考:
http://blog.csdn.net/liuwenbo0920/article/details/7283757(以上の内容はこの文章に変わります)
http://www.cnblogs.com/xingele0917/p/4318008.html
http://blog.csdn.net/ye_sheng/articale/detail/48395663 (以上の内容はこの文章に変わります)