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















 

posted @ 2018-02-08 09:44  yuerspring  阅读(202)  评论(0编辑  收藏  举报