springmvc拦截get请求怎么实现?

TheDisguiser 2020-07-08 17:27:50 java常见问答 8948

以web应用来说,springmvc可以说是其中的佼佼者了,小伙伴们知道springmvc中这么拦截get请求吗?下面小编就带你了解了解。

一、DispatcherServlet

SpringMVC都具有统一的入口DispatcherServlet,它所有的请求都会通过DispatcherServlet来实现。

DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依照一种规则分发到目标Controller来处理。 所以我们需要在web.xml中加入以下配置:

<!-- 初始化 DispatcherServlet时,该框架在 web应用程序WEB-INF目录中寻找一个名为[servlet-名称]-servlet.xml的文件,  
         并在那里定义相关的Beans,重写在全局中定义的任何Beans -->  
   <servlet>  
     <servlet-name>springMybatis</servlet-name>  
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
     <load-on-startup>1</load-on-startup>  
   </servlet> <
servlet - mapping >
    <servlet-name>springMybatis</servlet-name> <
    !--所有的的请求, 都会被DispatcherServlet处理-- >
    <url-pattern>/</url-pattern> <
    /servlet-mapping>

二、自定义拦截器

SpringMVC中拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,

postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。所以如果要想实现自己的权限管理逻辑,就需要继承HandlerInterceptorAdapter并重写其三个方法。

首先我们在springmvc.xml中加入自己定义的拦截器

<!--配置拦截器, 多个拦截器,顺序执行 -->  
<mvc:interceptors>    
    <mvc:interceptor>    
        <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->  
        <mvc:mapping path="/" />  
        <mvc:mapping path="/user/**" />  
        <mvc:mapping path="/test/**" />  
        <bean class="com.alibaba.interceptor.CommonInterceptor"></bean>    
    </mvc:interceptor>  
    <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> 
    
    <!--也可以直接这样写就可以不拦截静态资源-->
    
    <mvc:interceptor>
            <!-- Login interceptor -->
            <mvc:mapping path="/**" />
            <mvc:exclude-mapping path="/"/>
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/js/**"/>
            <mvc:exclude-mapping path="/jq/**"/>
            <mvc:exclude-mapping path="/css/**"/>
            <mvc:exclude-mapping path="/images/**"/>
            <bean class="com.csl.mmscm.handler.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

这里的拦截逻辑是“在未登录前,任何访问url都跳转到login页面;登录成功后跳转至先前的url”,代码如下:

/** 
 *  
 */
package com.alibaba.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.alibaba.util.RequestUtil;
/** 
 * @author tfj 
 *  
 */
public class CommonInterceptor extends HandlerInterceptorAdapter
{
    private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);
    public static final String LAST_PAGE = "com.alibaba.lastPage";
    /* 
     * 利用正则映射到需要拦截的路径     
      
    private String mappingURL; 
     
    public void setMappingURL(String mappingURL) {     
               this.mappingURL = mappingURL;     
    }    
  */
    /**  
     * 在业务处理器处理请求之前被调用  
     * 如果返回false  
     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
     * 如果返回true  
     *    执行下一个拦截器,直到所有的拦截器都执行完毕  
     *    再执行被拦截的Controller  
     *    然后进入拦截器链,  
     *    从最后一个拦截器往回执行所有的postHandle()  
     *    接着再从最后一个拦截器往回执行所有的afterCompletion()  
     */
    @Override
    public boolean preHandle(HttpServletRequest request
        , HttpServletResponse response, Object handler) throws Exception
    {
        if ("GET".equalsIgnoreCase(request.getMethod()))
        {
            RequestUtil.saveRequest();
        }
        log.info("==============执行顺序: 1、preHandle================");
        String requestUri = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = requestUri.substring(contextPath.length());
        log.info("requestUri:" + requestUri);
        log.info("contextPath:" + contextPath);
        log.info("url:" + url);
        String username = (String) request.getSession()
            .getAttribute("user");
        if (username == null)
        {
            log.info("Interceptor:跳转到login页面!");
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
                .forward(request, response);
            return false;
        }
        else
            return true;
    }
    /** 
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
     * 可在modelAndView中加入数据,比如当前时间 
     */
    @Override
    public void postHandle(HttpServletRequest request
        , HttpServletResponse response, Object handler
        , ModelAndView modelAndView) throws Exception
    {
        log.info("==============执行顺序: 2、postHandle================");
        if (modelAndView != null)
        { //加入当前时间    
            modelAndView.addObject("var", "测试postHandle");
        }
    }
    /**  
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
     *   
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
     */
    @Override
    public void afterCompletion(HttpServletRequest request
        , HttpServletResponse response, Object handler, Exception ex)
    throws Exception
    {
        log.info("==============执行顺序: 3、afterCompletion================");
    }
}

以上就是本篇文章的所有内容了,还想了解更多java面试常见问题,请记得关注本网站噢。

推荐阅读:

springmvc常用注解有哪些?常用注解介绍

springmvc是什么?什么是springmvc?

Spring和SpringMVC的区别是什么?各自的优缺点是什么?