拦截器可以在控制层Controller方法前后执行对应的操作,以实现登录拦截,权限控制等功能。
1)编写拦截器,实现HandlerInterceptor接口;
//控制层拦截器实现 public class LoginInterceptor implements HandlerInterceptor{ /** *请求到达控制层之前执行 返回true,则放行,返回false,则拦截 *handler:请求的对象,如果是控制层请求,则为HandleMethod对象,可通过该对象获取控制层方法信息 * **/ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("进入拦截器"); //判定handler是否为控制层方法 if (handler instanceof HandlerMethod){ HandlerMethod handlerMethod= (HandlerMethod) handler; //获取方法名 String name=handlerMethod.getMethod().getName(); System.out.println("方法名:"+name); Class<?> beanType = handlerMethod.getBeanType(); System.out.println("控制层类名:"+beanType.getName()); } //去session中获取登录标识 HttpSession session = request.getSession(); User user= (User) session.getAttribute("user"); if (user!=null){//用户已登录,放行 return true; } //如果没有登录,则跳转到登录页面 response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; } /** * 控制层方法调用之后,视图解析器解析之前执行 * modelAndView:控制层方法返回的模型视图对象 * **/ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("进入拦截器postHandle方法"); if (modelAndView!=null){ System.out.println("需要跳转的页面:"+modelAndView.getViewName()); System.out.println("返回的Model数据:"+modelAndView.getModel()); System.out.println("返回的ModelMap数据:"+modelAndView.getModelMap()); modelAndView.addObject("postHandleInfo","postHandle中添加的值"); } } /** * 在视图解析器之后执行,通常做一些清理工作 * **/ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("进入afterCompletion方法"); } }
2)Springmvc的配置文件中配置拦截器,并指定拦截的请求和放行的请求;
<!-- 配置拦截器--> <mvc:interceptors> <mvc:interceptor> <!-- 指定要拦截的请求 /* ==>/hello,/user /** ==>/user/hello :表示所有的请求--> <mvc:mapping path="/**"/> <!-- 不拦截的请求--> <mvc:exclude-mapping path="/login"/> <!-- 拦截器类--> <bean id="loginInterceptor" class="interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
3)写一个控制层文件来传输数据;
@Controller public class IndexController { @RequestMapping("/login") public String login(String name, String password, HttpSession session){ System.out.println("获取到前台数据:name="+name+",password="+password); //todo 查询数据库,验证是否存在用户数据 User user=new User(); user.setName("科比"); if (user==null){//如果用户不存在,跳回登录页面 return "login.jsp"; } //登录成功,将用户信息放入session session.setAttribute("user",user); return "index.jsp"; } }
4)再写一个用户登录的页面和按钮;
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>用户登录</title> </head> <body> <form action="${pageContext.request.contextPath}/login"> 用户名:<input type="text" name="name"/><br/> 密码: <input type="password" name="password"/><br/> <input type="submit" value="登录"/> </form> </body> </html>