SpringMVC拦截器
作者:gqk
SpringMVC拦截器的使用:
SpringMVC 中的 Interceptor 拦截器的主要作用就是拦截用户的 url 请求,并在执行 handler 方法的前中后加入某些特殊请求,类似于 servlet 里面的过滤器.
定义一个类,实现HandlerInterceptor接口,并实现该接口的preHandle()、postHandle()、afterCompletion()三个方法
package com.gqk.interceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class HandlerInterceptor implements org.springframework.web.servlet.HandlerInterceptor { /** * 执行控制器之前执行 * 可以用作身份认证和授权 *return false 表示拦截不会放行 * return true 表示拦截放行 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("12332131232131231"); //判断session HttpSession session = request.getSession(); //从session中取出用户身份信息 String username = (String) session.getAttribute("username"); if(username != null){ //身份存在,放行 return true; } request.getRequestDispatcher("login.jsp").forward(request, response); return false; } //执行控制器之后但是没有返回modelAndView //可以在此统一指定视图 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("LoginInterceptor...postHandle"); } //彻底执行完控制器 可以统一异常处理,统一日志处理 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("LoginInterceptor...afterCompletion"); } }
在SpringMVC核心配置文件中注册自定义拦截器;
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/user/test1.action"></mvc:exclude-mapping> <bean class="com.gqk.interceptor.HandlerInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
控制器编写:
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/test1") public ModelAndView test1(@RequestParam("name") String name, @RequestParam("pwd") String pwd, @RequestParam(defaultValue = "110") int age, HttpSession session) { System.out.print("name====" + name); System.out.print("pwd====" + pwd); System.out.print("age====" + age); if ("admin".equals(name)&&"admin".equals(pwd)){ session.setAttribute("username",name); } ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("index"); modelAndView.addObject("username",name); return modelAndView; }
如果没有登录 除登录外,访问其它页面 就可以进入拦截器进行拦截
拦截器与过滤器的区别:
说到这里,可能大家脑海中有了一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但是也有区别,接下来我们就来说说他们的区别:
1)、过滤器是 servlet 规范中的一部分, 任何 java web 工程都可以使用。
拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
2)、过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp, html,css,image 或者 js 是不会进行拦截的。