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

使用拦截器实现权限控制

2017-10-18 16:37 363 查看
添加struts配置文件和jar包:点击工程名—-MyEclipse—Add Struts Capp…——-选择版本 —–next——–再回去配置以下Struts.xml文件

在struts.xml中写以下的配置

下面是4个开发模式常用配置的简介—

<!-- 开启使用开发模式,详细错误提示 -->
<!-- <constant name="struts.devMode" value="true"/>-->
<!-- 指定每次请求到达,重新加载资源文件 -->
<!-- <constant name="struts.i18n.reload" value="true"/>-->
<!-- 指定每次配置文件更改后,自动重新加载 -->
<!-- <constant name="struts.configuration.xml.reload" value="true"/>-->
<!-- 指定XSLT Result使用样式表缓存 -->
<!-- <constant name="struts.xslt.nocache" value="true"/>-->


完成后去创建页面

struts.xml

<struts>
<constant  name=”struts.enable.DynamicMethodInvocation”   value=”false”/>
<constant  name=”struts.devMode”  value=”true”/>
<package  name=”default”  namespace=”/”  extends=”struts-default” >
通过此Action访问后台管理页面
<action name=”auth”>
<result>/WEB-INF/page/manager.jsp</result>
</action>
</package>
</struts>


使用拦截器进行用户权限验证:

1.创建被访问的资源(如后台管理页面manager.jsp),将其放到WEB-INF下(外部不能直接访问)

2.创建authAction将请求转发到被访问的资源(manager.jsp)

3.创建登录页面login.jsp接收用户登录信息

4.创建loginAction处理登录请求,校验登录信息并将有效登录信息或错误信息放到session中(其中有效登录信息loginInfo用于步骤5拦截器校验会话信息,错误信息用于前台页面展示)

5.创建拦截器authInterceptor对访问authAction的请求进行拦截处理,通过ActionContext获取会话session,并校验session的登录信息,如果不为空,即获取权限,放行,否则拦截并转发到登录界面

总结:如果只是一次登录的话,这里的2和5确实看起来很多余,但这个功能实际是为了多页面访问时校验同一个session下是否有权限,因此使用了2个action进行请求转发,当第一次登录之后,用户只需要直接访问authAction就可以访问到后台资源,无需再次登录。

注意:WEB-INF是Java的WEB应用的安全目录,所谓的安全就是客户端无法访问,只有服务端可以访问的目录。WEB-INF里的文件默认情况下是不允许被外部直接访问的,可以通过action间接来访问,如果action的class不写,则默认是ActionSupport这个类。

@login.jsp

信息:${session_error}
<form action="Login" method="post"><!-- 默认情况下:Login.action或Login都行。 -->
用户名:<input name="user" type="text" />
密码:<input name="pwd" type="password" />
<input value="Login" type="submit" />
</form>


@manager.jsp

后台管理页面。只有已登录的用户才能访问!

@struts.xml

<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 注册拦截器 -->
<!-- Ps:拦截器栈内的拦截器(除了默认拦截器)的name要与拦截器栈外的拦截器要一致,因为引用拦截器栈的时候,里面的拦截器是从外面的拦截器中的class引用的 -->
<interceptors>
<interceptor name="AuthI" class="com.imooc.interceptor.AuthInterceptor"></interceptor>
<!-- 自定义拦截器mystack:组合了defaultStack和AuthI -->
<interceptor-stack name="mystack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="AuthI"></interceptor-ref>
</interceptor-stack>
</interceptors>

<!-- 通过此Action访问后台管理页面,需要判断用户是否已登录,如果未登录则跳转到登录页面 -->
<action name="Auth">
<res
4000
ult>/WEB-INF/page/manager.jsp</result>
<result name="login">/login.jsp</result>
<!-- 引用自定义的拦截器 -->
<interceptor-ref name="mystack"></interceptor-ref>
</action>

<action name="Login" class="com.imooc.action.LoginAction" method="login">
<result>/WEB-INF/page/manager.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>
</struts>


@LoginAction.java

public class LoginAction extends ActionSupport implements SessionAware{
private String user;
private String pwd;
private Map<String,Object> session;
public void setSession(Map<String, Object> session) {
this.session=session;
}
// setter/getter...
public String login(){
if("admin".equals(user)&&"admin".equals(pwd)){
session.put("session_user", user);
return SUCCESS;
}else{
session.put("session_error", "用户名或密码不正确!");
return ERROR;
}
}
}


@AuthInterceptor.java

public class AuthInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context=ActionContext.getContext();
Map<String , Object> session=context.getSession();
if(session.get("session_user")!=null){
String result=invocation.invoke();
return result;
}else{
return "login";
}
}
}


参考自视频:http://www.imooc.com/video/9143
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts