首页 > 其他分享 >【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2

【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2

时间:2023-06-12 16:01:33浏览次数:43  
标签:password 15 登录 用户 user 跳转 页面 子系统 SSH


接上一篇

我们的子系统界面已经加载出来:


【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2_项目实战



我们找到左边菜单页,给它加链接:


<dl class="">
     <dt><a class="yh" href="${ctx }tax/role_listUI.action" target="mainFrame"><b></b>角色管理<s class="down"></s>
    </a></dt>
</dl>
<dl class="">
    <dt><a class="yh" href="${ctx }tax/user_listUI.action" target="mainFrame"><b></b>用户管理<s class="down"></s>
    </a></dt>
</dl>


我们指定了点击链接之后右侧模块页面的地址。



效果:


【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2_struts_02



【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2_hibernate_03


接下来我们要添加登录功能:


我们把工程原来的默认欢迎界面(WEB-INF下面的index.jsp)改为我们的登录界面。


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
response.sendRedirect(basePath+"sys/login_toLoginUI.action");
%>


可以看到我们让index.jsp去跳转到sys/login_toLoginUI.action,我们下面来实现这个action:


package cn.edu.hpu.tax.login.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
	
	//跳转到登录页面
	public String toLoginUI(){
		return "loginUI";
	}
	
}


然后写它的struts配置文件login-struts.xml:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">


<struts>
	<package name="login-action" namespace="/sys" extends="base-default">
		<action name="login_*" class="cn.edu.hpu.tax.login.action.LoginAction" method="{1}">
			<result name="{1}">/WEB-INF/jsp/{1}.jsp</result>
			<result name="loginUI">/WEB-INF/jsp/loginUI.jsp</result>
		</action>
	</package>
</struts>


将配置文件加入到struts总配置文件中:


<!-- 登录跳转的struts配置文件 -->
<include file="cn/edu/hpu/tax/login/conf/login-struts.xml"/>


然后加入我们的登录页面loginUI.jsp:


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
request.setAttribute("ctx", path);
%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
<link href="${ctx}/css/login.css" type="text/css" rel="stylesheet">
<script type="text/javascript">


function logins(){
	document.forms[0].submit();
}


function setClean(){
	document.getElementById("account").value = "";
	document.getElementById("password").value = "";
}


//解决子框架嵌套的问题
if(window != window.parent){
	window.parent.location.reload(true);
}


</script>
<style type="text/css">
html { overflow-y: hidden;  }


.password{
      background-color:#f1f3f6;
	  border:1px solid #f1f3f6;
	  font-color:#ccc;
}


#Layer1 {
	position:absolute;
	left:224px;
	top:479px;
	padding-top:5px;
	width:99px;
	height:21px;
	background-color:#fff;
	z-index:1;
}
.password1 {      
	 background-color:#f1f3f6;
	  border:1px solid #f1f3f6;
	  font-color:#ccc;
}


.youbian input{ border:0px none; background-color:transparent; color:#555;padding-left:10px;font-size:16px;width:100%;overflow: hidden;}
</style>
    <!--[if IE 6]>
    <script type="text/javascript" src="${ctx}/ehome/js/DD_belatedPNG.js" ></script>
    <script type="text/javascript">
        DD_belatedPNG.fix('b, s, img, span, .prev, .next, a, input, .youbian, td');
    </script>
    <![endif]-->
</head>
<body scroll="no">
<s:form name="form1" namespace="/sys" action="login_login">
<div id="lo_tf">
<div class="outside">
    <div class="head">
      <table width="1000" height="60" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr>
          <td width="840" align="left"><img src="${ctx}/images/login/form_03.png"   width="332" height="47"/></td>
          <td align="center">  <a href="#"></a></td>
        </tr>
      </table>
    </div>
    <div class="main2">
	   <div class="content">  
	   <div class="youbian">
	    <table width="251" border="0" cellpadding="0" cellspacing="0">
          <tr>
            <td height="12"> </td>
          </tr>
          <tr>
           <td height="45" align="left"></td>
          </tr>
          <tr>
          	<td height="13"> 
            	<span><div height=20 valign="middle" style="padding-left: 18px"><font color="red" id="errMsg"><s:property value="loginResult"/></font></div></span>
            </td>
          </tr>
          <tr>
            <td height="40">
			<table width="100%" border="0" cellpadding="0" cellspacing="0">
  <tr>
    	<td height="32" align="left"><span style="color:#767676;font-size:14px;">帐号:</span></td>
  </tr>
</table>


			<table width="100%" height="39" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td background="${ctx}/images/login/shuru_03.png" width=""><table width="100%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                    <td align="left">
                    <s:textfield id="account" name="user.account" cssClass="password1" cssStyle="color: #767676" size="31"/>
                    </td>
                  </tr>
                </table></td>
              </tr>
            </table></td>
          </tr>
		    <tr>
            <td height="10"><table width="100%" border="0" cellpadding="0" cellspacing="0">
  <tr>
    <td height="32" align="left"><span style="color:#767676;font-size:14px;">密  码:</span></td>
  </tr>
</table></td>
          </tr>
          <tr>
            <td height="40"><table width="100%" height="39" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td background="${ctx}/images/login/shuru_03.png"><table width="100%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                    <td align="left">
                    	<s:password id="password" name="user.password" cssClass="password"  cssStyle="color: #767676" size="31"/>
                    </td>
                  </tr>
                </table></td>
              </tr>
            </table></td>
          </tr>
          
		   <tr>
            <td height="10"> </td>
          </tr>
          <tr>
            <td height="40"><table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td align="right"><a href="#" οnclick="javascript:logins();"><img src="${ctx}/images/login/form_15.png" width="95" height="37"/></a></td>
                <td width="18"> </td>
                <td align="left"><img src="${ctx}/images/login/form_17.png" width="95" height="37" οnclick="setClean()"/></td>
              </tr>
            </table></td>
          </tr>
        </table>
	    
	  </div>   
       </div>
   </div>
	<div class="foot">版权所有 | 国税局  2014年</div>
</div>
</div>
</s:form>
</body>
</html>


然后重启服务器,测试登录页面:



跳转至登录页面成功。



我们下面来做登录功能:


我们是这么设计的:



登录:


1、获取帐号和密码


2、通过帐号和密码查询用户表;如果查询有记录说登录成功;否则登录失败跳转到登录页面并且提示用户登录失败信息


2.1、登录成功


2.1.1、将用户信息保存到session中


2.1.2、***


2.1.3、将用户登录记录到日志文件


2.1.4、重定向跳转到首页



2.2、登录失败


     跳转到登录页面并且提示用户登录失败信息



退出(注销):清除session中保存的用户信息



下面编码实现:


首先在LoginAction中实现我们的登录检测方法:


//登录
public String login(){
	if(user!=null){
		if(StringUtils.isNoneBlank(user.getAccount())
				&&StringUtils.isNoneBlank(user.getPassword())){
			//根据用户的账号和密码查询用户列表
			List<User> list=userService.findUserByAccountAndPassword(user.getAccount(),user.getPassword());
			if(list!=null&&list.size()>0){//说明登录成功
				//1、登录成功
				User user=list.get(0);
				//1.1、***
				//1.2、将用户信息保存到session中
				ServletActionContext.getRequest().getSession().setAttribute(Constant.USER, user);
				//1.3、将用户登录记录到日志文件
				Log log=LogFactory.getLog(getClass());
				log.info("用户名称为:"+user.getName()+"的用户登录了系统");
				//1.4、重定向跳转到首页
				return "home";
			}else{
				loginResult="账号或密码不正确!";
			}
		}else{
			loginResult="账号或密码不能为空!";
		}
	}else{
		loginResult="请输入账号和密码!";
	}
	return toLoginUI();
}


我们的loginResult设为LoginAction的成员参数,并且设置了set和get方法。当我们登录失败了,这个错误提示信息就将在域中,在页面显示错误的地方放置这个信息:


<s:property value="loginResult"/>


其中的常量Constant.USER被定义在Constant类中:


public class Constant {
	
	//系统中用户在session中的内容
	public static String USER="SYS_USER";
	//其它常量省略
}


然后在login-strust.xml配置文件中配置我们的home跳转页面:


<result name="home" type="redirectAction">
	<param name="actionName">home</param>
</result>


上面的登录方法中还有findUserByAccountAndPassword(user.getAccount(),user.getPassword());没有定义,我们在UserService中定义这个方法,然后在UserServiceImpl中实现这个方法:


@Override
public List<User> findUserByAccountAndPassword(String account,
		String password) {
	
	return userDao.findUserByAccountAndPassword(account,password);
}


我们在UserDao中定义findUserByAccountAndPassword()这个方法,然后在UserDaoImpl中实现这个方法:


@Override
public List<User> findUserByAccountAndPassword(String account,
		String password) {
	 Query query=getSession().createQuery("FROM User WHERE account=? AND password=?");
	 query.setParameter(0, account);
	 query.setParameter(1, password);
	return query.list();
}


我们来测试:


我们有一个账号和密码是:lixiangyang和554466


【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2_struts_04


点击登录之后成功进入主页!


【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2_spring_05

同时后台输出登录记录并存入Log日志中:

【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2_mysql_06

那么我们将密码故意输错,发现又跳转回登录界面并看到了错误信息:


【SSH项目实战】国税协同平台-15.系统、子系统首页&登录功能2_spring_07



至此我们的登录方法完成,但是我们还要处理一些细节(注销等功能)。下篇总结再赘述。


标签:password,15,登录,用户,user,跳转,页面,子系统,SSH
From: https://blog.51cto.com/u_16012040/6463186

相关文章

  • 「解题报告」CF1815E Bosco and Particle
    好像不难。但是没想到。首先这玩意看起来就得拆开,要不然完全做不了。假如我们只考虑某一个点\(i\),考虑\(i-1\toi,i\toi+1\)这两条边的经过次数,不难发现其它的点是不会影响这两条边的。那么我们可以直接依据题意模拟,只考虑这一个点的周期是多长,然后所有的周期\(\mat......
  • 手机在线玩Python的15种方法!
    /手机写代码 /android安卓 QPython.apk链接:https://pan.baidu.com/s/1S2mFHsqa3Zuyxiua6nGsbg 提取码:b1g2  Pydroid.apk链接:https://pan.baidu.com/s/10Bnyl6AdUI2mBRZEuLMB6g 提取码:678f Python教程.apk链接:https://pan.baidu.com/s/1iRJC4mAUTCGBounShuXxdg?pw......
  • 游戏约玩陪玩圈子系统APP小程序H5,你需要了解的事情
    游戏约玩陪玩小程序开发的市场需求分析目前,中国约有5、6亿游戏玩家,其中约有2亿付费玩家,这也表明大多数玩家愿意为他们最喜欢的游戏付费。随着游戏体验的提高,玩家更愿意找到合适的游戏玩伴。点击咨询完整免费源码游戏约玩陪玩小程序开发都需那些功能呢?1、电竞游戏资讯通过建......
  • POJ 2352 HDU1541 Stars(树状数组)
    题意:二维平面给定n个点的坐标,然后要你输出每个点的“等级“。每个点的等级是它的左下放的点个数(包括正下放和正左方的点)。即要你输出对于每个点(x,y)来说,有多少点的坐标(xi,yi)满足xi<=x且yi<=y。思路:题目给出的坐标中已经是按y升序排列,那么其实只用考虑x轴,那么显然就是在前面的......
  • HDU 1556 Color the ball(树状数组区间更新)
    题意:中文题思路:一道区间更新,单点查询的裸题,用线段树做更好,因为还没看到所以这里用树状数组做。树状数组标记区间的方法很特别,比如给区间[a,b]内的气球涂颜色时,我们add(a,1),add(b+1,-1),单点查询的时候sum(x)就是x这个气球被涂色的总次数。建议先在纸上自己试一下看看,有点抽象,可以这......
  • github多账号,如何设置ssh key
    github在使用ssh验证时,会有一个默认的,id_rsa.pub。但是,如果你在一个电脑上,同时需要使用多个github的账号,如何指定不同的key呢这里假定已经创建好了一个不同的ssh-key那就需要显式的告诉git,从哪个位置取ssh的配置具体就是gitconfigcore.sshCommand"ssh-i~/.ssh/id_rsa_example......
  • 15.堆
    1.堆的原理堆(Heap)是一种数据结构,通常用于实现优先队列。堆是一种树形结构,通常由一个完全二叉树构成,因此它只有两个指针,即左子节点和右子节点。堆有两种类型:最大堆(MaxHeap)和最小堆(MinHeap)。在最大堆中,父节点的值大于或等于其子节点的值;在最小堆中,父节点的值小于或等于其子节点的......
  • linux-ssh优化
    1.修改ssh端口vim/etc/ssh/sshd_config#Port22Port20199#指定端口Port20100#ListenAddress0.0.0.0#ListenAddress::2.添加ssh白名单[root@small~]#vim/etc/hosts.allowsshd:10.10.10.sshd:10.241.107.85:allowsshd:10.28.234.124:allowsshd:172.16.2.30:a......
  • 针对不同主机使用不同 SSH Key
    考虑到安全性和便捷性,相信大部分同学都已经习惯了SSHkey登录这种方式。有时候我们需要针对不同主机使用不同的key,甚至针对同一个主机使用不同的key,都可以通过~/.ssh/config这个配置文件来实现。默认情况下,ssh会使用~/.ssh/id_rsa。这里,我通过ssh-keygen命令生成另外一个......
  • Lua 语言 15 分钟快速入门
    --单行注释--[[  [多行注释]--]]-----------1.变量&控制流----------num=23--数字都是双精度str='aspythonstring'--像Python一样不可变str="aspythonuse"--可以双引号str=[[    像Python的多行注释可用于    表示多行字符串一样 ......