Java表达式注入

玩玩

EL表达式

先搭一个tomcat 注意

1
2
3
4
5
WEB-INF 是受保护目录,WEB-INF里面的文件只可以由servlet去访问,不能通过url地址栏去请求访问 WebRoot根目录下面的文件可以直接通过url地址栏去访问,一般的index.jsp就放这里

一般的可以把所有的页面展示的jsp,js,css,图片都放到WebRoot下面,也可以都放到WEB-INF下面,这个没有定论 放到WEB-INF下面的,也都是通过servlet去跳转的页面,都可以访问 一般的正式系统,是没有index.jsp这样的页面的,首页都是通过action去跳转请求出来的

一些比较隐私的,不愿被所有人看到的页面,可以放到WEB-INF下面,由action去控制查看权限等 实际中,放到WebRoot 下面和 WEB-INF 下面都可以的,WebRoot 下面多一点。

okk 我们来开动 虽然会爆红 但没有什么大的影响

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String name = "张三";
request.setAttribute("name",name);

request.setAttribute("request", "request_name");
session.setAttribute("session", "session_name");
pageContext.setAttribute("page", "page_name");
application.setAttribute("application", "application_name");
HashMap<String, String> map = new HashMap<>();
map.put("my-name", "admin");
request.setAttribute("test", map);
%>
从四个作用域中搜索变量:${name}
</br>
<%--获取作用域--%>
从requestScope作用域中获取变量:${requestScope.request}
</br>
从sessionScope作用域中获取变量:${sessionScope.session}
</br>
从pageScope作用域中获取变量:${pageScope.page}
</br>
从applicationScope作用域中获取变量:${applicationScope.application}
</br>
从作用域中获取特殊符号变量:${requestScope.test["my-name"]}

image-20221011105031821

禁用EL表达式

如果不想使用 EL 表达式,可以禁用 EL 表达式。禁用 EL 表达式有以下 3 种方法:

1)禁用单个EL表达式

在 EL 表达式前加 \,例如:

\${2+3}

页面输出:

${2+3}

2)禁用当前页面的EL表达式

将 page 指令中的 isELIgnored 属性设置为 true,如下:

1
<%@ page isELIgnored="true" %>

3)禁用整个Web应用的EL表达式

在 web.xml 中配置 元素,如下:

1
2
3
4
<jsp-property-group>
<url-pattern>*jsp</url-pattern>
<el-ignored>false</el-ignored>
</jsp-propery-group>

EL内置对象

为了显示方便,EL 表达式语言提供了许多内置对象,可以通过不同的内置对象来输出不同的内容。EL 表达式内置对象如下:

内置对象 说明
pageScope 获取 page 范围的变量
requestScope 获取 request 范围的变量
sessionScope 获取 session 范围的变量
applicationScope 获取 application 范围的变量
param 相当于 request.getParameter(String name),获取单个参数的值
paramValues 相当于 request.getParameterValues(String name),获取参数集合中的变量值
header 相当于 request.getHeader(String name),获取 HTTP 请求头信息
headerValues 相当于 request.getHeaders(String name),获取 HTTP 请求头数组信息
initParam 相当于 application.getInitParameter(String name),获取 web.xml 文件中的参数值
cookie 相当于 request.getCookies(),获取 cookie 中的值
pageContext 表示当前 JSP 页面的 pageContext 对象

从以上方法可以看出,EL 表达式可以输出 4 种属性范围的内容。如果在不同的属性范围中设置了同一个属性名称,则按照 page、request、session、application 的顺序依次查找。我们也可以指定要取出哪一个范围的变量,例如:${pagesScope.name},表示取出 page 范围的 name 变量。

实例

https://y4er.com/posts/java-expression-injection/#%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E5%AE%9E%E4%BE%8B

以后遇到再说

reference

EL表达式完全攻略 (biancheng.net)