SpringMVC(四)—拦截器

来源:互联网 发布:led灯编辑软件 编辑:程序博客网 时间:2024/06/14 01:11

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <display-name>ssm0523</display-name>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list>  <!-- springmvc前端控制器 -->  <servlet>    <servlet-name>springMvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath:springmvc.xml</param-value>    </init-param>    <!-- 在tomcat启动的时候就加载这个servlet -->    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>springMvc</servlet-name>    <url-pattern>*.action</url-pattern>  </servlet-mapping><servlet-mapping>      <servlet-name>default</servlet-name>      <url-pattern>*.gif</url-pattern></servlet-mapping><servlet-mapping>    <servlet-name>default</servlet-name>     <url-pattern>*.jpg</url-pattern></servlet-mapping><servlet-mapping>    <servlet-name>default</servlet-name>     <url-pattern>*.png</url-pattern></servlet-mapping><servlet-mapping>     <servlet-name>default</servlet-name>     <url-pattern>*.js</url-pattern></servlet-mapping><servlet-mapping>      <servlet-name>default</servlet-name>      <url-pattern>*.html</url-pattern></servlet-mapping>  <!-- 配置Post请求乱码 -->  <filter>        <filter-name>CharacterEncodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>utf-8</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>CharacterEncodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping></web-app>

springmvc.xml

在springmvc.xml中需要配置拦截器

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:mvc="http://www.springframework.org/schema/mvc"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">        <!-- 配置自动扫描的包 -->        <context:component-scan base-package="com.mq"></context:component-scan>        <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">            <property name = "prefix" value="/"></property>            <property name = "suffix" value = ".jsp"></property>        </bean>     <!--如果有多个拦截器,则按顺序执行 -->    <mvc:interceptors>    <mvc:interceptor>      <!--表示要拦截的路径,在这里只拦截 /haha/helloworld.action这个请求 -->    <mvc:mapping path="/haha/helloworld.action"/>        <bean class="com.mq.service.MyInterceptor1"></bean>    </mvc:interceptor>    </mvc:interceptors> </beans>

拦截器的定义

public class MyInterceptor1 implements HandlerInterceptor {    /**在处理请求之前调用。该方法的返回值是boolean类型,若返回值为true,     * 则继续调用后面的拦截器和目标方法,若返回为false,则不会调用后面的拦截器和目标方法,表示请求结束     * 这里可以加入登录校验、权限拦截等*/    @Override    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,            Object arg2) throws Exception {        System.out.println("MyInterceptor1--"+"preHandle");        return true;    }    /**     * 调用了Controller中定义的方法之后,但在DispatcherServlet 处理视图返回渲染结果之前被调用。     * 这里可在返回用户前对模型数据进行加工处理     */    @Override    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,            Object arg2, ModelAndView arg3) throws Exception {        System.out.println("MyInterceptor1--"+"postHandle");    }    /**     * 渲染视图之后调用,可以在这里释放资源。     * 这里可得到执行controller时的异常信息。     */    @Override    public void afterCompletion(HttpServletRequest arg0,            HttpServletResponse arg1, Object arg2, Exception arg3)            throws Exception {        System.out.println("MyInterceptor1--"+"afterCompletion");    }}

自定义拦截器需要实现HandlerInterceptor 接口,重写三个方法。并且在springmvc.xml中进行配置。
拦截器执行时,先执行preHandle(…)方法,再执行postHandle(…)方法,最后执行afterCompletion(…)方法。
preHandle(…)只有返回true的时候,才会调用后面的拦截器和方法。如果返回false,表示请求结束。

定义多个拦截器方法的执行顺序

拦截器的执行顺序和配置文件中的定义的先后顺序有关

preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用

postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用

拦截器应用

登陆校验:当用户访问服务器的资源时,先判断用户是否已经登陆。如果已经登陆,那么放行,可以访问。如果没有登录,那么跳转到登陆界面。如果用户访问的是登录页面,也需要放行。

处理流程:

  1. 用户登录成功时,将登陆信息放入session中。
  2. 在拦截器中,判断session是否为空,如果为空,说明没有登录,跳转到登录页面。如果不为空,说明已经登陆,放行。
  3. 如果访问的页面本身就是登录页面,直接放行。

登陆校验拦截器

Public class LoginInterceptor implements HandlerInterceptor{    @Override    Public boolean preHandle(HttpServletRequest request,            HttpServletResponse response, Object handler) throws Exception {        //如果是登录页面则放行        if(request.getRequestURI().indexOf("login.action")>=0){            return true;        }        HttpSession session = request.getSession();        //判断session是否为空,不为空则放行。        if(session.getAttribute("loginUser")!=null){            return true;        }        //用户没有登录则跳转到登录页面        request.getRequestDispatcher("/login.jsp").forward(request, response);        return false;    }}

登陆校验的控制器

    //userid:用户账号,pwd:密码    @RequestMapping("/loginsubmit")    public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{        //向session记录用户身份信息                User user=new User();                user.setId(userid);                user.setPwd(pwd);        session.setAttribute("loginUser", pwd);        return "redirect:success";    }

对于登陆页面的判断,也可以直接放拦截器中进行判断。

    <mvc:interceptors>    <mvc:interceptor>    <!--表示要拦截的路径,在这里只拦截 /haha/helloworld.action这个请求 -->    <mvc:mapping path="/haha/helloworld.action"/>    <!-- 需排除拦截的地址 -->     <mvc:exclude-mapping path="/login.htm"/>          <bean class="com.mq.service.MyInterceptor1"></bean>    </mvc:interceptor>    </mvc:interceptors>