本文主要在于介绍如何利用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不久。