文档章节

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

丶KKdo
 丶KKdo
发布于 2016/08/11 17:05
字数 1334
阅读 16
收藏 0
点赞 0
评论 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
博文 22
码字总数 13683
作品 0
成都
程序员
openstack manila服务折腾笔记

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

superbigsea ⋅ 2017/10/07 ⋅ 0

expect实现自动交互由浅入深

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

JAYZ_HAO ⋅ 2017/10/14 ⋅ 0

docker环境配置

转发自http://www.blogjava.net/yongboy/archive/2013/12/12/407498.html docker官网:https://www.docker.io/ github源码:https://github.com/dotcloud/docker 原文 前言 Docker旨在提供一......

leaf志良 ⋅ 2013/12/17 ⋅ 10

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

Moving to Docker(二)搭建一个私有registry服务

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

DockOne ⋅ 2015/02/04 ⋅ 0

逆天的H3C Comware V7 RBAC

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

茶乡浪子 ⋅ 2017/03/03 ⋅ 0

Apache Shiro 使用手册(三)Shiro 授权

一、授权的三要素 授权有着三个核心元素:权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清...

heroShane ⋅ 2014/02/10 ⋅ 0

KVM虚拟化管理平台VManagePlatform

VManagePlatform是什么? 一个KVM虚拟化管理平台 开发语言与框架: 编程语言:Python2.7 + HTML + JScripts 前端Web框架:Bootstrap 后端Web框架:Django 后端Task框架:Celery + Redis VMan...

welliamcao ⋅ 2017/02/20 ⋅ 0

RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一:对某一个用户只授予一些特殊的权限 描...

郭恩洲_OSC博客 ⋅ 2015/02/26 ⋅ 0

CentOS中安装subversion,并使用svn+ssh访问

一、Subversion的传输协议 Subversion可以支持以下多种传输协议,以便客户端和仓库之间进行数据版本控制:   引用 file:// 本地数据传输 http:// 基于Apache的HTTP协议(明文) https:// 基...

wangfeng7399 ⋅ 2015/08/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

关于“幂等”操作

一个幂等(idempotent)操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同. 开发中, 我们经常考虑幂等操作的场景有“接口调用”、“MQ消费”、“自动任务”等 接口调用, 可能出现...

零二一七 ⋅ 33分钟前 ⋅ 0

Dubbo服务服务暴露之ProxyFactory Invoker

Dubbo服务暴露过程中有涉及到调用ProxyFactory 中方法获取Invoker对象的过程,现在我们来深究下源码,来看下这个过程是在做些什么,返回的Invoker 对象是什么,我们来看一下代码的切入点: ...

哲别0 ⋅ 47分钟前 ⋅ 0

GP两种连接方式性能测试

GP两种连接方式性能测试 Pivotal import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class GPQueryStrin......

仔仔1993 ⋅ 52分钟前 ⋅ 0

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 今天 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 今天 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 今天 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 今天 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 今天 ⋅ 0

linux 信号机制

signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协...

xxdd ⋅ 今天 ⋅ 0

my.cnf, my-small.cnf, my-medium.cnf, my-large.cnf

1. my-small.cnf # Example MySQL config file for small systems.## This is for a system with little memory (<= 64M) where MySQL is only used# from time to time and it's importa......

周云台 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部