比较拦截器和过滤器的区别。 拦截器可配置多个,可定义拦截前中后执行的方法,可以调用业务组件代码。
拦截器使用更加灵活,推荐使用拦截器。
第一步,新建一个拦截器类
public class LoginInterceptor implements HandlerInterceptor{ /** * 调用前执行此方法。 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //获取请求URL String uri = request.getRequestURI(); //URL:login.jsp是公开的;这个demo是除了login.jsp是可以公开访问的,其它的URL都进行拦截控制 if(uri.indexOf("login")>=0){ return true; } //获取session HttpSession session = request.getSession(); String username = (String)session.getAttribute("username"); if(username != null){ return true; } //不符合条件的,跳转到登录界面 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub System.out.println("==================>>执行postHandle"); } /** * handler 执行完成后调用此方法。 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub System.out.println("==================>>执行afterCompletion"); } }
配置拦截器
<!-- 5拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.soecode.lyf.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
第二步 编写登录控制器
@Controller public class LoginController { @RequestMapping(value="/login",method = RequestMethod.POST) public String login(HttpSession session,String username,String password,Model model){ session.setAttribute("username", username); model.addAttribute("username", username); return "redirect:book/list"; } @RequestMapping(value="/logout",method = RequestMethod.POST) public String logout(HttpSession session){ session.invalidate(); return "redirect:/WEB-INF/jsp/login.jsp"; } }
第三步 测试。
请求书籍预定页面,跳转到登录界面。
输入账号后,提交登录,成功进入页面