eclipse写登录页⾯代码_写了这么多年代码,这样的登录⽅式
还是头⼀回见
Spring Security 系列还没搞完,最近还在研究。
有的时候我不禁想,如果从 Spring Security 诞⽣的第⼀天开始,我们就⼀直在追踪它,那么今天再去看它的源码⼀定很简单,因为我们了解到每⼀⾏代码的缘由。
然⽽事实上我们⼤部分⼈都是中途接触到它的,包括松哥⾃⼰。所以在阅读源码的时候,有时候会遇到⼀些不是那么容易理解的东西,并不是说这个有多难,只是我们不了解 N 年前的开发环境,因此也就不容易理解某⼀⾏代码出现的意义。
所以为了搞透彻这个框架,有时候我们还得去了解之前发⽣了什么。
这就跟学 Spring Boot ⼀样,很多⼩伙伴问要不要跳过 SSM ,我说不要,甚⾄还专门写了⼀篇⽂章(Spring Boot 要怎么学?要学哪些东西?要不要先学 SSM?),跳过了 SSM ,Spring Boot 中的很多东西就⽆法真正理解。
扯远了。。。
Spring Security 中对 HttpServletRequest 请求进⾏了封装,重写了 HttpServletRequest 中的⼏个和安全管理相关的⽅法,想要理解Spring Security 中的重写,就要先从 HttpServletRequest 开始看起。
有⼩伙伴可能会说,HttpServletRequest 能跟安全管理扯上什么关系?今天松哥就来和⼤家捋⼀捋,我们不讲 Spring Security,就来单纯讲讲 HttpServletRequest 中的安全管理⽅法。
1.HttpServletRequest
servlet和tomcat的关系在 HttpServletRequest 中,我们常⽤的⽅法如:
public String getHeader(String name);
public String getParameter(String name);
public ServletInputStream getInputStream()
...
这些常见的⽅法可能⼤家都有⽤过,还有⼀些不常见的,和安全相关的⽅法:
public String getRemoteUser();public boolean isUserInRole(String role);public java.security.Principal
getUserPrincipal();public boolean authenticate(HttpSe
前⾯三个⽅法,在之前的 Servlet 中就有,后⾯三个⽅法,则是从 Servlet3.0 开始新增加的⽅法。从⽅法名上就可以看出,这些都是和认证相关的⽅法,但是这些⽅法,我估计很多⼩伙伴都没⽤过,因为不太实⽤。
在 Spring Security 框架中,对这些⽅法进⾏了重写,进⽽带来了⼀些好玩并且⽅便的特性,这个松哥在后⾯的⽂章中再和⼤家分享。
要理解 Spring Security 中的封装,就得先来看看,不⽤框架,这些⽅法该怎么⽤!
2.实践出真知
我们创建⼀个普普通通的 Web 项⽬,不使⽤任何框架(后⾯的案例都基于此),然后在 doGet ⽅法中打印出 HttpServletRequest 的类
型,代码如下:
@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException { System.out.println("req 代码运⾏打印结果如下:
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 的配置⽂件中 l。
MemoryRealm:这个数据源是在内存中,内存中的数据也是从 l 配置⽂件中加载的。
JAASRealm:JAAS 架构来实现对⽤户⾝份的验证。
如果这些 Realm ⽆法满⾜需求,当然我们也可以⾃定义 Realm,只不过⼀般我们不这样做,为啥?因为这这种登录⽅式⽤的太少了!今天这篇⽂章纯粹是和⼩伙伴们开开眼界。
如果⾃定义 Realm 的话,我们只需要实现 org.apache.catalina.Realm 接⼝,然后将编译好的 jar 放到 $CATALINA_HOME/lib 下即
可,具体的配置则和下⾯介绍的⼀致。
接下来我和⼤家介绍两种配置⽅式,⼀个是 UserDatabaseRealm,另⼀个是 JDBCRealm。
2.1 基于配置⽂件登录
我们先来定义⼀个 LoginServlet:
@WebServlet(urlPatterns = "/login")public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServl 当请求到达后,先提取出⽤户名和密码,然后调⽤ req.login ⽅法进⾏登录,如果登录失败,则跳转到登录页⾯。
登录完成后,通过获取登录⽤户信息以及判断登录⽤户⾓⾊,来确保⽤户是否登录成功。
如果登录成功,就跳转到项⽬应⽤⾸页,否则就跳转到登录页⾯。
接下来定义 HelloServlet:
@WebServlet(urlPatterns = "/hello")public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServle
在 HelloServlet 中,先判断⽤户是否已经登录,没登录的话,就返回 401,已经登录但是不具备相应的⾓⾊,就返回 403,否则就返回hello。
接下来再定义 LogoutServlet,执⾏注销操作:
@WebServlet(urlPatterns = "/logout")public class LogoutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpSe logout ⽅法也是 HttpServletRequest ⾃带的。
最后再简单定义⼀个 login.jsp 页⾯,如下:
Title
接下来,到 Tomcat 的 l ⽂件,修改配置,如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论