您的位置:首页 > 编程语言 > Java开发

Struts2拦截器实现登录权限控制(十二)

2017-12-27 17:32 736 查看
(一)拦截器实现权限控制

1.实现原理

1.用户登录成功后,把用户的信息保存到session对象中去。

2.拦截器获取Session对象中保存的User信息,判断user对象是否为空,如果为空跳转到登陆界面,如果不为空登录的用户,可以在自己的权内访问任何Action对象。

2.说明

Struts2的登录和权限控制 用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultStack。因为登录和访问权限拦截是全局的,拦截返回的结果有些也是全局的,所以我定义了自己的package以便引用。

3.实现步骤

1.创建表单

2.创建User类封装数据

3.创建LoginAction类和ShowAction,并使用Session保存User对象的数据

4.创建自定义拦截器类,获取Session对象保存的数据并判断。

5.在struts.xml文件中配置自定义拦截器。

(二)登录权限控制实例演示

1.创建表单

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>
</head>
<body>

<form action="login" method="post">
账号:<input type="text" name="user.username"/><br><br>
密码:<input type="password" name="user.password"/><br><br>
<input type="submit" value="登陆">      
<input type="reset" value="清空">
</form>
</body>
</html>


2.创建User类封装数据

package com.wang;
public class User {
private String username;
private String password;
setter和getter方法
}


3.创建LoginAction类

package com.wang;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {

private static final long serialVersionUID = 1L;
private User user;
public String excute(){
if(user.getUsername().equals("123")&&user.getPassword().equals("123")){
//1.保存登陆成功的用户数据
/*ServletActionContext.getRequest().getSession().setAttribute("User",user.getUsername());
ServletActionContext.getRequest().getSession().setAttribute("Pwd", user.getPassword());*/
ServletActionContext.getRequest().getSession().setAttribute("User", user);
return Action.SUCCESS;
}
return Action.ERROR;
}
public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}


4.创建ShowAction类

package com.wang;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class ShowAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public String show() {
return Action.SUCCESS;
}

}


5.创建自定义拦截器类

package com.intercepter;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
//1.继承AbstractInterceptor,覆盖intercept()方法
public class MyIntercepter  extends AbstractInterceptor{

private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {

/**
* 1.判断是否是login,如果是执行下一个拦截器
* 2.如果不是判断是否登陆,如果登陆执行下一个拦截器
* 3.如果没有登陆就访问,那么就会跳转到登陆界面
*/
String actionname=invocation.getProxy().getActionName();
//打印浏览器所访问的Action的url
System.out.println("获取请求Action的url=="+actionname);
if(actionname.equals("login")){
System.out.println("如果是提交表单请求action的url,那么放行!");
return invocation.invoke();
}
Object obj=invocation.getInvocationContext().getSession().get("User");
//意味着没有登陆,属于非法,因此需要跳转到登陆首页
if(obj==null){
System.out.println("未经登陆的非法用户,请求其他action的URL,那么跳转到登陆界面");
return Action.LOGIN;
}
return invocation.invoke();

}

}


6.在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>
<constant name="struts.devMode" value="true" />
<package name="wang" namespace="/" extends="struts-default">
<!-- 1.自定义过滤器 -->
<interceptors>
<!-- 2.配置一个或多个拦截器 -->
<interceptor name="myIntercepter" class="com.intercepter.MyIntercepter"/>
<!-- 3.定义拦截器栈 -->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="myIntercepter" />
</interceptor-stack>
</interceptors>
<!--4.配置默认拦截器,对整个包下的action都有效-->
<default-interceptor-ref name="mydefault"/>
<!--5.配置拦截器返回的逻辑视图-->
<global-results>
<result name="login">/index.jsp</result>
</global-results>
<action name="login" class="com.wang.LoginAction" method="excute">
<result>/success.jsp</result>
<result name="error">/failure.jsp</result>
</action>
<!--6.如果用户非法登陆是无法访问到此路径下的show.jsp  -->
<action name="show" class="com.wang.ShowAction" method="show">
<result>/show.jsp</result>
</action>
</package>
</struts>


7.结果演示





注意:

1.未登录请求:http://localhost:8888/Project01/show,仍然跳转到原来页面。

2.登录后请求:http://localhost:8888/Project01/show,才能访问其他action。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: