请将已备案网站接入访问,广告推广软文案例,金融网站开发文档下载,网上工商营业注册登记这里的Java Web容器特指Tomcat#xff0c;Tomcat依然是最流行的Java Web容器#xff0c;你大爷还是你大爷。本文并不涉及业务层面上的安全控制#xff0c;只针对Tomcat自身所支持的相关安全控制功能与特性。首先看一下Web容器的四个基本安全特性验证 Authentication资源访问…这里的Java Web容器特指TomcatTomcat依然是最流行的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 UseradminManagermanager针对路径做控制Admin/admin/*admin连HTTP方法也能配置Manager/manager/*GETPOSTadminmanager部署后根据各服务器来配置用户和角色比如Tomcat的就在conf/tomcat-users.xml里。Tomcat的验证过程如下初次访问某个受保护的URIWeb容器会检查请求中是否包括Authorization头如果没有容器会返回401以及WWW-Authenticate标头给浏览器浏览器收到后会弹出对话框要求用户输入名称和密码。如果用户输入用户名、密码正确后浏览器会将用户名、密码以BASE64方式编码然后放在Authorization标头中送出容器进行验证正确就将资源传回。在关闭浏览器之前对服务器的请求都包括Authorization头服务器也每次都检查所以登录有效期一直持续到关闭浏览器为止。现在实验步骤如下在Tomcat9目录下修改conf/tomcat-users.xml文件解注并新增admin的角色在webapps目录下新建test目录和/WEB-INF/web.xml文件xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0metadata-completetrueServlet and JSP Examples.Servlet and JSP ExamplesUTF-8Example Security ConstraintProtected Area - Allow methods/admin/*DELETEGETPOSTPUTadminmanagerBASICadminmanager新建/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 {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {if (request.authenticated(response)) { // 检查登录 // 执行登录后的用户能够做的事情 }}WebServlet(/login)public class Login extends HttpServlet {Overrideprotected 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(valueHttpConstraint(rolesAllowed { admin, manager }),httpMethodConstraints {HttpMethodConstraint(value GET, rolesAllowed {admin, manager},transportGuarantee TransportGuarantee.CONFIDENTIAL),HttpMethodConstraint(value POST, rolesAllowed {admin, manager}),)其它Realm前面的例子都是把用户名密码放在配置文件里这样带来一定的隐患在Tomcat里也支持其它的Realm比如JDBCRealmDataSourceRealmJNDIRealmUserDatabaseRealmMemoryRealmJAASRealmCombinedRealmLockOutRealm