spring拦截器
1、 拦截器概念和struts2一致。
2、 实现拦截器
实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor { // 请求处理的方法之前执行 // 如果返回true,执行下一个拦截器,返回返回false,不执行下一个拦截器 @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception { System.out.println("--------------处理前--------------"); return true; } // 请求处理的方法之后执行 @Override public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object obj, ModelAndView view) throws Exception { System.out.println("--------------处理后--------------"); } // DispatcherServlet处理后执行--清理工作 @Override public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object obj, Exception ex) throws Exception { } }
配置拦截器
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- /**包括路径及其子路径 如果是/admin/*-拦截的是/admin/add,/admin/list...但是/admin/add/user不被拦截 如果是/admin/**-拦截的是/admin路径及其子路径 --> <mvc:mapping path="/**"/> <!-- 对应的拦截器 --> <bean class="com.yxxy.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
3、 如果被拦截——能否到达指定页面?
使用HttpServlertRquest或者HttpServletResponse可以实现转发或者重定向
// 请求处理的方法之前执行 // 如果返回true,执行下一个拦截器,返回返回false,不执行下一个拦截器 @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception { System.out.println("--------------处理前--------------"); // req.getRequestDispatcher("/index.jsp").forward(req, resp); resp.sendRedirect(req.getContextPath() + "/index.jsp"); return false; }
4、 拦截器应用——登录拦截器
配置文件
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- /**包括路径及其子路径 如果是/admin/*-拦截的是/admin/add,/admin/list...但是/admin/add/user不被拦截 如果是/admin/**-拦截的是/admin路径及其子路径 --> <mvc:mapping path="/**"/> <!-- 对应的拦截器 --> <bean class="com.yxxy.interceptor.LoginInterceptor"> <property name="path"> <list> <value>login.do</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>
拦截器
public class LoginInterceptor implements HandlerInterceptor { // 允许哪些url不被拦截,哪些需要被拦截 private List<String> path; // 请求处理的方法之前执行 // 如果返回true,执行下一个拦截器,返回返回false,不执行下一个拦截器 @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception { // 判断session中是否有对象 Object user = req.getSession().getAttribute("user"); if(user != null) return true; // 判断url是否是登录请求 String url = req.getRequestURI().toString(); for (String temp : path) { if(url.endsWith(temp)) { return true; } } req.getSession().setAttribute("error", "请先登录!"); resp.sendRedirect(req.getContextPath() + "/login.jsp"); return false; } // 请求处理的方法之后执行 @Override public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object obj, ModelAndView view) throws Exception { } // DispatcherServlet处理后执行--清理工作 @Override public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object obj, Exception ex) throws Exception { } public void setPath(List<String> path) { this.path = path; } }
Controller
@Controller public class UserController { @RequestMapping("/login") public String hello(User user, HttpSession sesison) { if("yxxy".equals(user.getName()) && "111".equals(user.getPwd())) { sesison.setAttribute("user", user); return "/index.jsp"; } sesison.setAttribute("error", "用户名或者密码错误!"); return "redirect:/login.jsp"; } @RequestMapping("/add") public String add() { System.out.println("-----------add-------------"); return "/add.jsp"; } }