这里的Java Web容器特指Tomcat,Tomcat依然是最流行的Java Web容器,你大爷还是你大爷。

本文并不涉及业务层面上的安全控制,只针对Tomcat自身所支持的相关安全控制功能与特性。

首先看一下Web容器的四个基本安全特性验证 Authentication

资源访问控制 Access control for resources

数据完整性 Data Integrity

数据机密性或私密性 Confidentiality or Data Privacy

每一项的细节这里不展开,并不难理解。

Java EE使用基于角色的访问控制——有用户、组、角色三个基本概念。

存储用户名和密码的地方叫Realm,有可能是文件,比如Tomcat的tomcat-users.xml,也可能是数据库,或者基于证书的机制。

Tomcat支持声明式验证和编程式验证,一个是基于XML配置,一个是通过代码实现。

声明式基本身份验证

在web.xml中定义

BASIC

同时可以定义角色

Admin User

admin

Manager

manager

针对路径做控制

Admin

/admin/*

admin

连HTTP方法也能配置

Manager

/manager/*

GET

POST

admin

manager

部署后,根据各服务器来配置用户和角色,比如Tomcat的就在conf/tomcat-users.xml里。

Tomcat的验证过程如下初次访问某个受保护的URI,Web容器会检查请求中是否包括Authorization头,如果没有,容器会返回401,以及WWW-Authenticate标头给浏览器,浏览器收到后会弹出对话框要求用户输入名称和密码。

如果用户输入用户名、密码正确后,浏览器会将用户名、密码以BASE64方式编码,然后放在Authorization标头中送出,容器进行验证,正确就将资源传回。

在关闭浏览器之前,对服务器的请求都包括Authorization头,服务器也每次都检查,所以登录有效期一直持续到关闭浏览器为止。

现在实验步骤如下

在Tomcat9目录下,修改conf/tomcat-users.xml文件,解注并新增admin的角色

在webapps目录下,新建test目录和/WEB-INF/web.xml文件

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

version="4.0"

metadata-complete="true">

Servlet and JSP Examples.

Servlet and JSP Examples

UTF-8

Example Security Constraint

Protected Area - Allow methods

/admin/*

DELETE

GET

POST

PUT

admin

manager

BASIC

admin

manager

新建/admin目录和/test.html文件,

输入正确后,查看请求可以看到Authorization头

注意这种方式几乎跟裸奔没区别,只要能拦截到你的HTTP请求,就相当于查看到你的密码。上面Basic后的字符串用base64解密就是tomcat:123456。

如果需要自定义登录窗口,可以配置

FORM

/login.html

/error.html

登录表单的action和name属性是有要求的

除了FORM和BASIC,还可以设置为DIGEST或CLIENT_CERT。DIGEST提交时传递的是MD5加密后的摘要,CLIENT_CERT使用的是Public Key Certificate(PKC)加密,客户端要安装证书。

如果要启用HTTPS,则在下设置

CONFIDENTIAL

默认值是NONE,还可以设置为INTEGRAL,不过习惯设为CONFIDENTIAL,效果一样。

设置完后,认证的时候会自动跳转为HTTPS

编程式安全管理

支持编程能带来更灵活的控制。HttpServletRequest里跟安全有关的方法有authenticate( ): 是否登录,如果没有,返回false,并会转到登录界面

login( ): 登入

logout( ): 登出

getUserPrincipal( ): 取得代表用户的Principal对象

getRemoteUser( ): 获得登录用户的名称

isUserInRole(String role): 传入角色名称,检查登录用户是否属于该角色

@WebServlet("/secret")

public class User extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

if (request.authenticated(response)) { // 检查登录 // 执行登录后的用户能够做的事情 }

}

@WebServlet("/login")

public class Login extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String username = request.getParameter("user");

String password = request.getParameter("passwd");

try {

request.login(username, password);

response.sendRedirect("user");

} catch( ServletException ex) {

response.sendRedirect("login.html");

}

}

和对标的注解是@ServletSecurity,比如

@WebServlet("/admin")

@ServletSecurity(@HttpConstraint(rolesAllowed = {"admin"}))

就表示/admin只允许admin角色访问。

再看一个复杂一点的

@WebServlet("/admin")

@ServletSecurity(

value=@HttpConstraint(rolesAllowed = { "admin", "manager" }),

httpMethodConstraints = {

@HttpMethodConstraint(value = "GET", rolesAllowed = {"admin", "manager"},

transportGuarantee = TransportGuarantee.CONFIDENTIAL),

@HttpMethodConstraint(value = "POST", rolesAllowed = {"admin", "manager"}),

)

其它Realm

前面的例子都是把用户名密码放在配置文件里,这样带来一定的隐患,在Tomcat里也支持其它的Realm,比如JDBCRealm

DataSourceRealm

JNDIRealm

UserDatabaseRealm

MemoryRealm

JAASRealm

CombinedRealm

LockOutRealm

java web容器_Java Web容器安全相关推荐

  1. java开发简介_Java Web开发介绍

    转自:http://www.cnblogs.com/pythontesting/p/4963021.html 简介 Java很好地支持web开发,在桌面上Eclipse RCP谈不上成功,JAVA是主 ...

  2. java web环境_java web

    HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException HTTP ...

  3. java servlet原理_Java Web 深入分析(8) Servlet工作原理解析

    Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态We ...

  4. java 实现 web 客户端_Java web客户端和服务器端交互的原理

    Java web客户端和服务器端交互的原理 其实HTTP客户端和服务器端的交互原理很简单:即先是浏览器和服务器端建立Socket无状态连接,也就是短连接,然后通过IO流进行报文信息(这个报文是严格遵循 ...

  5. java web 教程_Java Web服务教程

    java web 教程 Welcome to the Java Web Services Tutorial. Here we will learn about web services, useful ...

  6. web开发的java语言步骤_java web开发入门一(servlet和jsp)基于eclispe

    servlet 用java语言开发动态资源网站的技术,在doGet方法中拼接显示html,在doPost方法中提交数据.类似于.net的ashx技术. servlet生成的class文件存放在tomc ...

  7. java web 刷新_Java Web项目的保存和刷新

    java web 刷新 如何配置计算机以保存并刷新Java Web项目? 当您向开发人员提出此问题时,答案以"哦,好吧--"开头,并以某种可行的方式继续描述. 每个人都有自己的方式 ...

  8. java web 保护_java web项目请求控制及简单漏洞防范

    背景:当时项目没用什么框架,过滤器,请求限制等都需要自己手写. 1.请求加时间戳 在后台过滤器中可以加判断,如果请求时间戳与服务器时间相差太大,可以返回异常,具体情况可以具体使用. 请求中加时间戳的示 ...

  9. java web后台_java web 后台那些事

    java web 后台运行原理 当Web服务器接收到一个HTTP请求时,它会先判断请求内容--如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息:如果牵涉到动态数据,Web服务器会将请求转 ...

最新文章

  1. 记一次有惊无险的 JVM 优化经历!
  2. C#获取和设置环境变量
  3. 滴滴顺风车GM:大多数产品经理定义是狭隘的
  4. mysql和jfinal的区别_mysql与JFinal的数据关系-阿里云开发者社区
  5. JavaScript get set方法 ES5 ES6写法
  6. WSO2 WSF/CPP 网络服务开发例子1--HELLO
  7. 阶段3 3.SpringMVC·_06.异常处理及拦截器_5 SpringMVC拦截器之编写controller
  8. bing翻译api php,Auto Tag Slug使用 google翻译并删除bing api key提示
  9. 恢复计算机个性化设置方法,Win7主题默认还原电脑用了主题软件没办法恢复完美解决系统主-win7主题...
  10. SCT2450QSTE 国产车规AEC-Q100 3.8V-36V 5A 高效同步降压 DCDC 转换器 替代TSP54540
  11. Excel ----- 身份证自动判断男女 公式
  12. MySQL DBLE_MySQL 中间件 - DBLE 简单使用
  13. HTML基础之 小白入门
  14. 以下python扩展库_以下对Python常用扩展库的描述错误的是哪一个选项?
  15. 发那科2021参数_三菱发那科常用参数对照表
  16. 算法——机器学习——无监督学习—— K均值(K-means)图解动画
  17. nginx NSS error -12263 (SSL_ERROR_RX_RECORD_TOO_LONG) 处理
  18. 【matlab】矩形窗/三角窗/hanning窗/hamming窗/blackman窗的频率响应图
  19. 好记性不如烂笔头——Vuex篇
  20. 管理后台服务通用化设计拙见

热门文章

  1. asp.net core 使用 AccessControlHelper 控制访问权限
  2. .net core编写转发服务
  3. 一个实时收集MySql变更记录的组件CanalSharp.AspNetCore
  4. 如何在ASP.NET Core程序启动时运行异步任务(3)
  5. 【活动(深圳)】告别2018之12.22 大湾区.NET Meet 大会 ,同时有网络直播
  6. .NetCore SkyWalking APM实现服务器监控环境安装及基础使用
  7. .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(一)
  8. asp.net core源码飘香:Options组件
  9. [.NET Core].NET Core R2安装及示例教程
  10. MySQL-01:下载安装配置及初始化命令