zoukankan      html  css  js  c++  java
  • springmvc3 拦截器,过滤ajax请求,判断用户登录,拦截规则设置

    web.xml设置:(/拦截所有请求)

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
     
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <!-- 所有的的请求,都会被DispatcherServlet处理 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping> 

    spring MVC 配置文件拦截规则设置(没有匹配的将不会拦截):

    <!--配置拦截器, 多个拦截器,顺序执行 -->  
        <mvc:interceptors>    
            <mvc:interceptor>    
                <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->  
                <mvc:mapping path="/" />  
                <mvc:mapping path="/account/**" />  <!-- 拦截用户路径 -->
                <mvc:mapping path="/image/**" />  <!-- 拦截图片管理路径 -->
                <mvc:mapping path="/upload/**" />  <!-- 拦截图片下载路径 -->
                <bean class="com.wzw.interceptor.LoginInterceptor"></bean>    <!-- 自定义拦截器路径 -->
            </mvc:interceptor>  
            <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->  
        </mvc:interceptors>  

    拦截器代码:

    package com.wzw.interceptor;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    import com.wzw.entity.Account;
    public class LoginInterceptor extends HandlerInterceptorAdapter{
        /**  
         * 在业务处理器处理请求之前被调用  
         * 如果返回false  
         *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
         * 如果返回true  
         *    执行下一个拦截器,直到所有的拦截器都执行完毕  
         *    再执行被拦截的Controller  
         *    然后进入拦截器链,  
         *    从最后一个拦截器往回执行所有的postHandle()  
         *    接着再从最后一个拦截器往回执行所有的afterCompletion()  
         */    
        @Override    
        public boolean preHandle(HttpServletRequest request,    
                HttpServletResponse response, Object handler) throws Exception { 
            String requestUri = request.getRequestURI(); //请求完整路径,可用于登陆后跳转
            String contextPath = request.getContextPath();  //项目下完整路径
            String url = requestUri.substring(contextPath.length()); //请求页面
            System.out.print("发生拦截...");
            System.out.println("来自:"+requestUri+"的请求");
            Account user =  (Account)request.getSession().getAttribute("account");   
            if(user == null){  //判断用户是否存在,不存在返回登录界面,继续拦截,存在通过拦截,放行到访问页面
                /**
                 * 拦截目录下请求,是否为ajax请求
                 *   是:无需登录,直接访问(因为我是用于首页的ajax登录请求)
                 *   否:跳转至登录界面
                 */
                if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ 
                    //如果是ajax请求响应头会有,x-requested-with  
                    System.out.print("发生ajax请求...");
                    return true;
                    //response.setHeader("sessionstatus", "timeout");//在响应头设置session状态  
                }else{
                    System.out.print("返回主页...");
                    request.getRequestDispatcher("/index.do").forward(request, response);//转发到登录界面 
                }  
                return false;  
            }else  
                return true;     
        }    
        
        /** 
         * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
         * 可在modelAndView中加入数据,比如当前时间 
         */  
        @Override    
        public void postHandle(HttpServletRequest request,    
                HttpServletResponse response, Object handler,    
                ModelAndView modelAndView) throws Exception {     
            if(modelAndView != null){  //加入当前时间    
                modelAndView.addObject("var", "测试postHandle"); 
            }    
        }    
        
        /**  
         * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
         *   
         * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
         */    
        @Override    
        public void afterCompletion(HttpServletRequest request,    
                HttpServletResponse response, Object handler, Exception ex)    
                throws Exception {    
        }    
    }
  • 相关阅读:
    【转】linux常用命令
    【转】C++三大特性
    插入排序
    shixi
    【转】TCP协议
    【转】排序算法稳定性
    面筋BD
    斐波那契数列
    【面试题】D
    【学习笔记】OI模板整理
  • 原文地址:https://www.cnblogs.com/v-weiwang/p/4795529.html
Copyright © 2011-2022 走看看