07 、配置外部数据源和tomcat的安全验证机制
realm(1)【profile.xml】
<?xml version="1.0" encoding="UTF-8"?>
<
Context docBase="D:\atool\apache-tomcat-7.0.52\wtpwebapps\profile" path="/profile" reloadable="false" source="org.eclipse.jst.jee.server:profile">
<
ResourceLink global="jdbc/mt"
name="jdbc/mt" type="javax.sql.DataSource"/>
<
Realm className="org.apache.catalina.realm.JDBCRealm"
debug="99" driverName="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@10.25.10.72:1521:mt"
connectionName="rsms" connectionPassword="test1234"
userTable="houjt_user" userNameCol="user_name" userCredCol="user_password"
userRoleTable="houjt_user_in_roles" roleNameCol="role_id" />
</Context>
说明:
docBase 项目的绝对路径,tomcat加载项目时使用。
path 项目的虚拟路径,一般是程序逻辑调用。
reloadable 当改变项目的配置文件时,禁止tomcat自动重新加载。
source 表示是曾经在eclipse的server配置tomcat,由eclipse生成的默认profile.xml,可以删除。
ResourceLink 项目引用的外部数据源 DataSource
name 引用名jdbc/mt,可以理解成一个用于映射的id。
关联外部数据源和项目中指定的数据源。现在在tomcat里面配置外部数据源,
通过jdbc/mt 在context.xml文件中查找具体的数据连接串。
global 表示全局查找该引用名?
tomcat的server.xml配置数据源,表示作用范围是全局,对所有应用有效。
如果是单个文件描述符如profile.xml,则只对当前项目有效。
(2)【context.xml】
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<
Resource name="jdbc/mt" auth="Container"
type="javax.sql.DataSource" maxActive="10" maxIdle="4" maxWait="5000"
username="rsms" password="test1234" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)( HOST=10.25.10.72)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=mt)))"/>
</Context>
(3)Realm 解释
<
Realm className="org.apache.catalina.realm.JDBCRealm"
debug="99" driverName="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@10.25.10.72:1521:mt"
connectionName="rsms" connectionPassword="test1234"
userTable="houjt_user" userNameCol="user_name" userCredCol="user_password"
userRoleTable="houjt_user_in_roles" roleNameCol="role_id" />
a.指定了数据源信息
b.指定了用于验证登陆的2张表和字段信息。
userTable="houjt_user" 用户表:对应数据表 houjt_user
userNameCol="user_id" 列名称:对应数据表 users的user_name列
userCredCol="user_password" 列名称:对应数据表 users的user_password列
userRoleTable="houjt_user_in_roles" 用户角色表:对应数据表 houjt_user_in_roles
roleNameCol="role_id" 列名称: 对应数据表 houjt_user_in_roles的role_id列
注意:
实际上tomcat是对
houjt_user 和 houjt_user_in_roles 进行联表查询,所以两张表的关联字段必须是一样的,即用户表和用户角色表,通过
user_id 关联。(4)【web.xml】
<security-constraint>
<web-resource-collection>
<web-resource-name>profile page</web-resource-name>
<url-pattern>*.shtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>R_PROFILE_MANAGER</role-name>
</auth-constraint>
</security-constraint>
<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>
【login.jsp】
上面配置指定了用
form提交。
$(function(){
$(window).resize(function() {
center($('div.login'));
});
center($('div.login'));
$('#j_username').focus();
$('#btnLogin').click(function(){
var username = $.trim($('#
j_username').val()).toUpperCase();
var password = $.trim($('#
j_password').val());
if(username != '' && password != ''){
$('#j_username').val(username);
$('#formMain').submit(); }
});
});
<form method="post" onkeydown="checkKeyDown(event)"
action="
j_security_check" class="form-horizontal" id="formMain" style="padding:20px;background:#fff;width:300px;">
<p class="header"><%= request.getContextPath().replaceFirst("/", "").toUpperCase() %></p>
<br />
<div>
<label for="inputEmail">
用户名
<!--[if lt IE 9]>
<small style="color: gray;">(请输入UM账号或域账号)</small>
<![endif]-->
</label>
<input type="text" style="width:285px" name="j_username" id="j_username"
placeholder="请输入UM账号或域账号">
<label for="inputPassword">
密码
<!--[if lt IE 9]>
<small style="color: gray;">(请输入UM密码)</small>
<![endif]-->
</label>
<input type="password" style="width:285px" name="j_password" id="j_password"
placeholder="请输入UM密码或域密码">
</div>
<div style="margin-top:5px;text-align:right"><input type="button" id="
btnLogin" class="btn-success" value="登录"/></div>
</form>
j_username 、
j_password 、 j_security_check
该两个字段不可以改,是Realm中固定的字段,另外,form默认提交的url是
j_security_check========================
一个简易form形如:
<form name="loginForm" method="POST" action="
j_security_check">
<table>
<tr>
<td><input type='text' name='
j_username'></td>
<td><input type='text' name='
j_password'></td>
</tr>
<tr>
<td><input type='
submit' name='sub'></td>
</tr>
</table>
</form>