以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面试常见问题,请记得关注本网站噢。
推荐阅读: