spring bootではスクリーンセーバーを利用して権限制御を実現します.
5909 ワード
SpringのInterceptorブロッキング要求は、Handler Interceptorによって実現されます.SpringでIntercepterを定義するのは非常に簡単で、主に2つの方法があります.【第一の方法】は定義するInterceptor類がSpringのHandlerInterceptorインターフェースを実現するために、またはこの種類の継承がHandler Interceptorインターフェースを実現した種類です.例えばSpringが提供されたHandlerInternetインタフェースの抽象的なHandler Internet Proterクラスです.【第二の方法】Springを実現するWebrequest InterceptorインターフェースまたはWebrequest Interceptorを継承して実現したクラスです.主に3つの方法でブロック業務を実現します.
【postHandle方法】postHandle(HttpServletRequest request、HttpServletResonse reponse、Object hadle、ModelAndView)方法は、preHandle方法の解釈によって、後に述べるafter Hattleメソッドのみが呼び戻されます.PostHandle方法は、名前の通り、現在の要求が処理された後、つまりControllerメソッドの呼び出し後に実行されますが、DisparterServletがビューを行ってレンダリングする前に呼び出されますので、この方法でController処理後のModelAndViewオブジェクトを操作することができます.postHandleメソッドが呼び出される方向はpreHandleとは逆で、先に声明したInterceptorのpostHandle方法は逆の後に実行されます.これはStruts 2のIntercepterの実行過程と少しタイプがあります.Struts 2内のInterceptorの実行プロセスもチェーン式であり、Struts 2内ではActinvocationのinvokeメソッドを手動で起動して次のInterceptorまたはアクションの呼び出しをトリガし、各Interceptorのinvokeメソッドの呼び出し前の内容は声明の順序で実行されます.invokeの方法の後の内容は逆です.
【after Comppletion方法】afterComplect request request、HttpServletResonse reponse、Object handle、Exception ex)方法は、現在対応するInterceptorのpreHandle方法の戻り値がtrueの時に実行されます.この方法は、要求全体が終了した後、すなわちDispactch Servletに対応するビューをレンダリングした後に実行される.この方法の主な役割は資源整理作業を行うためのものである.
【以下はspring bootにおけるブロックの運用】
【ブロック類の登録】WebAppConfig
// ( true, ; false, ; , )
public boolean preHandle (
HttpServletRequest request,
HttpServletResponse response,
Object handle)
// ( : , , , )
public void postHandle (
HttpServletRequest request,
HttpServletResponse response,
Object handle,
ModelAndView modelAndView)
// Interceptor preHandle true ( )
public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) throws Exception
スクリーニングの3つの方法の具体的な紹介:【preHandle方法】preHandle(HttpServletRequest request、HttpServlet Respnse reponse、Object handle)方法は、文字通り、要求処理の前に呼び出します.SprigMVCのInterceptorはチェーン式の呼び出しであり、一つのアプリケーションまたは一つの要求に複数のInterceptorが同時に存在することができる.各Interceptorの呼び出しは、その声明の順序に従って順次実行され、最初に実行されるのは、IntercepterにおけるpreHandle方法であるので、この方法では前置初期化操作や、現在要求されている一つの前処理を行っても良いし、この方法では、要求が継続するかどうかを判断しても良い.この方法の戻り値は、ブール値Booleanタイプであり、falseに戻ると、要求が終了し、後続のInterceptorとControllerは再実行されないことを示す.戻り値がtrueの場合は、次のIntercepterのpreHandleメソッドを呼び出し続けます.最後のInterceptorの場合は、現在の要求を呼び出すController方法です.【postHandle方法】postHandle(HttpServletRequest request、HttpServletResonse reponse、Object hadle、ModelAndView)方法は、preHandle方法の解釈によって、後に述べるafter Hattleメソッドのみが呼び戻されます.PostHandle方法は、名前の通り、現在の要求が処理された後、つまりControllerメソッドの呼び出し後に実行されますが、DisparterServletがビューを行ってレンダリングする前に呼び出されますので、この方法でController処理後のModelAndViewオブジェクトを操作することができます.postHandleメソッドが呼び出される方向はpreHandleとは逆で、先に声明したInterceptorのpostHandle方法は逆の後に実行されます.これはStruts 2のIntercepterの実行過程と少しタイプがあります.Struts 2内のInterceptorの実行プロセスもチェーン式であり、Struts 2内ではActinvocationのinvokeメソッドを手動で起動して次のInterceptorまたはアクションの呼び出しをトリガし、各Interceptorのinvokeメソッドの呼び出し前の内容は声明の順序で実行されます.invokeの方法の後の内容は逆です.
【after Comppletion方法】afterComplect request request、HttpServletResonse reponse、Object handle、Exception ex)方法は、現在対応するInterceptorのpreHandle方法の戻り値がtrueの時に実行されます.この方法は、要求全体が終了した後、すなわちDispactch Servletに対応するビューをレンダリングした後に実行される.この方法の主な役割は資源整理作業を行うためのものである.
【以下はspring bootにおけるブロックの運用】
【ブロック類の登録】WebAppConfig
/**
* Created by mis on 2016/7/30.
* @author lvfang
*/
@EnableWebMvc
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
//
@Bean
HiseeInterceptor hiseeInterceptor(){
return new HiseeInterceptor();
}
/**
*
*
* @param registry
* @author lvfang
*/
public void addInterceptors(InterceptorRegistry registry) {
// HandlerInterceptor
registry.addInterceptor(hiseeInterceptor())
.addPathPatterns("/**")//
.excludePathPatterns("/user/login")
.excludePathPatterns("/user/exit");//
}
}
【権限判断のパッケージクラス】BaseInterceptor/**
* Created by mis on 2017/5/25.
* @author lvfang
*/
public class BaseInterceptor {
/**
*
* @param permissionDomainRepository
* @param url
* @return
*/
public boolean isHavePermiss(PermissionDomainRepository permissionDomainRepository, UserInfo userInfo, String url){
boolean falg = false;
//
Set permissionInfos = permissionDomainRepository.findPermissionByUid(userInfo.getId());
//
Iterator iterator = permissionInfos.iterator();
while(iterator.hasNext()){
PermissionInfo permissionInfo = iterator.next();
if(permissionInfo.getpUrl().equals(url)){
falg = true;
}
}
return falg;
}
}
【具体的な権限実現】ブロック実現:Hisee Interceptor/**
*
*/
@Component
public class HiseeInterceptor extends BaseInterceptor implements HandlerInterceptor {
@Autowired
private PermissionDomainRepository permissionDomainRepository;
@Autowired
private UserInfoMapper userInfoMapper;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// session
UserSession userSession = SpringUtil.getBean(UserSession.class);
HiseeInterceptor userInterceptor = new HiseeInterceptor();
//
boolean isLogin = userSession.isLogin();
//
String url = request.getRequestURI(); // /user/deleteUser
UserInfo userInfo = userInfoMapper.findUserInfoById(userSession.getUserId());
//
if(!isLogin){
System.out.println(" ... ...");
return false;
}
//
boolean pstate = userInterceptor.isHavePermiss(permissionDomainRepository,userInfo,url);
if(!pstate){
System.out.println(" ... ...");
return false;
}
System.out.println(" ... ...");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
【参考】http://elim.iteye.com/blog/1750680