框架的東西太復雜也難以講通,直接上代碼:
一、首先得配置環境 和導入必要的jar包
有一些重要的如下:
Filter文件夾下的SafetyFilter.java
model文件夾下的 GlobalNames.java
web文件下的MySpringContext.java baseAction.java BusinessException.java
interceptor文件夾下的 AuthorizationInterceptor.java ExceptionIntercetor.java RequestParameter.java HttpUtil.java PropertiesUtil.java
以及src根目錄文件下的以下文件
。。。
此外,webContent文件夾下的WEB-INF 里面的web.xml里面要部署攔截器和過濾器
首選寫一個登錄后進入的歡迎頁面,首先是Home.jsp 然后是index.html
<display-name>工程名字</display-name>
<welcome-file-list>
<welcome-file>Home.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list><!-- ==================================================== --<!-- ================== 過濾器配置 ======================== -->
<!-- ==================================================== -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 新增的文件濾波登錄時除了/login.action,/pages/login.jsp兩文件 其他的過濾掉-->
<filter>
<filter-name>SafetyFilter</filter-name>
<filter-class>******.filter.SafetyFilter</filter-class>
<init-param>
<description>不作判斷的資源</description>
<param-name>excludeUrls</param-name>
<param-value>
/login.action,
/pages/login.jsp
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SafetyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.action</url-pattern>
</filter-mapping>
除此外,還有自己要寫的action,bpo,dto,mapper,common文件夾
二、先寫一個登錄頁面login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>登錄頁面</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!--Basic Styles-->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/lib/assets/css/bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/lib/assets/css/font-awesome.min.css"/>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/lib/assets/css/ace.min.css"/>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/lib/assets/css/ace-rtl.min.css"/>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/lib/assets/css/ace-skins.min.css"/>
<script src="${pageContext.request.contextPath}/lib/assets/js/ace-extra.min.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/wpyd/login.css"/>
</head>
<body class="login-layout" onload="initLoginForm()">
<div class="main-container">
<div class="main-content">
<div class="row">
<div class="col-lg-11">
<div class="login-container">
<div class="position-relative">
<div id="login-box" class="login-box visible widget-box no-border">
<div class="widget-body">
<div id="widget-main" class="widget-main">
<div id="titlePanel" class="center">
<img id="aaaa" src="${pageContext.request.contextPath}/images/login/1234.png"/>
<div id="title">1234</div>
</div>
<form id="loginForm" action="${pageContext.request.contextPath }/login.action" method="post">
<fieldset>
<label class="block clearfix">
<span class="block input-icon input-icon-right">
<input type="text" class="form-control" tabindex="1" id="LoginName" name="loginUser.loginName" placeholder="用戶名" required="required"/>
<i class="icon-user"></i>
</span>
</label>
<br />
<label class="block clearfix">
<span class="input-icon input-icon-right" style="width:100%;">
<input type="password" tabindex="3" id="PassWord" name="loginUser.PassWord" class="form-control" placeholder="密碼" required="required"/>
<i class="icon-lock"></i>
</span>
</label>
<div class="error"><s:actionerror /></div>
<br />
<div class="clearfix">
<button type="button" type="submit" tabindex="4" onclick = "checkUser();" class="pull-right btn btn-sm btn-primary" style="width:100%;">
<i class="icon-key"></i>
登陸
</button>
</div>
<div class="space-4"></div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
var baseCtx = '${pageContext.request.contextPath}/';
</script>
<!--Basic scripts-->
<script src="${pageContext.request.contextPath}/lib/assets/js/jquery-2.0.3.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
if("ontouchend" in document) document.write("<script src='"+"${pageContext.request.contextPath}/"+"assets/js/jquery.mobile.custom.min.js'>"+"<"+"script>");
</script>
<script src="${pageContext.request.contextPath}/lib/assets/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<script src="${pageContext.request.contextPath}/lib/assets/js/typeahead-bs2.min.js" type="text/javascript" charset="utf-8"></script>
<script src="${pageContext.request.contextPath}/lib/assets/js/ace-elements.min.js" type="text/javascript" charset="utf-8"></script>
<script src="${pageContext.request.contextPath}/lib/assets/js/ace.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
$(function() {
$("#LoginName").focus();<!-- 登錄時自動定位可以輸入-->
});
function checkUser() {
var result = $.trim($("#LoginName").val());
var password = $.trim($("#PassWord").val());
if (result == "" || result == null) {
alert("用戶名不能為空!");
return false;
}
if (password == "" || password == null) {
alert("請輸入密碼!");
return false;
}
$("#loginForm").submit();
}
//初始化登錄輸入
function initLoginForm(){
var usr = document.getElementById("LoginName").value;
var pwd = document.getElementById("PassWord").value;
if( usr && pwd){
$("#LoginName").val(""); <!-- 登錄時清空用戶名和密碼-->
$("#PassWord").val("");<!-- 登錄時清空用戶名和密碼-->
}
}
</script>
</html>
三、寫一個登陸成功后返回的頁面 Home.jsp
頁面內容這里不關注 關注的是登陸成功后返回的用戶信息
<!-- 其中sys_current_sessioninfo是一個全局變量保存了用戶登錄成功后的session信息(包括用戶名,角色,ID等信息),后續我們要利用到這些信息來展示用戶的主頁面-->
<script type="text/javascript">
var contextPath = "${pageContext.request.contextPath}";
var Role = '${sessionScope.sys_current_sessioninfo.Role}';
var Name = '${sessionScope.sys_current_sessioninfo.Name}';
var Id = '${sessionScope.sys_current_sessioninfo.Id}';
</script>
四、寫一個登陸的action請求Java文件
從這里需要先說明一下后續的各個文件的用途
loginAction.java:登錄請求,接收到用戶頁面上輸入的用戶名和密碼(loginName passWord)
LoginUserDTO.java:登陸的客戶端用戶對象,他也有兩個屬性 loginName passWord
Sysuser.java:登陸的服務端用戶對象,由數據庫匹配成功后返回的用戶對象;他也有多個屬性 ID, name, role, password, phone, age等
sessionInfo.java:登陸成功后保存的用戶信息,在客戶端用戶訪問期間一直有效,保存的屬性也有多個ID, name, role, password, phone, age等
userSession.java: 主要是session的創建方法和獲取session的方法
/**
* 取當前操作人員ID號
* @return
*/
public static String getCurrentUserid() {
SessionInfo sessionInfo = (SessionInfo) get(GlobalNames.CURRENT_SESSION_INFO);
if (sessionInfo != null)
return sessionInfo.getWpyId();
return null;
}
/**
* 取當前登錄Session
*/
public static Map<String, Object> getSession() {
Map<String, Object> map = (Map<String, Object>) session.get();
return map;
}
userMapper.java:內容:public Sysuser selectByLoginName(String loginName);
//返回類型為Sysuser
//方法名:selectByLoginName
//功能:根據用戶輸入的登錄名來查找是否存在該用戶
usermapper.xml:主要是根據登陸時候提供的用戶名進行數據庫查詢,並返回一個用戶對象
<sql id="userColumns">
<!-- 用戶字段屬性名 -->
ID,
name,
age,
phone,
role,
password
</sql>
<select id="selectByLoginName" parameterType="string" resultType="*********.Sysuser">
SELECT
<include refid="userColumns" />
FROM table_name WHERE name=#{loginName}
</select>
loginAction.java的主要內容為:
private LoginUserDTO loginUser;
private String loginName;//前台頁面的登錄用戶名
private String passWord;//前台頁面的登錄密碼
@Resource
LogonBPO logonBPO;
//
@Action(value = "/login", results = {
@Result(location = "hi",type="redirectAction"),
@Result(name = "login", location = "/pages/login.jsp") })
public String login(){
Map<String, String> argsMap = new HashMap<String, String>();
if (loginUser == null){
loginUser = new LoginUserDTO();
}
try {
System.out.println("用戶和密碼驗證開始!");
Sysuser sysuser = logonBPO.checkUser(loginUser.getLoginName(), loginUser.getPassWord());
System.out.println("用戶為:\n"+sysuser.getWpy_name());
//將服務端返回的用戶對象數據存入一個map(10個字段的數據)
argsMap.put("Id", sysuser.getId());
argsMap.put("name", sysuser.getName());
System.out.println("開始創建session:\n");
//將map數據存入用戶session
logonBPO.createSessionInfo(argsMap);
}
catch (BusinessException e) {
addActionError(e.getMessage());
return LOGIN;
}
return SUCCESS;
}
/**
*
* 登陸成功后返回的頁面是Home.jsp
* @return
*/
@Action(value = "/hi",results = { @Result(location = "/pages/Home.jsp") } )
public String loginDispatch() {
return SUCCESS;
}
/**
* 退出系統
*/
@Action(value="/logout", results = { @Result(location = "/pages/login.jsp") })
public String logout() {
SessionInfo sessionInfo = (SessionInfo) UserSession.get(GlobalNames.CURRENT_SESSION_INFO);
this.request.getSession().invalidate();
if (sessionInfo != null) {
sessionInfo.getId();
} else
{
logger.warn("logoff");
}
if (HttpUtil.isAjaxRequest(this.request)) {
return NONE;
} else {
return SUCCESS;
}
// return NONE;
}
LogonBPO.java 主要用於檢查用戶密碼是否正確以及用戶名是否存在,代碼如下:
public Sysuser checkUser(String loginName, String passWord) {
//根據登陸的用戶名和密碼進行驗證
//1.查詢后台數據 返回類型為sysuser
Sysuser user = userMapper.selectByLoginName(loginName);
//2、判斷用戶狀態
if (user == null) {
System.out.println("用戶不存在:\n");
throw new BusinessException("該用戶不存在!");
}
else
{
//3.判斷密碼
if (passWord == null) {
throw new BusinessException("密碼為空!");
}
else
{
//4、驗證密碼是否正確
if (!passWord.equals(user.getPassword())){
throw new BusinessException("密碼錯誤!");
}
else
{
System.out.println("密碼匹配成功!\n");
}
}
}
return user; //返回用戶
}
/**
* 建立用戶會話信息,將action請求得到的用戶信息保存在session中
*/
public void createSessionInfo(Map<String, String> argsMap) {
Map<String, Object> session = UserSession.getSession();
SessionInfo sessionInfo = new SessionInfo();
sessionInfo.setId(argsMap.get("Id"));
sessionInfo.setName(argsMap.get("name"));
//將session數據存入一個全局變量
session.put(GlobalNames.CURRENT_SESSION_INFO, sessionInfo);
}
}