SpringMVC的拦截器
- 针对请求和响应进行的额外的处理,在请求和响应的过程中添加预处理,后处理和最终处理。
- 拦截器执行的时机
preHandle():
在请求被处理之前进行处理,预处理
postHandle():
在请求被处理之后,但结果还没有渲染进行操作,可以改变响应的结果,后处理
afterCompletion:
所有的请求响应结束后执行善后工作,清理对象,关闭资源 - 拦截器实现的两种方式 继承
HandlerInterceptorAdapter
的父类或实现HandlerInterceptor
接口,一定要去实现接口。 - 拦截器实现的步骤
1)改造登陆方式,在session中存储用户的信息,用于进行权限验证
2)开发拦截器的功能,实现HandlerInterceptor
接口,重写preHandle()
方法
3)在springmvc.xml文件中注册拦截器
springmvc.xml
报扫描
<context:component-scan base-package="com.hjm"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--注册拦截器-->
<mvc:interceptors>
<!--可以配置多个拦截器,类似过滤器filter-->
<mvc:interceptor>
<!--拦截所有的请求-->
<mvc:mapping path="/**"/>
<!--设置放行的请求-->
<mvc:exclude-mapping path="/showLogin"/>
<mvc:exclude-mapping path="/login"/>
<!--实现类-->
<bean class="com.hjm.Interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
实现接口的拦截器bean
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getSession().getAttribute("users") == null) {
// 此时没有登陆,此时到会到页面,给出提示
request.setAttribute("msg", "还未登陆,请先登陆");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;
}
return true; // 放行
}
}
控制器对象(请求处理方法)
@Controller
public class MyController {
@RequestMapping("/one")
public String one(){
return "new";
}
@RequestMapping("/showLogin")
public String showLogin(){
System.out.println("访问login.jsp");
return "login";
}
@RequestMapping("/login")
public String login(String name, String pwd, HttpServletRequest request){
if ("张三".equals(name) && "123".equals(pwd)) {
request.getSession().setAttribute("users", name);
return "new";
} else {
request.setAttribute("msg", "用户名或密码错误");
return "login";
}
}
}