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つの方法があります.
 
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 (以上の内容はこの文章に変わります)