学习struts2框架,自定义一个拦截器,来实现一个简单的权限问题。
对于一个系统的删除按钮,只有登录的人才可以进行删除,就会跳转到一个成功页面。
那么登录的人,在session中就有用户信息,如果session中存在的用户不为null,就表示有人登录;
如果没有人登录的话,进行删除功能,就会返回登录页面,同时提示“用户未登录,请先登录”
展示一波效果
1.先看看我们删除按钮的页面
2.现在我们没有登录,看看点这个链接有什么效果:
3.然后登录一波:
4.成功登录后:
5.到这里,session中就有了bigface用户。这个时候载次点击“删除功能”的链接。
扫描二维码关注公众号,回复:
4917854 查看本文章
下边是代码部分:
1.先是几个前端页面:
1).删除链接的一个页面 del.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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>Insert title here</title>
</head>
<body>
欢迎来到删除功能的页面
</tr>
<!-- 这里写一个链接跳转到一个action中 -->
<a href="/SSHProject/delAction" >删除功能</a>
</body>
</html>
2).登录页面login2.jsp
<%@ 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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>${msg }</br>
<form action="loginAction" ,method="post">
这个是登录网页</br><!-- 添加一个换行符 -->
用户名:<input type="text" name="username" /><br>
密码:<input type="password" name="password" /><br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
3).成功删除页面 success3.jsp
<%@ 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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
这里是成功删除后的网页:</br><!-- 添加了一个换行符 -->
<!-- 下边使用el来获取数据 -->
用户名: ${username} 进行了删除操作
</body>
</html>
2.java代码部分;
1):拦截器部分:
package cqupt.ssh.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class PrivilegeInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
ActionContext context=invocation.getInvocationContext();
Object username = context.getSession().get("username");
// 如果session中有用户,就放行
if(username!=null){
return invocation.invoke();
}else{
context.put("msg", "您还没有登录,请先登录!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
return "login2";
}
}
}
这个拦截器后期需要写到struts.xml中,同时用于控制DelAction这个动作。
2)DelAction.java这个action在配置中会配入上边写的拦截器,就是只有用户登录过后(session中用户不为null)。才可以进行删除操作。
package cqupt.ssh.action;
public class DelAction {
public String del() {
System.out.println("这里进行了删除工作了");
return "success3";
}
}
3)下边是登录功能的action
package cqupt.ssh.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction {
/*
* 写一个登录功能, 目的就是将前端传来的用户名放入到session中,
* 后边如果使用删除功能的时候, 就是要查询这个session中是否有这个用户名
*/
// 来一个属性驱动装前端传来的数据
private String username;
public void setUsername(String username) {
this.username = username;
}
public String login() {
if (username.equals("bigface")) {
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
// 这里是将用户名存入了session
session.put("username", username);
return "del";
}else{
//如果用户名错误,就返回登录页面
return "login2";
}
}
}
3.开始配置文件:
1)首先是web.xml中要配置struts2的核心过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>SSHProject</display-name>
<!-- struts2的核心过滤器 -->
<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>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
2).配置我们的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>
<package name="cqupt" namespace="/" extends="struts-default">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="privilege"
class="cqupt.ssh.interceptor.PrivilegeInterceptor" />
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="privilege" />
</interceptor-stack>
</interceptors>
<!-- 下边开始写action ,第一个action是登录使用的 -->
<action name="loginAction_*" class="cqupt.ssh.action.LoginAction"
method="login">
<result name="login2">/login2.jsp</result>
<result name="del">/del.jsp</result>
</action>
<!-- 下边的action是del方法使用的 ,下边的action name也可以写成name="delAction_*然后重前端传入方法来 -->
<action name="delAction_*" class="cqupt.ssh.action.DelAction"
method="del">
<result name="success3">/success3.jsp</result>
<result name="login2">/login2.jsp</result>
<!-- 在这个action中,使用自定义的拦截器 -->
<interceptor-ref name="myStack" />
</action>
</package>
</struts>
运行并测试:
访问方式1:先访问还没有登录的一个删除页面,直接删除一波看看。(这个方式完整过程参考最开始的展示部分)
输入网页:http://localhost:8080/SSHProject/del.jsp
点击删除链接后:
访问方式2:
也可以先访问我们的登录页面:http://localhost:8080/SSHProject/login2.jsp
下边我们来登录,这里我设置的正确用户名是bigface,如果输入错误:
点击登录过后:
然后再正确登录:
点击登录后就进入了操作页面,这里写了一个删除功能的操作:
点击删除功能: