原创
2017年10月24日 21:31:52
对于springmvc,有两种方式配置拦截器。
一是实现HandlerInterceptor接口,如
- public class MyInterceptor1 implements HandlerInterceptor {
- //该方法在action执行前执行,可以实现对数据的预处理,
- // 比如:编码、安全控制等。如果方法返回true,则继续执行action。
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
- Exception {
- System.out.println("MyInterceptor1 action之前执行!!!");
- return true; //继续执行action
- }
- 该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView
- modelAndView) throws Exception {
- System.out.println("MyInterceptor1 action执行之后,生成视图之前执行!!");
- }
- //最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。
- //因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("MyInterceptor1 最后执行!!!一般用于释放资源!!");
- }
- }
二是extendsHandlerInterceptorAdapter类,如
- public class MyInterceptor2 extends HandlerInterceptorAdapter{
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
- Exception {
- System.out.println("MyInterceptor2.preHandle()");
- return true; //继续执行action
- }
- }
对于控制器url的拦截,分为如下3种情况:
1. 拦截所有的url
- <mvc:interceptor>
- <mvc:mapping path="/**"/>
- <!--这样配置,将拦截所有springmvc的url-->
- <bean class="interceptor.MyInterceptor1">
- </bean>
- </mvc:interceptor>
2. 对于所有的url,指定url放行
- <!--配置拦截器-->
- <!--这样配置,将拦截访问springmvc指定路径下的url-->
- <mvc:interceptor>
- <mvc:mapping path="/emp/*"/>
- <bean class="interceptor.MyInterceptor2"></bean>
- </mvc:interceptor>
- </mvc:interceptors>
3. 对于所有的url,exceptUrls外放行
比如我们常见的LoginInterceptor
方法:在拦截器里注入一个属性List<String> exceptUrls
- <!--配置拦截器 拦截除了exceptUrls内的所有请求-->
- <mvc:interceptors>
- <mvc:interceptor>
- <mvc:mapping path="/**"/>
- <bean class="common.interceptor.LoginInterceptor">
- <property name="exceptUrls">
- <list>
- <value>/user/login</value>
- <value>/user/register</value>
- </list>
- </property>
- </bean>
- </mvc:interceptor>
- </mvc:interceptors>
LoginInterceptor类
- public class LoginInterceptor extends HandlerInterceptorAdapter {
- private List<String> exceptUrls;
- public List<String> getExceptUrls() {
- return exceptUrls;
- }
- public void setExceptUrls(List<String> exceptUrls) {
- this.exceptUrls = exceptUrls;
- }
- //执行action之前来执行
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
- Exception {
- String requestUri = request.getRequestURI();
- if(requestUri.startsWith(request.getContextPath())){
- requestUri = requestUri.substring(request.getContextPath().length(), requestUri.length());
- }
- //系统根目录
- if (StringUtils.equals("/",requestUri)) {
- return true;
- }
- //放行exceptUrls中配置的url
- for (String url:exceptUrls
- ) {
- if(url.endsWith("/**")){
- if (requestUri.startsWith(url.substring(0, url.length() - 3))) {
- return true;
- }
- } else if (requestUri.startsWith(url)) {
- return true;
- }
- }
- //其他需要登录后才能进行访问的url
- String sessionid = request.getSession().getId();
- UserSessionStatus status = SessionManager.getStatus(sessionid);
- //如果没有登录
- if(null==status){
- //返回到登录页面
- return false;
- }else{
- return true;
- }
- }
- }