zoukankan      html  css  js  c++  java
  • SpringMVC拦截器的使用详解

    SpringMVC拦截器的使用详解
    
    生活就是这么的悲剧 ,刚写完成的内容没有保存,结果Notepad++  crash 啦 ,我看到之后也crash 了 
    
    从头再写一遍,这版会简单很多 ,先写到这。获取个人信息成功,接着写拦截器.
    
    前IBM同事Vincent 做过 一个java web 和 mobile 的w3 授权的项目,我从每天的daily standup 中了解了一些关于w3 授权是一件很麻烦的事情。
    
    现在我们的一个项目也涉及到权限登录和角色分配的问题 。 
    
    sso 单点登录 
    usf 用户权限角色管理
    
    解释 :
    sso 单点登录是强制只有内容的同事才能登录系统
    usf 要求登录的用户是我们系统的注册用户 ,并且分配了适当的角色,所以我们可以是认为这是两重用户验证。
    
    usf 是为了跟项目业务相关的内容区分开后单独做的一个服务,对于面向微服务架构而言,这无疑是我们学习的特别好的案例。
    
    
    -----------------------------------上面谈到的是基本业务要求和要实现功能需要接入的基础服务 ------------------------------
    -----------------------------------下面我们要谈谈怎么实现这两个拦截器的配置以及登录用户session的管理 -------------------
    
    先说下spring mvc 的默认拦截器DispatcherServlet ,本拦截器一般是配置web.xml中的 
    
    <servlet>
            <servlet-name>selection</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>selection</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    	
    也就是说所有的web 请求都需要请过该servlet  处理 
    
    同时在我们的另外一个servlet-name.xml 中我们配置了 <mvc:default-servlet-handler/>   ,下面简单讲下该配置的作用 
    
    在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
    它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,
    才由DispatcherServlet继续处理。
    
    一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",
    则需要通过default-servlet-name属性显示指定:
    
    <mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />
    
    sso 单点登录 和 usf  登录都属于 spring mvc 的拦截器 
    
    
    sso  和 usf  都需要配置相应的依赖 jar  或是 mvn 文件  
    
    同时需要在xml 文件中显示的神明对他们的使用 ,并 最终配置到 web.xml 中 
    
    usf 的配置code  ,exclude-mapping  应该就是属于静态资源,将转由tomcat 等默认服务器的servlet 进行处理 
    
     <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <!--mvc:exclude-mapping path="/**"/-->
                <mvc:exclude-mapping path="/views/**"/>
                <mvc:exclude-mapping path="/static/**"/>
                <bean id="authManagerInterceptor"
                      class="com.sso.interceptor.AuthManagerInterceptor">
                    <!--  dev 开发环境请用以下value,这些个东西不是配置培训的,是识别usf 服务的标识   -->
                    <property name="appCode" value="usf"/>
                    <property name="appToken" value="xixc9kt8z7itk6y8az1n"/>
                </bean>
            </mvc:interceptor>
    
    
    class 当然就是默认对应的类 ,使用 usf 的服务获取数据,进行权限,角色判断 并返回对应数据结构 ,如果是一切都判断都没有异常 ,那么web 发出的请求将继续往
    controller 端进行,  相反,就会发出告警,提示 ,结束本次访问
    
    AuthManagerInterceptor 需要继承 类 HandlerInterceptorAdapter  or  HandlerInterceptor  并实现相同的方法 
    在这里我们要实现的方法是 
    
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    
    
    关于更多的其他拦截器方法的内容 请参考相关资料 
     
    
    sso  和  usf  服务可以单独 配置一个 文件中 。sso-usf-interceptor.xml  ,并将该文件注入到 servlet 中 
    
    project-name-servlet.xml  
    
    <import resource="classpath:/springconfig/sso-usf-interceptor.xml"/>
    
    servlet  文件在注入到 web xml 文件中 
    
      <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:project-name-servlet.xml  </param-value>
        </context-param>
    
    从而完成整个拦截器的配置 
    
    
    --------------------------------------------------------------------------------
    因为usf 降到的用户角色和权限的内容 ,自然就少不了session 相关话题的讨论 
    
    
    在授权文件中,我们把得到的用户信息送到一个实体数据中 ,并通过HttpServletRequest 塞入getSession 中 ,作为全局变量使用 
    
    request.getSession().setAttribute(AuthConstants_key, 实体数据);
    
    从而在下次发起获得登录用户信息展示在页面 或条用其他接口时就可以通过 HttpSession session  获取该信息了 ,不用再次对数据库发起信息请求
    
    session.getAttribute(AuthConstants_key);
    
    
    --------------------------------------------------------------------------------------
    done
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     

  • 相关阅读:
    Flutter-仿ios底部彈出框
    Flutter-SingleChildScrollView
    stm32之IIC通信协议
    docker swarm搭建tidb踩坑日记
    剑指offer-机器人的运动范围
    beego跨域请求配置
    SQLAlchemy并发写入引发的思考
    关于docker线上部署时间问题
    设计模式
    leetcode刷题笔记258 各位相加
  • 原文地址:https://www.cnblogs.com/TendToBigData/p/10501197.html
Copyright © 2011-2022 走看看