文档章节

SSH实现一个简单的权限控制实例(二)

丶KKdo
 丶KKdo
发布于 2016/08/11 17:05
字数 1334
阅读 16
收藏 0

接上文,基本配置已经配置好,那么编写控制用户登录的Action.

/*UserAction.java*/
@Component @Scope("prototype")
public class UserAction extends ActionSupport {
	public String loginname;
	public String password;
	private String checkcode;

	public String getCheckcode() {
		return checkcode;
	}

	public void setCheckcode(String checkcode) {
		this.checkcode = checkcode;
	}

	public String getLoginname() {
		return loginname;
	}

	public void setLoginname(String loginname) {
		this.loginname = loginname;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Resource
	private UserService userService;
	
	@Resource
	private MenuService menuService;

	@SuppressWarnings({ "unchecked", "unused" })
	@Transactional
	public String login() {
		String code = (String) ServletActionContext.getRequest().getSession().getAttribute("checkcode");
	    if((code.toUpperCase()).equals((checkcode.toUpperCase()))) {
			List<User> list = userService.login(loginname, password);
			if(list == null || list.size() == 0) {
				this.addActionError("用户名或密码错误!");
				return ERROR;
			}
			User user = list.get(0);
			user.setLastLogin(DateFormat.dateFormat(new Date()));
			userService.update(user);
			ServletActionContext.getRequest().getSession().setAttribute("user", user);
			List<Menu> menuList =  (List<Menu>) ServletActionContext.getRequest().getSession().getAttribute("menuList");
			if(menuList == null) {
				menuList = menuService.getNeed(0);
				ServletActionContext.getRequest().getSession().setAttribute("menuList", menuList);
			}
		}else {
			this.addActionError("验证码错误!");
			return ERROR;
		}
		return "loginSuccess";
	}
	
	public String execute() {
		return SUCCESS;
	}
	
	public String logout() {
		ServletActionContext.getRequest().getSession().invalidate();
		return LOGIN;
	}
}

将登录成功之后的用户信息和菜单存放到session中,配置struts中对应的方法:

<!-- struts.xml -->
<action name="user_*" class="userAction" method="{1}">
	<result name="login">/jsp/login.jsp</result>
	<result name="loginSuccess" type="redirect">/jsp/index.jsp</result>
	<result name="input">/jsp/login.jsp</result>
</action>

编写在Action中出现的获取菜单和用户信息的方法,所需要的实体类现在只有简单pojo,就不给出了,service层的代码就是一个简单调用Dao层的方法,下面直接给Dao层的方法:

/* UserDao.java */

public class UserDao extends HibernateDaoSupport{
	
	@SuppressWarnings("unchecked")
	public List<User> login(String loginname, String password) {
		String hql = "from User U where U.loginname = ? and U.password = ?";
		List<User> list = this.getHibernateTemplate().find(hql, 
				new Object[] {loginname, password});
		return list;
	}
	
	public void update(User user) {
		this.getHibernateTemplate().update(user);
	}
/* MenuDao.java */
public class MenuDao extends HibernateDaoSupport {

	@SuppressWarnings("unchecked")
	public List<Menu> getAll() {
		String hql = "from Menu";
		return this.getHibernateTemplate().find(hql);
	}
	
	@SuppressWarnings("unchecked")
	public List<Menu> getSubMenu(Menu menu) {
		String hql = "from Menu M where M.parentId = ?";
		Integer id = menu.getMenuId();
		List<Menu> list =  this.getHibernateTemplate().find(hql,
				new Object[] {id});
		for(Menu child : list) {
			child.setHasMenu(true);
		}
		return list;
	}
	
	public List<Menu> getNeed(int index) {
		List<Menu> menus = this.getAll();
		List<Menu> parent = new ArrayList<Menu>();
		List<Menu> child = new ArrayList<Menu>();
		for(Menu menu : menus) {
			if(menu.getParentId() == null) {
				menu.setHasMenu(true);
				menu.setSubMenu(this.getSubMenu(menu));
				parent.add(menu);
			} else {
				child.add(menu);
			}
		}
		switch(index) {
		case 0 :
			//获取父菜单
			return parent;
		case 1 :
			//获取子菜单
			return child;
		}
		return null;
	}
} 

Menu.java有一个属性是hasMenu,用来前台做是否显示使用.

然后,前台页面index.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>测试系统</title>
<link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/css/index.css"/>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.5.1.min.js"></script>
</head>
<body>
	<% request.setCharacterEncoding("utf-8"); %>
	<div class="main_header">
		<div class="header_left"></div>
		<div class="header_right">
			<span id="sysTime"></span>
			<span>${user.username },您好!</span>
			<a href="javascript:logout();"><img src="${pageContext.request.contextPath}/images/out.gif" border="0"/></a>
		</div>
	</div>
	<div class="main_content">
		<div class="content_left">
			<c:forEach items="${menuList}" var="menu">
			<!-- 判断是否有权限 -->
				<c:if test="${menu.hasMenu}">
				<h1><a>${menu.menuName }</a></h1>
				<div class="menu_line">
					<ul>
					<c:forEach items="${menu.subMenu}" var="sub">
					<!-- 子菜单的权限判断 -->
						<c:if test="${sub.hasMenu}">
						<c:choose>
							<c:when test="${not empty sub.menuUrl}">
							<!-- url是否为空 -->
							<li><a href="${sub.menuUrl }" target="mainFrame">${sub.menuName }</a></li>
							</c:when>
							<c:otherwise>
							<!-- 如果为空直接改变tab的名字 -->
							<li><a href="javascript:void(0);" target="mainFrame">${sub.menuName }</a></li>
							</c:otherwise>
						</c:choose>
						</c:if>
					</c:forEach>
					</ul>
				</div>
				</c:if>
			</c:forEach>
		</div>
		<div class="content_center">&nbsp;</div>
		<div class="content_right">
			<table cellspacing="0" cellpadding="0">
				<tr style="height:29px;background: url('${pageContext.request.contextPath}/images/content-bg.gif') repeat-x;">
					<td style="height:29px;width:17px;background: url('${pageContext.request.contextPath}/images/left-top-right.gif') no-repeat;"></td>
					<td style="height:29px;line-height:29px;"><div class="content_title">首页</div></td>
					<td style="height:29px;width:16px;background: url('${pageContext.request.contextPath}/images/nav-right-bg.gif') no-repeat;"></td>
				</tr>
				<tr>
					<td style="background:url('${pageContext.request.contextPath}/images/mail_leftbg.gif') repeat-y;"></td>
					<td style="background-color:#FAFBFD;">
						<iframe name="mainFrame" id="mainFrame" frameborder="0" src="${pageContext.request.contextPath}/jsp/default.jsp" style="width:100%;height:100%;"></iframe>
					</td>
					<td style="background:url('${pageContext.request.contextPath}/images/mail_rightbg.gif') repeat-y;"></td>
				</tr>
				<tr style="background: url('${pageContext.request.contextPath}/images/buttom_bgs.gif') repeat-x;">
					<td style="height:17px;background: url('${pageContext.request.contextPath}/images/buttom_left2.gif') no-repeat;"></td>
					<td></td>
					<td style="height:17px;background: url('${pageContext.request.contextPath}/images/buttom_right2.gif') no-repeat;"></td>
				</tr>
			</table>
			<div class="sys_bottom"> Copyright &copy; 2011 XXX管理系统</div>
		</div>
	</div>
	
<script type="text/javascript">
$(document).ready(function(){
	getTime();
	window.setInterval(getTime, 1000);
	$("h1 a").bind("click",function(){
		var obj = $(this).parent().next();
		obj.slideToggle("fast","linear");
		//obj.fadeToggle("fast","linear");
	});
	$(".menu_line a").bind("click",function(){
		$(".content_title").html($(this).html());
		//$("#mainFrame").attr("src","");
		$(".menu_line a").css("background-image","url('${pageContext.request.contextPath}/images/menu_bg1.gif')");
		$(".menu_line a").css("color","#333333");
		$(".menu_line a").css("font-weight","normal");
		$(".menu_line a").bind({
			mouseover:function(){
				$(this).css("background-image","url('${pageContext.request.contextPath}/images/menu_bg2.gif')");
				$(this).css("color","#006600");
				$(this).css("font-weight","bold");
			},
			mouseout:function(){
				$(this).css("background-image","url('${pageContext.request.contextPath}/images/menu_bg1.gif')");
				$(this).css("color","#333333");
				$(this).css("font-weight","normal");
			}
		})
		$(this).css("background-image","url('${pageContext.request.contextPath}/images/menu_bg2.gif')");
		$(this).css("color","#006600");
		$(this).css("font-weight","bold");
		$(this).unbind("mouseout");
	});
	initRightContentHeightAndWidth();
});

function initRightContentHeightAndWidth(){
	var height = $(window).height()<$(document).height()?$(window).height():$(document).height();
	var width = $(window).width()<$(document).width()?$(window).width():$(document).width();
	$(".content_right table").width(width-$(".content_left").width()-$(".content_center").width());
	$(".content_right table tr:eq(1) td").height(height-$(".main_header").height()-$(".sys_bottom").height()-46);
}

function getTime(){
	var date = new Date();
	var y = date.getFullYear();
	var m = date.getMonth()+1;
	var d = date.getDate();
	var h = date.getHours();
	var i = date.getMinutes();
	var s = date.getSeconds();
	$("#sysTime").html(y+"年"+(m>9?m:("0"+m))+"月"+(d>9?d:("0"+d))+"日 "+(h>9?h:("0"+h))+":"+(i>9?i:("0"+i))+":"+(s>9?s:("0"+s)));
}

function logout(){
	if(confirm("确定要退出吗?")){
		document.location = "user_logout.html";
	}
}
</script>
</body>
</html>

自定义一个Inteceptor来拦截未登录的用户:

@Component
public class AuthInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		User user = (User) ServletActionContext.getRequest().
				getSession().getAttribute("user");
		if(user != null) {
			String result = invocation.invoke();
			return result;
		}
		return "error";
	}

}

在struts中配置自定义拦截器:

		<interceptors>
			<interceptor name="authInterceptor" class="authInterceptor"></interceptor>
			<interceptor-stack name="myStack">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="authInterceptor"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
	
		<action name="user_*" class="userAction" method="{1}">
			<result name="error">/jsp/login.jsp</result>
			<result name="login"  type="redirect">/auth/auth.html</result>
			<result name="loginSuccess" type="redirect">/auth/auth.html</result>
			<result name="input">/jsp/login.jsp</result>
		</action>
		
		<action name="index" class="indexAction">
			<result>/jsp/login.jsp</result>
		</action>
		
		<action name="auth" class="authAction" method="authCheck">
			<result>/jsp/index.jsp</result>
			<result name="error" type="redirect">/auth/index.html</result>
			<interceptor-ref name="myStack"></interceptor-ref>
		</action>

将之前的也修改一下,改成重定向模式.

然后访问auth.html如果未登录会跳转到登录界面,然后登录:

这些已经是自己再数据库中插入了一些测试数据,显示成功.

© 著作权归作者所有

共有 人打赏支持
丶KKdo
粉丝 1
博文 24
码字总数 13683
作品 0
成都
程序员
openstack manila服务折腾笔记

国庆在家折腾了一把openstack manila,看了下现网还没有中文的manila入门介绍,于是决定写个笔记贴出来 一、manila简介 和我们传统存储服务器一样,openstack的存储也分为3种:块存储(cinder),对...

superbigsea
2017/10/07
0
0
expect实现自动交互由浅入深

expect实现自动交互由浅入深 作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如t...

JAYZ_HAO
2017/10/14
0
0
Ubuntu-16.04 部署 OpenStack Ocata

六、配置 Dashboard 仪表盘服务(Controller Node) 1.配置Dashboard # apt -y install openstack-dashboard vim /etc/openstack-dashboard/local_settings.py OPENSTACK_HOST = "192.168.30.......

结束的伤感
2017/04/01
0
0
Moving to Docker(二)搭建一个私有registry服务

这是迁移到Docker系列的第二篇,整个系列都是介绍我们公司是如何把基础设施从PaaS迁移到Docker的。 第一篇:我会介绍在使用Docker之前我们的处理过程。 第三篇:我会介绍如何自动化构建整个镜...

DockOne
2015/02/04
0
0
逆天的H3C Comware V7 RBAC

学过H3C设备的朋友都知道,在Comware V5及以前版本中,用户权限是由"命令级别"和"用户级别"结合来配置的, 而在最新的Comware V7版本中,却为此引入了一些全新的概念——用户角色、用户线、资...

茶乡浪子
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
34分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
39分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
46分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
49分钟前
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部