I.概要
1.1インターセプター異常事態
- DispatherServletコールHandlerMappingは子供のチェーン(傍受以上)の遮断リターンをHandlerMapping、ハンドラを見つけ、中にDispatherServletへのユーザー要求は、springmvcインターセプターはHandlerMappingで発売されました。
- 企業の発展には、インターセプタのユーザ認証を使用する、ユーザー権利の傍受を(ユーザID認証は、着陸後に傍受しました)。
1.2インターセプタメソッド
public class HandlerInterceptor1 implements HandlerInterceptor {
//在执行handler之前来执行的
//用于用户认证校验、用户权限校验
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("HandlerInterceptor1...preHandle");
//如果返回false表示拦截不继续执行handler,如果返回true表示放行
return false;
}
//在执行handler返回modelAndView之前来执行
//如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("HandlerInterceptor1...postHandle");
}
//执行handler之后执行此方法
//作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
//实现 系统 统一日志记录
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("HandlerInterceptor1...afterCompletion");
}
}
第二に、例えば、
2.1定義2つのインターセプタ
2.2コンフィギュレーション・インターセプター
- グローバルインターセプタを設定し、DispatcherServletのは、すべてのHandlerMappingにロードされたグローバルインターセプタを設定します。
- springmvc.xmlのconfigureで:
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.hao.ssm.controller.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.hao.ssm.controller.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
2.3実行の順序
- PreHandle実行順序が実行されます。
- 実行postHandle、afterCompletion逆順の実行
- preHandleがリリースされていない場合は、postHandle、afterCompletionは実行されませ。
- 限り迎撃リリースがないよう、コントローラが完全に実行することはできません
- preHandleインターセプタインターセプタメソッドpreHandleリリースの唯一の前には、以下の実行されなければなりません。
第三に、インターセプターアプリケーション
3.1要件
- リソースユーザーは、ユーザーが認証されない場合は、システム(URL)にアクセスインターセプトするために、システムは、ユーザが認証された場合、ユーザーはシステムリソースにアクセスし続けることができ、ランディングページをジャンプします。
3.2ユーザのログインおよび機能の開発を終了
@Controller
public class LoginController {
//用户登陆提交方法
@RequestMapping("/login")
public String login(HttpSession session, String usercode,String password)throws Exception{
//调用service校验用户账号和密码的正确性
//..
//如果service校验通过,将用户身份记录到session
session.setAttribute("usercode", usercode);
//重定向到商品查询页面
return "redirect:/items/queryItems.action";
}
//用户退出
@RequestMapping("/logout")
public String logout(HttpSession session)throws Exception{
//session失效
session.invalidate();
//重定向到商品查询页面
return "redirect:/items/queryItems.action";
}
}
3.3ユーザー認証チェックインターセプタ
3.4書き込みブロッカー
public class LoginInterceptor implements HandlerInterceptor {
//在执行handler之前来执行的
//用于用户认证校验、用户权限校验
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//得到请求的url
String url = request.getRequestURI();
//判断是否是公开 地址
//实际开发中需要公开 地址配置在配置文件中
//...
if(url.indexOf("login.action")>=0){
//如果是公开 地址则放行
return true;
}
//判断用户身份在session中是否存在
HttpSession session = request.getSession();
String usercode = (String) session.getAttribute("usercode");
//如果用户身份在session中存在放行
if(usercode!=null){
return true;
}
//执行到这里拦截,跳转到登陆页面,用户进行身份认证
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
//如果返回false表示拦截不继续执行handler,如果返回true表示放行
return false;
}
//在执行handler返回modelAndView之前来执行
//如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("HandlerInterceptor1...postHandle");
}
//执行handler之后执行此方法
//作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
//实现 系统 统一日志记录
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("HandlerInterceptor1...afterCompletion");
}
}
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<!-- <mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.hao.ssm.controller.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.hao.ssm.controller.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor> -->
<mvc:interceptor>
<!-- /**可以拦截路径不管多少层 -->
<mvc:mapping path="/**" />
<bean class="com.hao.ssm.controller.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>