SpringMVC拦截器
案例驱动:上京东的时候,能否直接看到购物车中的内容?必须要先登录,才能看见!
只有用户登录的时候才能进行数据查看!【老师要查看班级的考试成绩】
1.创建一个拦截器 实现 implementsHandlerInterceptor
package com.bjsxt.interceptor;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;
/** * @ClassName:MyInterceptor * @Description:要实现HandlerInterceptor * @authormengqx * @date 2017年7月14日 */
public class MyInterceptor implements HandlerInterceptor { /** * 执行完postHandle,才会执行afterCompletion。 */ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("afterCompletion"); }
/** * 如果preHandle返回true,则会执行postHandle方法。 */ @Override public void postHandle(HttpServletRequest arg0, HttpServletResponsearg1, Object arg2, ModelAndViewarg3) throws Exception { System.out.println("postHandle");
} /** * preHandle 请求到达controller之前。 */ @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("preHandle"); // return false;拦截 true:不拦截,放行。只能返回true的时候,才会去执行后面的方法。 return fasle; } } |
2.在springmvc核心配置文件中添加配置!
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截的路径 --> <mvc:mappingpath="/show"/> <!-- 配置一个拦截器配置一个class --> <beanclass="com.bjsxt.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> |
3.单拦截器执行的顺序
3.1 先去执行preHandle,然后执行Controller,接着postHandle,再去view返回视图,最后afterCompletion。
注:preHandle 第三个参数Object args :args 表示要拦截的方法名。
public java.lang.String com.bjsxt.controller.UserController.show();
afterCompletion 第四个参数 Exception exception :exception表示异常对象!
4.去实现要先登录,才能查看!
Login.jsp
<formaction="login"method="post"> <inputtype="text"name="name"/><br> <inputtype="password"name="pwd"/><br> <inputtype="submit"value="login"/><br> </form> |
login@controller
@RequestMapping("login") public String login(HttpSessionsession, String name,Stringpwd){ System.out.println(name); System.out.println(pwd); // 将用户名存到session中 if ("admin".equals(name)) { session.setAttribute("username",name); return"listScore"; }else{ return"login"; } }
实际开发中应该存储User 对象 @RequestMapping("login") public String login(HttpSessionsession, User user){ // 将用户名存到session中 if ("admin".equals(user.getName())) { // 正常来说登录成功之后,应该存储User对象! session.setAttribute("username",user); return"listScore"; }else{ return"login"; } }
|
look@Controller
@RequestMapping("look") @ResponseBody public List<Scores> look(){ // 用来模拟数据库存储学生成绩 List<Scores> list = new ArrayList<>(); list.add(new Scores(1,"高圆圆", 100)); list.add(new Scores(2,"唐嫣", 99)); list.add(new Scores(3,"宋慧乔", 99)); list.add(new Scores(4,"马蓉", 38)); list.add(new Scores(5,"范爷", 100)); list.add(new Scores(6,"陈乔恩", 100)); returnlist; } |
拦截器
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Objectarg2) throws Exception { System.out.println("preHandle"); // 先取得值!如果登录了,则会有值,并且还要将值存储到session中。从session中取得值。 // 取得到url的地址相当于取得到 http://localhost:8080/08springmvc/login地址 String url = request.getRequestURI(); System.out.println(url); if (url.endsWith("login")) { return true; } // 取得session中的值。如果没有则不放行! String username = (String)request.getSession().getAttribute("username"); if (username !=null) { return true; } // 如果全部都是false,则继续登录 request.getRequestDispatcher("login.jsp").forward(request,response); return false; } |
Springmvc核心配置文件
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截的路径 /**表示拦截所有请求 拦截的时候,path一定要有 /--> <mvc:mappingpath="/**"/> <!-- 配置一个拦截器配置一个class --> <beanclass="com.bjsxt.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> |
可以在springmvc核心配置文件中设置不被拦截的路径。
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截的路径 /**表示拦截所有请求 拦截的时候,path一定要有 /--> <mvc:mappingpath="/**"/> <!-- 哪些路径不被拦截,通常我们的登录,首页时不被拦截的 --> <mvc:exclude-mappingpath="/login"/> <!-- 配置一个拦截器配置一个class --> <beanclass="com.bjsxt.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> 注意:bean标签应该放在mvc标签的下面! |
5多个拦截器执行的顺序
执行顺序:跟谁有关系!配置拦截器的顺序有关系!
1-pre,2-pre @controller 2-post ,1-post view2-after,1-after