Struts2登录拦截器的简单示例
来源:互联网 发布:年代四部曲 知乎 编辑:程序博客网 时间:2024/06/12 20:44
登录拦截几乎每个WEB系统都会用到.在这里记录一下自己对于Struts2登录拦截的简单实现.
逻辑也非常简单: 用户通过登录页面,进入到主页.如果不通过登录强行进入到主页,则会调转到登录页面.
1.前台的JSP页面
登录页-UserLogin.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>User Login</title></head><body> <form action="user.action" method="post"> <table border="1"> <tr> <td>Username:</td> <td><input type="text" name="user.username" style="width: 100%"/></td> </tr> <tr> <td>Password:</td> <td><input type="password" name="user.password" style="width: 100%"/></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="登录"/> <input type="reset" value="重置"/> </td> </tr> </table> </form></body></html>
可以看到上面这段代码中form表单将数据提交到了user.action当中
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Login Success</title></head><body> <span>登录成功</span><br/> <span>当前用户: ${currentUser.username}</span><br/> <span><a href="main.action">跳转</a>到主页</span></body></html>上面是登录成功后的页面,将会显示登录的用户名以及一个跳转到main.action的链接
Main页-MainPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Main Page</title></head><body> <span>主页</span><br/> <span>当前用户: ${currentUser.username}</span></body></html>同样,这个主页也会显示用户名.
错误页-ErrorPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Error Page</title></head><body> <span>${error}<a href="UserLogin.jsp">登录</a></span></body></html>错误页将会显示从Action/Interceptor传过来的错误信息,并且给出了跳转会登录页的链接.
2.后台代码
创建JavaBean
首先要建立一个User的JavaBean.内置的属性自然是username和password.
package com.struts.model;public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
创建登录Action-LoginAction
package com.struts.action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.struts.model.User;import org.apache.struts2.ServletActionContext;import javax.servlet.http.HttpServletRequest;import java.util.Map;public class LoginAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { if ("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())) { // 获取ActionContext ActionContext actionContext = ActionContext.getContext(); // 获取Session Map<String, Object> session = actionContext.getSession(); session.put("currentUser", this.user); System.out.println("登录成功"); return SUCCESS; } else { // 通过ActionContext获取request对象 HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); request.setAttribute("error", "用户名密码错误,请重新"); System.out.println("登录失败"); return ERROR; } }}这里做的比较简单,只允许用户名/密码同为admin的用户登录.但其原理是通过ActionContext获取Session,并把设置了用户名/密码的User对象放入到Session当中.随后返回SUCCESS.相反,如果输入的用户名/密码不为admin,则通过ActionContext获取request对象.并把错误信息放置到request对象当中,最后返回ERROR.
创建拦截器-AuthInterceptor
package com.struts.intercept;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import org.apache.struts2.ServletActionContext;import javax.servlet.http.HttpServletRequest;import java.util.Map;public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation actionInvocation) throws Exception { ActionContext actionContext = actionInvocation.getInvocationContext(); Map<String, Object> session = actionContext.getSession(); Object currentUser = session.get("currentUser"); String result = null; if (currentUser != null) { result = actionInvocation.invoke(); } else { HttpServletRequest request = (HttpServletRequest) actionInvocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST); request.setAttribute("error", "还未登录,请先"); result = "error"; } return result; }}这个拦截器很简单,首先ActionInvocation获取用户的Session.检查这个Session是否带有用户的信息(currentUser).如果currentUser不用为空,则代表当前用户已经登录过.继续执行actionInvocation.invoke(),返回SUCCESS,通过拦截器.如果currentUser为空,则代表用户并没有登录.此时通过actionInvocation获取request对象,将错误信息放置到request对象的属性当中.最后将result设置为ERROR.并返回.
主页的Action-MainAction
package com.struts.action;import com.opensymphony.xwork2.ActionSupport;public class MainAction extends ActionSupport { @Override public String execute() throws Exception { System.out.println("进入主页"); return SUCCESS; }}在用户等会之后,登录成功也会有一个超链接,这个链接地址则是上面的MainAction.当MainAction的execute方法执行完毕之后会跳转到对应的MainPage.jsp当中.整个过程结束.
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="true"/> <constant name="struts.devMode" value="true"/> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="loginInterceptor" class="com.struts.intercept.AuthInterceptor"/> <interceptor-stack name="AuthStack"> <interceptor-ref name="loginInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="AuthStack"/> <global-results> <result name="error">ErrorPage.jsp</result> </global-results> <action name="user" class="com.struts.action.LoginAction"> <result name="success">LoginSuccess.jsp</result> <interceptor-ref name="defaultStack"/> </action> <action name="main" class="com.struts.action.MainAction"> <result name="success">MainPage.jsp</result> </action> </package></struts>这是登录拦截的最主要部分,它直接关系着登录拦截是否实现正确,
在package标签当中,首先创建自定义的拦截器loginInterceptor.并且要创建一个全局的拦截器栈,当做默认拦截器栈.再设置一个全局结果集,全局结果集的意思是:当用户试图绕过登录页面进入到主页时,拦截器会生效并返回ERROR.进而通过配置将浏览器页面定向到ErrorPage.jsp当中.另外一个关键点在于全局拦截器栈和局部拦截器的关系.如果定义了全局默认的拦截器栈.并且action标签当中没有定义任何拦截器,则这个action会默认使用全局拦截器栈,相反,如果在action当中定义了局部拦截器,则全局拦截器不会对这个action起效果.这对于登录拦截比较重要,假设所有action都使用全局拦截器栈,则用户将无法登录(因为拦截器会首先使用session进行判断,没有session则无法登录).
0 0
- Struts2登录拦截器的简单示例
- Struts2拦截器的简单示例
- Struts2拦截器简单示例
- Struts2拦截器简单示例
- 一个简单登录的Struts2的示例
- Struts2拦截器,简单的用户登录拦截及静态缓存的使用
- 复习Struts2之简单的登录示例
- STRUTS2 登录拦截器
- Struts2 自动登录的拦截器
- Struts2拦截器的应用:登录验证
- 配置Struts2的登录拦截器
- Struts2登录拦截器的使用
- struts2 简单登录校验示例
- struts2自定义拦截器示例
- struts2的拦截器的简单使用
- struts2拦截器--拦截未登录用户
- Struts2自定义拦截器:登录拦截
- struts2 拦截器 登录验证
- 《JavaScript DOM 编程艺术》读书笔记
- Cocos开发VR菜鸟宝典 第四讲:第一个VR漫游场景 - HelloWorld
- 线程
- SystemClock.sleep和Thread.sleep分析
- 第七条 避免使用终结方法
- Struts2登录拦截器的简单示例
- Android AsyncTask两种线程池分析和总结
- okHttp(二)官网翻译
- Android之项目中JNI调用已有的Android平台so库
- 保存图片到本地相册
- monkey测试
- 邮件营销:时间、资源和资金到底有多重要?
- 开源负载均衡通讯分发器(LB dispatcher) - G5
- Insertion Sort List(medium)