zoukankan      html  css  js  c++  java
  • Spring 拦截器的使用

    一、Web.xml配置

    在Web.xml 配置Spring核心控制器DispatcherServlet接收所有请求

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    二、不拦截静态资源

       如果配置拦截类似于*.do格式的拦截规则,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问。

      拦截器的主要作用是是用于权限管理,拦截不合理的URL,所以不对静态资源进行拦截

      主要过滤方式有以下几种:

      方案一:使用<mvc:resources/> (mapping:请求,location:映射地址,注意必须是webapp根目录下的路径。)   

    spring配置文件:applicationContext-mvc.xml
    <
    mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/images/**" location="/img/"/> <mvc:resources mapping="/js/**" location="/js/"/>

      方案二:激活 Tomcat 的 defaultServlet 来处理静态资源

    web.xml
    <
    servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/js/*</url-pattern> <url-pattern>*.css</url-pattern> <url-pattern>/images/*</url-pattern> </servlet-mapping>

    三、编写拦截器

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。

    preHandle在业务处理器处理请求之前被调用。

    postHandle在业务处理器处理请求执行完成后,生成视图之前执行。

    afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。

    所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。

    package com.smallpig.web.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.smallpig.entity.User;
    
    public class Login extends HandlerInterceptorAdapter{
        private static final String[] IGNORE_URL = {"/login.jsp", "/regedit.jsp"};
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
            boolean flag = false;
            String url = request.getRequestURL().toString();
         //不拦截上面定义的路径
    for (String str : IGNORE_URL) { if (url.contains(str)) { flag = true; break; } } if (!flag) { User user = (User)request.getSession().getAttribute("users"); if (user != null)
             flag = true;
           else
             response.sendRedirect("/login.jsp");
             return false; }
    return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }

    四、配置拦截器

    在applicationContext-mvc.xml中加入自己定义的拦截器

    <!-- 拦截器 -->
    <mvc:interceptors>
         <mvc:interceptor>  
         <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
            <mvc:mapping path="/**" />
             <!-- 拦截器类 --> 
             <bean class="com.smallpig.web.interceptor.LoginInterceptor"></bean>
         </mvc:interceptor>
            <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
    </mvc:interceptors> 
  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/lcfd/p/5475414.html
Copyright © 2011-2022 走看看