以下内容引用自http://wiki.jikexueyuan.com/project/jsp/security.html

JavaServer Pages和Servlets有几种可用的机制可以使Web开发人员用来保护应用程序。资源可以通过在应用程序部署描述中对它们进行识别并且为它们分配一个角色来声明式地保护它们。

有几种级别的身份验证是可用的,从使用基本标示符的基本验证到复杂的使用证书的密码验证。

一、基本角色的验证

Servlet规范中的认证机制使用的是一项被称为基于角色的安全技术。该想法是通过角色来创建角色和限制资源,而不是限制用户级别的资源。

可以定义在文件tomcat-users.xml中定义不同的角色,该文件位于Tomcat的主页目录中的conf.中。此文件的一个示例如下所示:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="admin" password="secret" roles="admin,manager"/>
</tomcat-users>

这个文件在用户名称、密码和角色之间定义了一个简单的映射。请注意,一个给定的用户可能有多个角色,例如,在“tomcat”角色中的用户名=“both”,角色是“role1”。

一旦识别和定义了不同的角色,一个基于角色的安全限制可以通过使用<security-constraint>元素被放置在不同的Web应用程序中,该元素在WEB-INF目录中的web.xml文件中是可用的。

下面是web.xml中一个简单的示例:

<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>
SecuredBookSite
</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>
Let only managers use this app
</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
...
</web-app>

以上条目将意味着:

  • 任何通过/secured/*对一个URL匹配的HTTP GET或者POST请求都将被安全限制所接受。

  • 一个有着管理员角色的人是可以访问被保护的资源的。

  • 最后,login-config元素是用来描述身份验证的BASIC形式。

现在,如果试图浏览任何包含/security目录的URL,它将显示一个询问用户名和密码的对话框。如果提供一个用户“admin”和密码“secrer”,那么可以通过/secured/*访问上面的URL,因为已经定义了用户为管理员角色,而该角色是有权访问该资源的。

二、基于表单的身份验证

当时使用表单身份验证方法时,必须提供一个登录表单来提示用户输入用户名和密码。下面是一个简单登录页面login.jsp的代码,用来创建一个相同目的的表单:

<html>
<body bgcolor="#ffffff">
<form method="POST" action="j_security_check">
<table border="0">
<tr>
<td>Login</td>
<td><input type="text" name="j_username"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="j_password"></td>
</tr>
</table>
<input type="submit" value="Login!">
</center>
</form>
</body>
</html>

在这里,必须确保登录表单中必须包含以j_username和j_password命名的表单元素。在<form>标签中的动作必须是j_security_check。POST必须以表单的方法来使用。同时必须修改<login-config>标签来指定auth-method作为表单:

<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>
SecuredBookSite
</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>
Let only managers use this app
</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
...
</web-app>

现在,当试图用URL:/secured/*访问任何资源时,它将显示以上的表单,要求用户id和密码。当容器看到“j_security_check”动作时,它会使用一些内部机制来对调用方进行身份验证。

如果登录成功,调用者会被授权访问安全资源,那么从那时起容器会用一个session-id来识别调用者的登录会话。容器会用一个包含session-id的cookie来保持这个登录会话。服务器将cookie发送回客户端,并且只要调用者使用后续的请求显示这个cookie时,那么容器就会知道这个调用者是谁。

如果登录失败,那么服务器将发回由form-error-page设置识别的页面。

这里,j_security_check是登录表单中使用基于表单登录的应用程序必须指定的一个动作。在相同的表单中,应该有一个名为j_username的文本输入控件和一个名为j_password的密码输入控件。当看到这,这意味着表单中包含的信息将会被提交到服务器,服务器将会检查用户名和密码。这一步如何实现是由服务器指定的。

检查Standard Realm Implementations来来了解j_security_check是如何为Tomcat容器工作的。

三、Servlet/JSP中的程序性安全

HttpServletRequest对象提供了以下方法,它可以在运行时用于挖掘安全信息:

方法 描述

String getAuthType()

getAuthType()方法返回一个字符串对象,代表用于保护Servlet的身份验证方案的名称。

boolean isUserInRole(java.lang.String role)

isUserInRole()返回一个布尔型的值:如果用户在给定的角色中值为真,否则值为假。

String getProtocol()

getProtocol()方法返回一个字符串对象,代表用户发送请求的协议。它的值可以用来检查确定一个保护协议是否被使用。

boolean isSecure()

isSecure()方法返回一个布尔型的值,代表请求是否是使用的HTTPS协议。真值代表是并且连接是安全的。假值代表不是。

Principle getUserPrinciple()

getUserPrinciple()方法返回一个java.security.Principle对象,该对象包含当前已验证用户的用户名。

例如,一个JavaServer Page连接的是管理员页面,可能会使用以下代码:

<% if (request.isUserInRole("manager")) { %><a href="managers/mgrreport.jsp">Manager Report</a><a href="managers/personnel.jsp">Personnel Records</a><% } %>

在一个JSP或者Servlet里,通过检查用户的角色,可以自定义Web网页来显示只有用户自己可以访问的条目。如果需要用户名作为身份验证表单的输入,那么可以在请求对象中调用getRemoteUser方法。

JSP的安全性的更多相关文章

  1. JSP菜鸟之困

    我一直想把java一套系统学好... 之前寒假学了android......feel good 大四又把jsp补习了一边.....85 但是苦于没有做过实例..... 暑假学PS之间想恶补一下jsp. ...

  2. JSP学习(2)

    JSP学习(2) JSP简介 Java Server Page,其根本是一个简单Servlet设计. 常用的动态网站开发技术 JSP:安全性高,适合开发大型的,企业级或分布式的Web应用程序. Asp ...

  3. JSP内置对象--web安全性及config对象的使用 (了解即可)

    tomcat服务器配置的时候,在虚拟目录中必须存在一个WEB-INF文件夹,但是访问的时候并不能发现这个文件夹.改成WEB-INFs就可以看到. 所以WEB-INF文件夹不轻易让用户看到,那么其安全性 ...

  4. JSP内置对象之WEB安全性及config对象

    一.WEB-INF的安全性是最高的. 在Java EE的标准中,Web目录中的WEB-INF是必须存在的,而且此文件夹的安全性是最高的,在各个程序的开发中,基本上都将一些配置信息保存在此文件夹中.在定 ...

  5. jsp安全性问题

    jsp项目不同jsp之间假设只通过超链接进行跳转,安全性太低,不能满足现实生活中对安全性的要求! 为了提高安全性.能够通过Servlet进行跳转,进行跳转的时候为了进一步实现其安全性,能够通过间jsp ...

  6. 浅谈JSP注释

    HTML注释 JSP文件是由HTML尿急和嵌入的Java程序片段组成的,所以在HTML中的注释同样可以在JSP文件中使用.注释格式:<!--注释内容--> <!-- 欢迎提示信息! ...

  7. JSP内置对象之request对象【学习笔记】

    request对象是JSP中重要的对象,每个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径. 一.获取请求头与 ...

  8. web安全性测试用例

    建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 1.   输入验证 客户端验证 服务器端验证(禁用脚本调试,禁用Cookies) 1.输入很大的数(如4,29 ...

  9. 防止 jsp被sql注入的五种方法

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

随机推荐

  1. 微信小程序组件解读和分析:六、progress进度条

    progress进度条组件说明: 进度条,就是表示事情当前完成到什么地步了,可以让用户视觉上感知事情的执行.progress进度条是微信小程序的组件,和HTML5的进度条progress类似. pro ...

  2. Python学习 Day 3 字符串 编码 list tuple 循环 dict set

    字符串和编码 字符 ASCII Unicode UTF-8 A 1000001 00000000 01000001 1000001 中 x 01001110 00101101 11100100 101 ...

  3. 在SQLServer 2005附加SQLServer 2008数据库异常处理

    远程服务器软件系统不算新,数据库是SQL Server 2005.本地开发基本是用新的软件系统.数据库采用SQL Server 2008. 这样在用远程服务器SQL 2005选择附加SQL 2008的 ...

  4. [Android]AndroidDesign中ActionBar探究2 嵌入Fragment

    上一节我们只是简单了介绍了Android Design风格中的ActionBar的简单实用,如添加MenuItem,这节我们会进一步了解ActionBar的其他功能. 在Android Develop ...

  5. sql server查看某个表上的触发器

    用企业管理器查看 在某个具体的表上点右键->“所有任务”->“管理触发器”,选择所要查看的触发器

  6. vuex使用之state访问状态对象

    引入vuex1.利用npm包管理工具,进行安装 vuex.在控制命令行中输入下边的命令就可以了. npm install vuex --save 需要注意的是这里一定要加上 –save,因为你这个包我 ...

  7. 20181017 work - Inno Setup 禅道 xp系统 楷体字体 win10倒计时 nwjs chosen

    win10 闹钟和时钟 用个倒计时 Inno Setup 编译器 把应用程序打包成安装程序 nwjs-v0.14.7-win-ia32 XP专用 chrome用的49的版本 作用是把浏览器地址的程序打 ...

  8. F. Asya And Kittens并查集

    F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. caffe和图像一些基础知识

    1.卷积层的参数放置在convoluytion_param{}中,pad默认是0,stride默认是1,如果在convoluytion_param中没有写pad = 什么,或者stride = 什么, ...

  10. 第2节 mapreduce深入学习:14、mapreduce数据压缩-使用snappy进行压缩

    第2节 mapreduce深入学习:14.mapreduce数据压缩-使用snappy进行压缩 文件压缩有两大好处,节约磁盘空间,加速数据在网络和磁盘上的传输. 方式一:在代码中进行设置压缩 代码: ...