拦截器

登录拦截器
public class LoginInterceptor extends AbstractInterceptor {
	@Resource
	private IdentityService identityService;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		/** 获取Session中的用户 */
		User user = (User) invocation.getInvocationContext().getSession()
				.get(AdminConstant.SESSION_USER);
		System.out.println("session_user:" + user);
		/** 定义标记 */
		boolean isLogin = false;
		if (user == null) {
			/**  获取Cookie */
			Cookie cookie = CookieTools.getCookie(AdminConstant.COOKIE_NAME);
			if (cookie != null) {
				/** 获取Cookie的值 userId(md5加密) */
				String userId = cookie.getValue();
				/** 获取用户 */
				user = identityService.getUser(userId, true);
				if (user != null) {
					/** 存入Session */
					invocation.getInvocationContext().getSession()
							.put(AdminConstant.SESSION_USER, user);
					<span style="background-color: rgb(255, 0, 0);">/** 根据用户id查询所有的角色,再根据角色查询所有的权限 */
					Map<String, List<String>> userAllPopedoms = identityService
							.getUserAllPopedoms(user.getUserId());
					/** 存入Session */
					invocation
							.getInvocationContext()
							.getSession()
							.put(AdminConstant.USER_ALL_POPEDOMS,
									userAllPopedoms);</span>
				} else {
					isLogin = true;
				}
			} else {
				isLogin = true;
			}
		}
		return isLogin ? Action.LOGIN : invocation.invoke();
	}

}
</pre><pre name="code" class="html">


登录方法拦截

@Override
	public Map<String, Object> login(String userId, String password,
			String vcode, int key) {
		try {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("tip", "验证码不正确!");
			map.put("status", 1);
			/** 获取Session中的验证码 */
			String code = (String) ActionContext.getContext().getSession()
					.get(VerifyAction.VERIFY_CODE);
			/** 判断验证码是否正确 */
			if (code != null && code.equalsIgnoreCase(vcode)) {
				/** 判断用户名与密码 */
				if (!StringUtils.isEmpty(userId)
						&& !StringUtils.isEmpty(password)) {
					/** 查询用户 */
					User user = getUser(userId, false);
					/** 判断用户与用户密码 */
					if (user != null
							&& user.getPassWord().equals(MD5.getMD5(password))) {
						// 判断用户状态码
						if (user.getStatus() == 1) {

							/** 存入Session */
							ActionContext.getContext().getSession()
									.put(AdminConstant.SESSION_USER, user);
							/** 判断key 是否可以记住用户 */
							if (key == 1) {
								/** 记住用户,操作cookie */
								CookieTools
										.addCookie(AdminConstant.COOKIE_NAME,
												user.getUserId(),
												AdminConstant.MAX_AGE);
							}

							map.put("tip", "登录成功!");
							map.put("status", 0);

							<span style="background-color: rgb(255, 0, 0);">/** 根据用户Id查询所有的角色,再根据角色查询所有的权限 */
							Map<String, List<String>> userAllPopedoms = getUserAllPopedoms(user
									.getUserId());
							/** 存入Session 保存用户 */
							ActionContext
									.getContext()
									.getSession()
									.put(AdminConstant.USER_ALL_POPEDOMS,
											userAllPopedoms);</span>
						} else {
							// //0新建,1审核,2不通过审核,3冻结
							// 分析,把他们放到数组中,通过下标来读取,审核放在里面咩关系
							// 反正读取不到,如果不填,会更加麻烦,善于思考利用
							String[] arr = { "新建", "审核", "不通过审核", "冻结" };
							map.put("tip", "您处于【" + arr[user.getStatus()]
									+ "】状态,请联系管理员!");
							map.put("status", 4);
						}

					} else {
						map.put("tip", "用户名或密码不正确!");
						map.put("status", 3);
					}
				} else {
					map.put("tip", "用户名或密码不能为空!");
					map.put("status", 2);
				}
			}
			return map;
		} catch (Exception e) {
			throw new OAException("登录方法是出现异常!", e);
		}

	}

为什么两个类里面都使用获取所有权限?

双向选择

因为一个是存在Cookie里面,记住用户的时候就会从cookie里面获取权限。

另外一个是第一次登录的时候,里面是没有cookie,这时就要在登录的时候获取权限。


<package name="admin" namespace="/admin" extends="oa">
    	<!-- 配置拦截器 -->
    	<interceptors>
    		<!-- 配置登录拦截器 -->
    		<interceptor name="loginInterceptor" class="cn.itcast.oa.admin.interceptor.LoginInterceptor"></interceptor>
    		<!-- 配制权限拦截器 -->
    		<interceptor name="popedomInterceptor" class="cn.itcast.oa.admin.interceptor.PopedomInterceptor"></interceptor>
    		<!-- 配置登录拦截器栈 -->
    		<interceptor-stack name="loginStack">
    			<interceptor-ref name="defaultStack"></interceptor-ref>
    			<interceptor-ref name="loginInterceptor"></interceptor-ref>
    		</interceptor-stack>
    		<!-- 配置权限拦截器栈 -->
    		<interceptor-stack name="popedomStack">
    			<interceptor-ref name="loginStack"></interceptor-ref>
    			<interceptor-ref name="popedomInterceptor"></interceptor-ref>
    		</interceptor-stack>
    	</interceptors>
    	
    	<!-- 这里把<span style="font-family: Arial, Helvetica, sans-serif;">popedomStack</span>配置成全局默认的拦截器引用,为了防止不随便访问登录(
<span style="font-family: Arial, Helvetica, sans-serif;">popedomStack</span>要想成为全局默认的拦截器,就要先引入defaultStack这个默认拦截器,然后在
下面引入自己的<span style="font-family: Arial, Helvetica, sans-serif;">popedomInterceptor</span>拦截器,这样就会覆盖默认的defaultStack拦截器
    			下面有例子) -->
    	<default-interceptor-ref name="popedomStack"></default-interceptor-ref>
<span style="font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-family: Arial, Helvetica, sans-serif;"><!-- 多条件分页查询用户 --></span>
		<action name="selectUser" class="cn.itcast.oa.admin.identity.action.UserAction" method="selectUser">
			<result>/WEB-INF/jsp/admin/identity/user/user.jsp</result>
		</action>
		
			
		<!-- 异步验证登录名是否重复 -->
		<action name="validUserIdAjax" class="cn.itcast.oa.admin.identity.action.IdentityAjax" method="validUserIdAjax">
			<interceptor-ref name="loginStack"/>
			<result type="json">
				<!-- JSONResult类中setRoot方法来指定 调用当前Action的哪个get方法返回响应数据
        			getResponseData(),还有一种方法就是对于要拿多个数据时,用注解@JSON即可直接可以拿数据
        			如果只有拿一个对象就用配置好一些,像下面这个就是
        		 -->
				<param name="root">userIdExistData</param>
			</result>
		</action>
		
		
		<!-- 添加用户 -->
		<action name="addUser" class="cn.itcast.oa.admin.identity.action.UserAction" method="addUser">
			<!-- 先把默认拦截器引入进来,然后再使用自己的拦截器,才能覆盖默认的拦截器 -->
			<interceptor-ref name="popedomStack"></interceptor-ref>
			<!-- 添加防表单重复提交拦截器 -->
			<interceptor-ref name="token"></interceptor-ref>
			<!-- addUser方法的返回值 -->
			<result>/WEB-INF/jsp/admin/identity/user/addUser.jsp</result>
			<!-- 表单重复提交时需要找到的视图,可以在视图页面输出提示信息用来提示用户 -->
			<result name="invalid.token">/WEB-INF/jsp/admin/identity/user/addUser.jsp</result>
			<!-- 后台validation.xml校验失败时,会找的视图,可以在视图页面输出提示信息用来提示用户 -->
			<!-- 后台输入校验:提供xxx-xxx-validtion.xml
          					格式:	Action的类名-action的name属性值-validation.xml
          							UserAction-addUser-validation.xml -->
			<result name="input">/WEB-INF/jsp/admin/identity/user/addUser.jsp</result>
		</action>	
</packege>		
为什么有的要权限拦截器,有的配登录拦截器,有的不填拦截器

主要看页面有没有权限,数据库里面有权限地址就写权限拦截器,没有权限就配登录拦截器,因为要是数据库里面没有配置权限的请求地址,但是又使用的是默认权限拦截器,那么就会访问不了,除非引用登录拦截器才可以访问。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值