简单的利用Struts2拦截器实现权限校验

来源:互联网 发布:七天网络注册登录查分 编辑:程序博客网 时间:2024/05/22 07:49

本文主要在于介绍如何利用struts2去实现权限校验,对于struts2开发环境的搭建,网上已经有很多的教程,这里就不进行一一介绍了。
关于权限校验,首先需要注意的点:
1,在web项目中,在WEB-INF文件夹中的文件,直接访问时访问不了的,我们可以通过struts2中的action去访问。
2,拦截器与action的关系,是类似递归的关系,当然实际上不是(个人的理解,做成比喻,不恰当请大牛指正。),如我们访问action中,我们先要通过拦截器,再到action,执行完成后,再通过拦截器,最后才返回我们要return的参数。
3,使用的环境:struts-2.3.24.1,eclipse-jee-mars-2-win32-x86_64,jdk 1.8
实现权限校验的步骤原理:假如在拦截器里不调用invoke方法,那么拦截器里的值会返回到Struts.xml文件中的result,假如调用invoke方法,action中的值会返回到result中,利用这种机制可以验证登录。

也就是说通过拦截器,我们拦截到来自action的返回的参数,如果检测到登录成功,我们就放行,否则,我们返回的就是其他的值。

接下来就是具体的实现:
1,web.xml的代码:
路径:WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>Struts2_study</display-name><filter>    <filter-name>struts2</filter-name>    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping>    <filter-name>struts2</filter-name>    <url-pattern>/*</url-pattern></filter-mapping><welcome-file-list>    <welcome-file>index.html</welcome-file></welcome-file-list></web-app>

2,struts.xml代码
路径:src/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.enable.DynamicMethodInvocation" value="false" /><constant name="struts.devMode" value="true" /><package name="default"  extends="struts-default">    <!-- 注册拦截器 -->    <interceptors>          <interceptor name="gotomanageinterceptor"class="com.lbf.interceptors.GotoManageInterceptor"></interceptor>        <!-- 自定义拦截器栈 -->        <interceptor-stack name="mystack">            <interceptor-ref name="defaultStack"></interceptor-ref>            <interceptor-ref name="gotomanageinterceptor"></interceptor-ref>        </interceptor-stack>    </interceptors>    <action name="gotomanage"  >        <result name = "success">/WEB-INF/jsp/manage.jsp</result>        <result name = "error">/login.jsp</result>        <interceptor-ref name="mystack"></interceptor-ref>    </action>    <action name="login"  class = "com.lbf.struts.GotoManage">        <result name = "success">/WEB-INF/jsp/manage.jsp</result>        <result name = "error">/login.jsp</result>    </action></package></struts>

3,创建登录页面login.jsp
路径:/login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>    <!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><p><a href="index.jsp">Home</a></p><form action="login.action" method="get">        <p>username: <input type="text" name="name" /></p>        <p>password: <input type="password" name="psw" /></p>        <p><input type = "submit"  value = "登陆">${LoginError} </p></form></body></html>

4,创建访问的文件(假设是后台管理页面)manage.jsp
路径:WEB-INF/jsp/manage.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!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><p>这是后台管理页面</p></body></html>

5,创建错误页面error.jsp(这个主要是我们可以在web项目中的struts.xml配置默认的错误页面,在这里为了简单,我没有进行配置)

路径:WEB-INF/jsp/error.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"        pageEncoding="utf-8"%>    <!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>    <p>这是错误页面</p>    </body>

6,创建gotomanage.action的具体实现类GotoManage.java
路径:src/com/lbf/struts/GotoManage.java

package com.lbf.struts;import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionSupport;public class GotoManage extends ActionSupport implements SessionAware{    private static final long serialVersionUID = 1L;    private String name;    private String psw;    private Map<String, Object> session;    public void  setSession(Map<String, Object> session) {        this.session = session;    }    @Override    public String execute() throws Exception {        if ("linbingfeng".equals(name)&&"123".equals(psw)) {            session.put("LoginInfo", name);            return SUCCESS;        }else{            session.put("LoginError", "你没有权限查看");            return ERROR;        }    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPsw() {        return psw;    }    public void setPsw(String psw) {        this.psw = psw;    }}

7,创建拦截器的具体实现类GotoManageInterceptor.java
路径:src/com/lbf/interceptors/GotoManageInterceptor.java

package com.lbf.interceptors;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class GotoManageInterceptor extends AbstractInterceptor {    private static final long serialVersionUID = 1L;    @Override    public String intercept(ActionInvocation invocation) throws Exception {        //通过获取session来获得登录信息        ActionContext context = ActionContext.getContext();        Map<String, Object> session = context.getSession();            if (session.get("LoginInfo")!=null) {                String result = invocation.invoke();                return result;            }else{                return "error";            }    }}

这个项目也许还有许多需要改善的地方,有什么错误的地方,还请大家一起来交流学习,我也是一个刚刚学习struts2不久。

1 0
原创粉丝点击