第九节 Shiro标签原理分析
一、shiro的标签
首先,你需要知道的是,标签的实质其实是Java代码。你已经知道,JSP实质也是Java代码,更别说用在JSP中的标签了。 稍后你会在源码追踪环节了解到:Shiro标签执行了哪些Java代码。
标签的作用就是移除JSP页面中的Java代码。
OK,下面进入正题:Shiro标签。
最常见的Shiro标签有三个
shiro: principal 标签。获取当前用户认证主凭证信息。支持主凭证是一个对象,可用property的方式取出。
shiro: hasRole 标签。判断当前登录用户是否拥有某种角色。
shiro: hasPermission 判断当前用户是否拥有某种权限。
二、使用实例
本章节项目源码:点击我下载源码
我们继续使用上一小节的WEB环境。你可以返回上一小节,复制我的代码,制作一个基本的Shiro与WEB集成环境。
接着,我们在main.jsp页面里面使用shiro标签。
首先展示的是shiro.ini配置文件。用户jay =123456 拥有coder角色,并且拥有code:insert与code:update权限。
[main]
#若没有登录,则被authc拦截器重定向到login.jsp页面
logout.redirectUrl=/login.jsp
#用户退出后跳转指定JSP页面
authc.loginUrl = /login.jsp
[users]
jay = 123456,coder
[roles]
coder = code:insert,code:update
[urls]
#发送main请求需要经过认证拦截器authc
#如果用户没有登录,则重定向到login.jsp页面
/main.jsp = authc
#退出拦截器,注销当前用户
/logout = logout
接下来编写main.jsp页面。进入main.jsp页面的条件就是用户jay已经登录。main.jsp页面的代码如下。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这里是main.jsp,欢迎来到shiro的世界</h1>
<h1>欢迎用户<shiro:principal/>登录</h1>
<shiro:hasRole name="coder">
<h1> 能看到我代表你有程序员coder角色</h1>
</shiro:hasRole>
<shiro:hasPermission name="code:insert">
<button>提交代码</button><br>
</shiro:hasPermission>
<shiro:hasPermission name="code:update">
<button>更新代码</button>
</shiro:hasPermission>
<shiro:hasPermission name="code:delete">
<button>删除代码</button>
</shiro:hasPermission>
</body>
</html>
首先在浏览器上输入http://localhost:8080/main.jsp 。因为没有登录,所以请求会被重定向为http://localhost:8080/login.jsp。
接着,点击第一个超链接"发送登录认证请求",登陆成功。
登录成功后,再次请求受限制页面http://localhost:8080/main.jsp。成功来到main.jsp页面。
我在登录后,并请求main.jsp页面 ,页面上的效果如图所示。(页面丑,求轻喷,大宇的前端水平是helloworld级别的)
OK,页面的话弄的是惨不忍睹,对比main.jsp页面的源码,最基本的Shiro标签功能算是展示出来了。
JSP中的"欢迎用户<shiro:principal/>登录"的代码,已经被shiro标签成功解析。在页面上将<shiro:principal/>解析为了shiro.ini配置文件中的jay。
用户jay是coder角色,并且拥有 code:insert权限与code:update权限,所以可以看到"提交代码按钮"与"更新代码按钮"。
因为jay没有code:delete权限,所以"删除代码按钮"没有在页面上显示出来。
好了,让我们不要在纠结页面太丑这个问题了。接下来,让我们进入源码,看看Shiro标签到底做了什么事情。
三、源码追踪
<shiro:principal/>源码追踪。
首先,我们在main.jsp页面上找到<shiro:principal/>标签,按住CRTL点开它的源码配置。
哦,原来处理此标签的类是一个叫org.apache.shiro.web.tags.PrincipalTag的类。我们继续追踪到此类,在onDoStartTag这个方法处打个断点。
刷新我们的main.jsp页面,让其重新执行一次解析标签的逻辑。因此,代码就执行到了我们的断点处。研究一下代码,一下就明白了。原来就是获取门面对象Subject对象,拿到Subject对象里面的主凭证。如果主凭证可能是一个对象,比如user对象,将其 地址address 属性作为主凭证,那么可以这样配置:<shiro:principal property="address"/>。
最后,将数据刷新到JSP页面中。是不是很简单,原来源码也不是想象中的那么恐怖,不是吗。
<shiro:hasRole/>源码追踪。
获取到当前Shiro环境的Subject对象,再判断当前登录用户是否有此角色。
返回1则页面显示,返回0则页面不显示。
<shiro:hasPerssion/>源码追踪。
四、如何开发自定义标签
自定义标签其实不难,开发出自己的标签也是一个非常有趣的过程。如果你有业务需要,或者想进一步学习如何开发标签,欢迎参考:“孤傲苍狼”大牛的jsp自定义标签开发入门。
五、源码下载
本章节项目源码:点击我下载源码
----------------------------------------------------分割线-------------------------------------------------------
下一篇:第十节 SSM框架集成Shiro
阅读更多:跟着大宇学Shiro目录贴