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