加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

与开发者超时分享用户数据

发布时间:2021-02-20 15:07:05 所属栏目:动态 来源:互联网
导读:在这段配置中: 指定 JDBCRealm。 指定数据库驱动。 指定数据库连接地址。 指定数据库连接用户名/密码。 指定用户表名称;用户名的字段名以及密码字段名。 指定角色表名称;以及角色字段名。 配置完成后,再次登录测试,此时的登录数据就是来自数据库的数据了

在这段配置中:

  • 指定 JDBCRealm。
  • 指定数据库驱动。
  • 指定数据库连接地址。
  • 指定数据库连接用户名/密码。
  • 指定用户表名称;用户名的字段名以及密码字段名。
  • 指定角色表名称;以及角色字段名。

配置完成后,再次登录测试,此时的登录数据就是来自数据库的数据了。

3.优化

前面的 HelloServlet,我们是在代码中手动配置的,要是每个 Servlet 都这样配置,这要搞到猴年马月了~

所以我们对此可以在 web.xml 中进行手动配置。

首先我们创建一个 AdminServlet 进行测试,如下:


 

请求到达后,先提取出用户名和密码,然后调用 req.login 方法进行登录,如果登录失败,则跳转到登录页面。

登录完成后,通过获取登录用户信息以及判断登录用户角色,来确保用户是否登录成功。

如果登录成功,就跳转到项目应用首页,否则就跳转到登录页面。

接下来定义 HelloServlet:


 

HttpServletRequest 是一个接口,而 RequestFacade 则是一个正儿八经的 class。

HttpServletRequest 是 Servlet 规范中定义的 ServletRequest,这相当于是标准的 Request;但是在 Tomcat 中的 Request 则是 Tomcat 自己自定义的 Request,自定义的 Request 实现了 HttpServletRequest 接口并且还定义了很多自己的方法,这些方法还是 public 的,如果直接使用 Tomcat 自定义的 Request,开发者只需要向下转型就能调用这些 Tomcat 内部方法,这是有问题的,所以又用 RequestFacade 封装了一下,以至于我们实际上用到的就是 RequestFacade 对象。

那么毫无疑问,HttpServletRequest#login 方法具体实现就是在 Tomcat 的 Request#login 方法中完成的。经过源码追踪,我们发现,登录的数据源是由 Tomcat 中的 Realm 提供的,注意这个 Realm 不是 Shiro 中的 Realm。

Tomcat 中提供了 6 种 Realm,可以支持与各种数据源的对接:

  • JDBCRealm:很明显,这个 Realm 可以对接到数据库中的用户信息。
  • DataSourceRealm:它通过一个 JNDI 命名的 JDBC 数据源在关系型数据库中查找用户。
  • JNDIRealm:通过一个 JNDI 提供者1在 LDAP 目录服务器中查找用户。
  • UserDatabaseRealm:这个数据源在 Tomcat 的配置文件中 conf/tomcat-users.xml。
  • MemoryRealm:这个数据源是在内存中,内存中的数据也是从 conf/tomcat-users.xml 配置文件中加载的。
  • JAASRealm:JAAS 架构来实现对用户身份的验证。

如果这些 Realm 无法满足需求,当然我们也可以自定义 Realm,只不过一般我们不这样做,为啥?因为这这种登录方式用的太少了!今天这篇文章纯粹是和小伙伴们开开眼界。

如果自定义 Realm 的话,我们只需要实现 org.apache.catalina.Realm 接口,然后将编译好的 jar 放到 $CATALINA_HOME/lib 下即可,具体的配置则和下面介绍的一致。

接下来我和大家介绍两种配置方式,一个是 UserDatabaseRealm,另一个是 JDBCRealm。

2.1 基于配置文件登录

我们先来定义一个 LoginServlet:



(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!