一、概述

前面是扯犊子的,JSP/SERVLET基于HTTP规范,提供了几种安全支持,BASIC、DIGEST、FORM、CLIENT-CERT,本文主要介绍一下FORM的安全支持开发,文末有一个小demo用于展示。

因为FORM方式比较少用,因此本文介绍的原理点到即止,并没有特别特别深入,见谅。

更多详情,请参见《JSP/SERVLET核心编程》(新浪微盘,您找PDF的天堂···)

二、详细

1. 原理简述

FROM声明式安全基于表单验证。

简述:用户想要访问某一个受保护的资源,如果用户未登路,则将用户导向一个特定格式的表单进行身份验证,验证通过则继续访问资源;验证不通过,则将用户导向一个提示页面。

关键点:

a. 对受保护资源进行配置。本例是基于URL进行限制保护,因此需要在web.xml中配置受保护的URL;

b. 特定格式的表单写法。主要是三部分的固定写法,一是表单action必须为j_security_check,用户名输入input的name必须为j_username,用户密码的输入input的name必须为j_password;

c. 只要用户登录成功,并且支持cookie(会话cookie,跟session搭一块干活的那个cookie:JSESSIONID),那么这个用户名和密码就会被保存到当前用户的session中,后续只要用户的会话cookie存在并且服务器session未过期,则一直验证通过,否则验证失败,更多原理,请往下看;

FROM验证的安全性基于cookie/session机制的安全性,并且可以配置通过SSL传输,因此安全性还是比较高的,至少比BASIC的安全性高了不止一个等级。之前写的一个小demo,手动实现BASIC验证(不是基于JSP/SERVLET提供的封装了的BASIC,而是其底层原汁原味id实现):点击打开链接

d. 局限性。用户的身份验证,是基于服务器提供的用户角色,以tomcat为例,所有基于FORM的用户安全验证,都是基于tomcat user的安全验证。也就是说,能够通过用户验证的用户配置,都是属于tomcat_dir/conf/tomcat-user.xml中的<role rolename="xxx"/>配置和<user username="ooo" password="ooo" roles="xxx"/>。因此,基于表单验证FORM的局限性在于程序的可移植性,尽管代码不需要重写,但是不同的服务器的用户规则不一样,因此需要重新配置用户;

2. demo讲解

业务逻辑:首页index.jsp有一个超链,访问一个受保护的路径,如果用户未被验证,则自动跳转到认证页面,否则直接访问资源;如果认证失败,则自动跳转到一个失败提示页面。

整个FORM验证的所有核心在于配置文件web.xml的配置,因此在理解demo业务逻辑的基础上,本节的所有内容将围绕配置文件展开。

2.1 首页

即index.jsp,这个页面上有一个超链,用于访问受保护资源,内容如下所示。

<a href="${pageContext.request.contextPath}/gif">查看群相册</a>

2.2 配置文件

此时,因为超链的访问路径“/gif”是受保护的,因此会判断用户是否已经验证通过,判断的条件是根据会话cookie找到对应的session,看session里面是否已经存在j_username和j_password。下面分别来讲解。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>春田花花同学会</display-name><!-- 一下配置都是基于FROM表单身份验证的角度来说明的为了更好的阅读,请重下网上看配置文件,谢谢合作!--><!-- 和form-error-page不同的是,当在授权页面进行验证的时候,如果username是一个合法的认证用户即username所在的role存在tomcat-users.xml中,但是这个role不具备访问该资源的权限,则会返回403,跳转到location指定的页面而form-error-page是认证失败:1. 用户名或密码错误;2. username不存在tomcat-users.xml中--><error-page><error-code>403</error-code><location>/security/fail.jsp</location></error-page><!-- login-config:1. 当访问受限资源但是还未验证,则跳转到form-login-page页面,这个页面的编写需要固定的格式(理出为不变格式化的内容,其他可选自填),形如<form action="j_security_check"><input type="text" name="j_username"/><input type="password" name="j_password"/></form>如果有密码,则表单最好是post提交2. 当验证失败,即用户名和密码错误或用户不在授权列表中,则直接跳转到form-error-page指定页面这个页面随便编写,目的是提示用户--><login-config><auth-method>FORM</auth-method><form-login-config><form-login-page>/security/login.jsp</form-login-page><form-error-page>/security/logfail.jsp</form-error-page></form-login-config></login-config><!-- security-role:对应着tomcat-users.xml中的role配置可选,有无均可以,配置主要是方便项目开发的人查看--><security-role><role-name>user-auth</role-name></security-role><!-- 安全约束配置:display-name:可选,表示受保护的资源名web-resource-collection:必选,至少一个,配置受保护的资源本处配置的受保护资源为:/gifauth-constraint:授权约束,可选,role-name的value应该是在tomcat-users.xml中配置的<role rolename="xxx"/>如果配置了auth-constraint,但是没有设置value,则表示任何人都不能访问--><security-constraint><display-name>R_file</display-name><web-resource-collection><web-resource-name>aiyou_gif</web-resource-name><url-pattern>/gif</url-pattern></web-resource-collection><auth-constraint><role-name>user-auth</role-name></auth-constraint></security-constraint><!-- 首页,这个页面的超链请求到一个受保护的资源路径(/gif,即上文中security-constraint中配置),于是被拦截到一个登陆认证的页面 --><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

2.3 实现原理

查看form-lgoin-page页面的请求头和响应头,推测j_username和j_password是保存于session中,但是查看sessionScope是空的,未能进一步验证。但是根据HTTP的迹象来推测,应该是介样的,有大神能进一步解答,请不吝赐教!

General
Remote Address:[::1]:8080
Request URL:http://localhost:8080/web02/j_security_check
Request Method:POST
Status Code:302 Found
Response Headers
HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Location: http://localhost:8080/web02/gif
Content-Length: 0
Date: Tue, 16 Jun 2015 09:54:39 GMT
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:36
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=168CB17F9CF19F3615845B438332B7CD
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/web02/gif
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36
Form Data
view parsed
j_username=wangxinyan&j_password=123

随即验证通过,进行/gif的资源访问,此时会设置新的会话cookie,实际上在访问授权页面的时候,也会生成新的会话cookie。

General
Remote Address:[::1]:8080
Request URL:http://localhost:8080/web02/gif
Request Method:GET
Status Code:200 OK
Response Headers
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=6F12E8122EB68186270DC626974E24FE; Path=/web02/; HttpOnly
Cache-Control: private
Expires: Thu, 01 Jan 1970 08:00:00 CST
Content-Type: text/html;charset=UTF-8
Content-Length: 306
Date: Tue, 16 Jun 2015 09:54:39 GMT
Request Headers
GET /web02/gif HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36
Referer: http://localhost:8080/web02/gif
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=168CB17F9CF19F3615845B438332B7CD

基于Form的身份验证,是需要浏览器支持cookie,否则机制会瘫痪。但是整个验证的流程中HTTP透露的信息来看,并没有看到set-cookie除了会话cookie JSESSIONID之外的其他cookie,因此并不是将认证信息存放于cookie中;但是整个流程中都存在会话cookie,因此猜测FORM机制是将认证信息存放于session,每次访问cookie都会带着session id到浏览器,如果访问受保护资源,则浏览器通会过id找到session,session保存了认证信息,因此用户可以直接访问资源。

并且,为了辅助验证,做了session.invalidate();的测试,发现当session失效以后,必须要重新验证才能访问受保护的资源,因此可以确定验证信息是借助于会话cookie/session机制来实现的,因此其安全性依赖于session和会话cookie的安全性,如果需要进一步提高安全性,在security-constraint中还可以配置SSL进行数据传输,因此,这种验证方式还是比较安全的!

三、demo下载

示例demo百度云地址:点击打开链接

(该demo仅用于展示原理,其中还有很多不完善的地方,仅仅能作为一个参考,谢谢!)

附注:

参考资料:《JSP/SERVLET核心编程(第二版)》

本文如有错漏,烦请不吝指正,谢谢!

【JSP/SERVLET】Tomcat内置表单身份验证相关推荐

  1. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(4)暴力破解HTML表单身份验证

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(4)暴力破解HTML表单身份验证 文章目录 黑帽python第二版(Black Ha ...

  2. ASP.NET 中的表单身份验证(Forms Authentication)

    表单验证可以通使用一个登录页面验证用户的用户名和密码.未通过验证的请求会被重定向到登录页面,要求用户输入其凭据信息(同常是用户名和密码).如果请求通过验证,系统将签发一个身份验证票据,在用户会话期间, ...

  3. GOOGLE ADSENSE广告联盟收不到PIN码_快速表单身份验证PIN码方法

    在自己的网站或者博客上投放Google Adsense广告是目前很多站长不错的赚钱途径.尤其是Google Adsense不仅单价高.而且信誉好.支付稳定等天然优势让国内众多广告联盟黯然失色.在流量有 ...

  4. ASP.NET在IE10中Form表单身份验证失效问题解决方法

    我的系统遇到了这个问题,还好有好心网友发布了一篇文章: ---------网上找的原文如下--------------------------- IE10中Session丢失问题引起众多业内人士的关注 ...

  5. 表单身份验证(受保护的目录)

    根目录下的 web.config <authentication mode="Forms">   <forms name=".COOKIEDEMO&qu ...

  6. 第4章 JSP语法、内置对象

    第4章 JSP语法.内置对象 关于Spring Boot+Vue全栈开发实战(三方面)前端 全栈 Spring Boot JSP概述 4.1.1 什么是JSP(Java Server Page) 4. ...

  7. jsp输出金字塔_实验二 JSP语法及内置对象.doc

    实验二 JSP语法及内置对象 燕山大学经济管理学院 JSP编程技术 实验指导书 经济管理学院电子商务系 2011年5月 实 验 说 明 <JSP编程技术>JSP(Java Server P ...

  8. 手把手教你用JSP+Servlet+Tomcat实现一个最简单的Web应用

    JSP+Servlet+Tomcat实现一个简单的Web应用 需要使用到的技术 ①JSP ② Servlet ③Tomcat Web开发中的常见概念 Demo *本文针对编程务实实验内容,简单演示一下 ...

  9. 开源数据库连接池之Tomcat内置连接池

    本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...

最新文章

  1. 【网站汇总】安装教程系列
  2. 怎样处理重命名系列案例代码
  3. 百万奖金 !「悟道之巅」AI创新应用大赛,开幕!
  4. roscore尚未安装 问题解决方案
  5. 怎么样在线创建索引或者重构索引
  6. 【转载】负数的二进制
  7. 关于控件postback 后viewstate加载失败的问题
  8. GitHub的嵌入式开源项目
  9. 76岁“爷爷考生”第5次备战研究生考试
  10. 陈皓:不灌鸡汤,说真的年龄渐长,技术人的发展之路该怎么走?
  11. 天堂2单机版如何架设mysql_天堂2单机版 L2J-som-rotm 安装全过程及常用工具 一步到位...
  12. java读取共享文件_局域网共享文件读写的实现方式
  13. 超有趣的Python实战:将图片转成像素风~
  14. 手机移动端首页广告栏滚动图片
  15. 创建题库后Excel导入试题老是失败?人工导题服务上线啦~
  16. 【源码】程序员优质资源汇总
  17. Win10 下安装Ubuntu 16.04双系统详解
  18. 我与安利美女过招;安利传销内幕揭秘! 转
  19. 东莞SEO联盟电商【干货分享】
  20. Unity 获得周边最近的物体

热门文章

  1. Windows Server 2008 R2 3389端口更改
  2. java项目:批量修改文件名字
  3. 基于模板的知识问答方法
  4. Unity WebGL 实现中文IME输入
  5. Domoticz 中接入斐讯 M1 空气质量检测仪
  6. easyui datagrid表格头部鼠标右键进行列隐藏和展示
  7. cmake教程(cmake教程pdf)
  8. php 元旦祝福,元旦祝福语大全简短 简短独特
  9. Kubernetes 高可用集群部署
  10. 运用BFS算法实现北京地铁路线换乘系统