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 安全问题。
相关文章
- jsp实现邮件的发送
- JSP显示页面和数据库乱码
- JSP的优势与劣势浅析
- Servlet&jsp基础:第三部分
- JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】
- 用JSP+JavaBean开发模式实现一个销售额的查询
- jsp出现getOutputStream() has already been called for this response异常的原因和解决方法
- 超全面的JavaWeb笔记day11<JSP&Session&Cookie&HttpSession>
- JSP Scripting Element
- JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。
- JSP验证码
- JSP动作--JSP有三种凝视方式
- How JSP work.