使用拦截器实现权限控制

来源:互联网 发布:lol淘宝cdk是真的吗 编辑:程序博客网 时间:2024/05/16 17:06

添加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">            <result>/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

原创粉丝点击