共计 4101 个字符,预计需要花费 11 分钟才能阅读完成。
SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有用的,它的次要作用是拦挡用户的申请并进行相应的解决。比方通过它来进行权限验证,或者是来判断用户是否登陆等操作。
SpringMVC 拦截器的定义形式
- 实现接口
- 继承适配器
案例实操
实现接口
实现 HandlerInterceptor 接口方式定义咱们的拦截器代码如下:
public class MyInterceptor implements HandlerInterceptor{
/**
* preHandle 在申请办法拦挡前执行
* 返回 true 代表对以后申请进行放行解决
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println(“action 之前执行!!!”);
return true; // 继续执行 action
}
/**
* 申请执行后,生成视图前执行
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(“Action 执行之后,生成视图之前执行!!”);
}
/**
* 在申请办法执行后进行拦挡
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(“ 办法执行后进行拦挡。。开释资源。。。”);
}
}
对应配置有两种形式:
配置形式一(拦挡所有申请配置形式):
<mvc:interceptors>
<!– 应用 bean 定义一个 Interceptor
间接定义在 mvc:interceptors 根上面的 Interceptor 将拦挡所有的申请 –>
<bean class=”com.xxx.interceptors.MyInterceptor” />
</mvc:interceptors>
配置形式二(拦挡指定申请配置形式)
mvc:interceptors
<!– 定义在 mvc:interceptor 上面 拦挡所有 test 地址结尾的申请 –>
<mvc:interceptor>
<mvc:mapping path=”/test/*.do” />
<bean class=”com.xxx.interceptors.MyInterceptor” />
</mvc:interceptor>
</mvc:interceptors>
成果:
申请地址: http://localhost:8080/springmvc03/test/hello.do
控制台打印后果信息:
多个拦截器配置(多个拦截器组成一个拦截器链,栈式构造 123 321 退出):
<mvc:interceptors>
<mvc:interceptor>
<!– 拦挡所有申请 –>
<mvc:mapping path=”/**” />
<bean class=”com.xxx.interceptors.MyInterceptor” />
</mvc:interceptor>
<mvc:interceptor>
<!– 拦挡所有申请 –>
<mvc:mapping path=”/**” />
<bean class=”com.xxx.interceptors.MyInterceptor2″ />
</mvc:interceptor>
</mvc:interceptors>
继承适配器
继承 HandlerInterceptorAdapter 形式定义拦截器(实际上最终还是 HandlerInterceptor 接口实现)
public class MyInterceptor2 extends HandlerInterceptorAdapter{
/**
* 重写 preHandle 申请执行前执行
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println(“ 申请前执行。。。”);
return true;
}
}
扩大
应用拦截器实现用户是否登录申请验证拦截器定义:
public class LoginInterceptor implements HandlerInterceptor{
/**
* 办法拦挡前执行
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
User user= (User) request.getSession().getAttribute(“user”);
/**
* 判断 uri 是否蕴含门路
* 蕴含就放行
*/
if(request.getRequestURI().indexOf(“userLogin.do”)>-1){
return true;
}
/**
* 判断 session user 是否为空
*/
if(null==user){
response.sendRedirect(request.getContextPath()+”/login.jsp”);
return false;
}
return true; // 继续执行 action
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(“Action 执行之后,生成视图之前执行!!”);
}
/**
* 在办法执行后进行拦挡
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(“ 办法执行后进行拦挡。。开释资源。。。”);
}
}
UserController 类
/**
- @author Administrator
- 模仿 用户操作
*/
@Controller
@RequestMapping(“/user”)
public class UserLoginController {
@RequestMapping(“/userLogin”)
public ModelAndView userLogin(HttpServletRequest request){
ModelAndView mv=new ModelAndView();
User user=new User();
user.setUserName(“xxx”);
user.setUserPwd(“123456”);
request.getSession().setAttribute(“user”, user);
mv.setViewName(“success”);
return mv;
}
@RequestMapping(“/addUser”)
public ModelAndView addUser(){
System.out.println(“ 增加用户记录。。。”);
ModelAndView mv=new ModelAndView();
mv.setViewName(“success”);
return mv;
}
@RequestMapping(“/delUser”)
public ModelAndView delUser(){
ModelAndView mv=new ModelAndView();
mv.setViewName(“success”);
return mv;
}
@RequestMapping(“/updateUser”)
public ModelAndView updateUser(){
ModelAndView mv=new ModelAndView();
mv.setViewName(“success”);
return mv;
}
}
拦截器 xml 配置
<!– 拦挡所有申请 –>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path=”/**” />
<bean class=”com.xxx.interceptors.LoginInterceptor” />
</mvc:interceptor>
</mvc:interceptors>