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