JSP中使用JSTL,并且解决XSS安全问题

普通的Java Web项目中使用JSTL来简化JSP, 以及使用<c:out> 标签处理Cross-Site Scripting安全问题。

1. 下载JSTL必要的jar包

官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下,将 tld下的需要引入的 tld 文件复制到 WEB-INF/lib目录下。

2. 引入<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

在需要使用JSTL的JSP文件最开始处加入

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3. 使用

Demo项目创建了2个页面,index.jsp 和welcome.jsp,以及用于接受数据的mode ---User.java

三个文件的code:

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<FORM NAME="form" METHOD="post" ACTION="welcome.jsp">
		<input type="text" name ="name"  />
		<input type="text" name="password" />
		<input type="submit"  value="submit"/>
	</FORM>
</body>
</html>

index页面通过提交按钮将表单信息传到welcome页面。

welcome.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<jsp:useBean id="user" scope="request" class="test.bean.User"/>
<jsp:setProperty name="user" property="name"/>
<jsp:setProperty name="user" property="password"/>
<body>
	<%
	 String nm = request.getParameter("name");
	String pwd = request.getParameter("password"); 
	%>

    <%= request.getParameter("name")%>

	<c:out value="${param['name']}"/>

</html>

welcome.jsp接收index页面传递过来得方式有两种

User.java

public class User {
	private String name;
	
	private String password;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

1、User bean接收

<jsp:useBean id="user" scope="request" class="test.bean.User"/>
<jsp:setProperty name="user" property="name"/>
<jsp:setProperty name="user" property="password"/>

property的值需要和index.jsp中输入框的name值对应。

2、通过变量接收

String nm = request.getParameter("name");
String pwd = request.getParameter("password"); 

jsp中嵌套的java code,将request中的参数存到两个变量中(nm, pwd)

那么如何将index页面传递过来的参数显示呢?

1、EL表达式

${xxx}

2、<c:out>标签

直接输出到页面

<c:out value="${param['name'] }" />

 将值填充到输出框中

<input type="text" value="<c:out value="<%= nm%>"/>" />
<input type="text" value="<c:out value="${param['name']}"/>" />

但是为什么EL表达式中不直接用nm变量?因为${nm}拿到的值为null。

EL表达式中的内容必须在PageScope、RequestScope、SessionScope、ApplicationScope四个范围之一,才能取到值。

而nm定义在Java中,属于局部变量。

3、<jsp:getProperty>标签

<jsp:getProperty name="user" property="name"/>

4、<%= 表达式%>

<%= nm%>

或者

<%= request.getParameter("name")%>

但是<%= 表达式%>和<c:out>这两种输出方式是有区别的,即:输出内容中含html或者js标签时,前者会影响html页面格式或者执行js内容,后者会直接输出,不会影响页面和执行js

例如:

输入<script>alert('hello');</script>

<%= request.getParameter("name")%>, welcome页面会出现弹框

而<c:out value="${param['name']}">就不会,而是直接输出内容,不执行js。

因此,JSTL的<c:out>标签可以用来处理Cross-Site Scripting 安全问题。

猜你喜欢

转载自blog.csdn.net/qq_26817225/article/details/86308096
今日推荐