tag:blogger.com,1999:blog-59465307047421309702024-03-06T16:20:07.273+08:00Jax 的工作紀錄除了在整理學習上的經驗,同時也能幫助其他需要的人Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-5946530704742130970.post-83153883473562477762015-03-01T15:36:00.001+08:002015-03-01T15:36:18.139+08:00Spring Security 存取控制表示式<h2>常用内建表示式</h2>ps: 定義在 SecurityExpressionRoot<br />
<br />
<table class="table_list" cellspacing="0" cellpadding="4" border="1"><tr class="header"><th>表示式</th><th>說明</th></tr>
<tr><td><b>hasRole('role')</b></td><td>當前的 User 擁有指定的 Role 就回傳 true</td></tr>
<tr><td><b>hasAnyRole('role1', 'role2')</b></td><td>當前的 User 擁有任一個 Role 就回傳 true</td></tr>
<tr><td><b>principal</b></td><td>當前的 User 的 Principal 物件</td></tr>
<tr><td><b>authentication</b></td><td>當前的 User 的 Authentication 物件</td></tr>
<tr><td><b>permitAll</b></td><td>總是為 true</td></tr>
<tr><td><b>denyAll</b></td><td>總是為 false</td></tr>
<tr><td><b>isAnonymous()</b></td><td>當前的 User 是匿名登入就回傳 true</td></tr>
<tr><td><b>isRememberMe()</b></td><td>當前的 User 是透過 remember-me 登入就回傳 true</td></tr>
<tr><td><b>isAuthenticated()</b></td><td>當前的 User 不是匿名登入就回傳 true</td></tr>
<tr><td><b>isFullyAuthenticated()</b></td><td>當前的 User 不是匿名登入或 remember-me 登入就回傳 true</td></tr>
</table><br />
<br />
<br />
<h2>在方法執行前的驗證</h2><br />
驗證 User 角色<br />
<pre class="java:nogutter:nocontrols" name="code">@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);
</pre><br />
驗證參數值是否等於 User 名稱<br />
<pre class="java:nogutter:nocontrols" name="code">@PreAuthorize("#contact.name == authentication.name")
public void doSomething(Contact contact);
</pre><br />
驗證 User 角色以及來源 IP 區間<br />
<pre class="java:nogutter:nocontrols" name="code">@PreAuthorize("hasRole('admin') and hasIpAddress('192.168.1.0/24')")
public void doSomething(Contact contact);
</pre><br />
<br />
<br />
<h2>在方法內的驗證</h2><br />
取得角色驗證<br />
<pre class="java:nogutter:nocontrols" name="code">@RequestMapping("/index")
public void index(HttpServletRequest request) {
System.out.println(request.isUserInRole("ROLE_USER"));
if (request.isUserInRole("admin")) {
System.out.println("is admin");
}
}
</pre><br />
<br />
<br />
<h2>在 JSP 的驗證</h2><br />
取得 User 名稱<br />
<pre class="xml:nogutter:nocontrols" name="code"><sec:authentication property="name"/>
<sec:authentication property="principal.username"/>
</pre><br />
取得 User IP<br />
<pre class="xml:nogutter:nocontrols" name="code"><sec:authentication property="details.remoteAddress"/>
</pre><br />
取得 User SessionId<br />
<pre class="xml:nogutter:nocontrols" name="code"><sec:authentication property="details.sessionId"/>
</pre><br />
驗證角色為 admin 才顯示<br />
<pre class="xml:nogutter:nocontrols" name="code"><sec:authorize access="hasRole('admin')">
<div>is admin</div>
</sec:authorize>
</pre><br />
驗證角色為 admin 存入變數 isAdmin<br />
<pre class="xml:nogutter:nocontrols" name="code"><sec:authorize var="isAdmin" access="hasRole('admin')" />
<c:if test="isAdmin">
<div>is admin</div>
</c:if>
</pre><br />
<br />
參考自:<a href="http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html" target="_blank">15. Expression-Based Access Control</a><br />
<br />
Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-34530681631212133812015-02-21T17:47:00.001+08:002015-02-26T09:45:09.046+08:00[轉載] [JSP] Expression Language (EL)轉載自:<a href="http://www.w3cschool.cc/jsp/jsp-expression-language.html" target="_blank">JSP 表达式语言 | w3cschool菜鸟教程</a><br />
<br />
JSP 表達式語言(EL)使得訪問存儲在 JavaBean 中的數據變得非常簡單。JSP EL 既可以用來創建算術表達式也可以用來創建邏輯表達式。在 JSP EL 表達式內可以使用整型數,浮點數,字符串,常量 true、false,還有 null。<br />
<br />
<br />
<h2>一個簡單的語法</h2><br />
典型的,當您需要在JSP標簽中指定一個屬性值時,只需要簡單地使用字符串即可:<br />
<pre class="xml:nogutter:nocontrols" name="code"><jsp:setProperty name="box" property="perimeter" value="100"/>
</pre><br />
JSP EL 允許您指定一個表達式來表示屬性值。一個簡單的表達式語法如下:<br />
<pre class="xml:nogutter:nocontrols" name="code">${expr}
</pre><br />
其中,expr 指的是表達式。在 JSP EL 中通用的操作符是"."和"[]"。這兩個操作符允許您通過內嵌的 JSP 物件訪問各種各樣的 JavaBean 屬性。<br />
<br />
舉例來說,上面的 <code><jsp:setProperty></code> 標簽可以使用表達式語言改寫成如下形式:<br />
<pre class="xml:nogutter:nocontrols" name="code"><jsp:setProperty name="box" property="perimeter"
value="${2*box.width+2*box.height}"/>
</pre><br />
當 JSP 編譯器在屬性中見到"${}"格式後,它會產生代碼來計算這個表達式,並且產生一個替代品來代替表達式的值。<br />
<br />
您也可以在標簽的模板文本中使用表達式語言。<br />
比如 <code><jsp:text></code> 標簽簡單地將其主體中的文本插入到 JSP 輸出中:<br />
<pre class="xml:nogutter:nocontrols" name="code"><jsp:text>
<h1>Hello JSP!</h1>
</jsp:text>
</pre><br />
現在,在 <code><jsp:text></code> 標簽主體中使用表達式,就像這樣:<br />
<pre class="xml:nogutter:nocontrols" name="code"><jsp:text>
Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>
</pre><br />
在 EL 表達式中可以使用圓括號來組織子表達式。<br />
比如 <code>${(1 + 2) * 3}</code> 等於9,但是 <code>${1 + (2 * 3)}</code> 等於7。<br />
<br />
想要停用對 EL 表達式的評估的話,需要使用 page 指令將 isELIgnored 屬性值設為 true:<br />
<pre class="xml:nogutter:nocontrols" name="code"><%@ page isELIgnored ="true|false" %>
</pre><br />
這樣,EL 表達式就會被忽略。若設為 false,則容器將會計算 EL 表達式。<br />
<br />
<br />
<hr/><h2>EL 中的基礎操作符</h2><br />
EL表達式支持大部分Java所提供的算術和邏輯操作符:<br />
<table class="table_list" cellspacing="0" cellpadding="4" border="1"><tr class="header"><th>操作符</th><th>描述</th></tr>
<tr><td>.</td><td>訪問一個 Bean 屬性或者一個映射條目</td></tr>
<tr><td>[]</td><td>訪問一個數組或者鏈表的元素</td></tr>
<tr><td>()</td><td>組織一個子表達式以改變優先級</td></tr>
<tr><td>+</td><td>加</td></tr>
<tr><td>-</td><td>減或負</td></tr>
<tr><td>*</td><td>乘</td></tr>
<tr><td>/ 或 div</td><td>除</td></tr>
<tr><td>% 或 mod</td><td>取模</td></tr>
<tr><td>== 或 eq</td><td>測試是否相等</td></tr>
<tr><td>!= 或 ne</td><td>測試是否不等</td></tr>
<tr><td>< 或 lt</td><td>測試是否小於</td></tr>
<tr><td>> 或 gt</td><td>測試是否大於</td></tr>
<tr><td><= 或 le</td><td>測試是否小於等於</td></tr>
<tr><td>>= 或 gt</td><td>測試是否大於等於</td></tr>
<tr><td>&& 或 and</td><td>測試邏輯與</td></tr>
<tr><td>|| 或 or</td><td>測試邏輯或</td></tr>
<tr><td>! 或 not</td><td>測試取反</td></tr>
<tr><td>empty</td><td>測試是否空值</td></tr>
</table><br />
<br />
<hr/><h2>JSP EL 中的函數</h2><br />
JSP EL 允許您在表達式中使用函數。這些函數必須被定義在自定義標簽庫中。函數的使用語法如下:<br />
<pre class="xml:nogutter:nocontrols" name="code">${ns:func(param1, param2, ...)}
</pre><br />
ns 指的是命名空間(namespace),func 指的是函數的名稱,param1 指的是第一個參數,param2 指的是第二個參數,以此類推。比如,有函數 <code>fn:length</code>,在 JSTL 庫中定義,可以像下面這樣來獲取一個字符串的長度: <br />
<pre class="xml:nogutter:nocontrols" name="code">${fn:length("Get my length")}
</pre><br />
要使用任何標簽庫中的函數,您需要將這些庫安裝在服務器中,然後使用 <code><taglib></code> 標簽在JSP文件中包含這些庫。<br />
<br />
<br />
<hr/><h2>JSP EL 隱含物件</h2><br />
JSP EL支持下表列出的隱含物件:<br />
<table class="table_list" cellspacing="0" cellpadding="4" border="1"><tr class="header"><th>隱含物件</th><th>描述</th></tr>
<tr><td>pageScope</td><td>page 作用域</td></tr>
<tr><td>requestScope</td><td>request 作用域</td></tr>
<tr><td>sessionScope</td><td>session 作用域</td></tr>
<tr><td>applicationScope</td><td>application 作用域</td></tr>
<tr><td>param</td><td>Request 物件的參數,字符串</td></tr>
<tr><td>paramValues</td><td>Request 物件的參數,字符串集合</td></tr>
<tr><td>header</td><td>HTTP 信息頭,字符串</td></tr>
<tr><td>headerValues</td><td>HTTP 信息頭,字符串集合</td></tr>
<tr><td>initParam</td><td>上下文初始化參數</td></tr>
<tr><td>cookie</td><td>Cookie 值</td></tr>
<tr><td>pageContext</td><td>當前頁面的 pageContext</td></tr>
</table><br />
您可以在表達式中使用這些物件,就像使用變量一樣。接下來會給出幾個例子來更好的理解這個概念。<br />
<br />
<br />
<hr/><h2>pageContext 物件</h2><br />
pageContext 物件是 JSP 中 pageContext 物件的引用。通過 pageContext 物件,您可以訪問 request 物件。比如,訪問 request 物件傳入的查詢字符串,就像這樣:<br />
<pre class="xml:nogutter:nocontrols" name="code">${pageContext.request.queryString}
</pre><br />
<br />
<hr/><h2>Scope 物件</h2><br />
pageScope,requestScope,sessionScope,applicationScope 變量用來訪問存儲在各個作用域層次的變量。<br />
<br />
舉例來說,如果您需要顯式訪問在 applicationScope 層的 box 變量,可以這樣來訪問:<br />
<pre class="xml:nogutter:nocontrols" name="code">${applicationScope.box}
</pre><br />
<br />
<hr/><h2>param 和 paramValues 物件</h2><br />
param 和 paramValues 物件用來訪問參數值,通過使用 <code>request.getParameter</code> 方法和 <code>request.getParameterValues</code> 方法。<br />
<br />
舉例來說,訪問一個名為 order 的參數,可以這樣使用表達式:<code>${param.order}</code> 或者 <code>${param["order"]}</code>。<br />
<br />
接下來的例子表明了如何訪問request中的username參數:<br />
<pre class="xml:nogutter:nocontrols" name="code"><%@ page import="java.io.*,java.util.*" %>
<%
String title = "Accessing Request Param";
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>${param["username"]}</p>
</div>
</body>
</html>
</pre><br />
param 物件返回單一的字符串,而 paramValues 物件則返回一個字符串數組。<br />
<br />
<br />
<hr/><h2>header 和 headerValues 物件</h2><br />
header 和 headerValues 物件用來訪問信息頭,通過使用 <code>request.getHeader</code> 方法和 <code>request.getHeaders</code> 方法。<br />
<br />
舉例來說,要訪問一個名為 user-agent 的信息頭,可以這樣使用表達式:<code>${header.user-agent}</code> 或者 <code>${header["user-agent"]}</code>。<br />
<br />
接下來的例子表明了如何訪問 user-agent 信息頭:<br />
<pre class="xml:nogutter:nocontrols" name="code"><%@ page import="java.io.*,java.util.*" %>
<%
String title = "User Agent Example";
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>${header["user-agent"]}</p>
</div>
</body>
</html>
</pre><br />
運行結果如下:<br />
<blockquote>User Agent Example<br />
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; .NET4.0C; InfoPath.2)<br />
</blockquote><br />
header 物件返回單一值,而 headerValues 則返回一個字符串數組。Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0