J2EE系列之Struts2学习笔记(十三)--自定义拦截器示例之登录功能实现
来源:互联网 发布:足球视频直播软件 编辑:程序博客网 时间:2024/05/29 09:18
上一篇博客中说了一点自定义拦截器的知识。这一篇记录一个自定义拦截器的应用示例,登录功能实现。
1.新建工程:SecondLearnStruts2Chap03;
2.新建一个com.test.model包,并在里面新建一个用户类User:
package com.test.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;}}
3.新建一个包com.test.service,并在里面新建一个类UserService,用来判断用户输入的用户名和密码信息是否正确:
package com.test.service;import com.test.model.User;public class UserService {public boolean login(User user){if("test".equals(user.getUserName()) && "123456".equals(user.getPassword())){return true;}else{return false;}}}
4.新建一个com.test.action包,并新建两个处理类:UserAction和GirlAction
UserAction:
package com.test.action;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.test.model.User;import com.test.service.UserService;public class UserAction extends ActionSupport{/** * */private static final long serialVersionUID = 1L;private UserService userService = new UserService();private User user;private String error;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String getError() {return error;}public void setError(String error) {this.error = error;}@Overridepublic String execute() throws Exception {if(userService.login(user)){ActionContext actionContext = ActionContext.getContext();Map<String, Object> session = actionContext.getSession();session.put("currentUser", user);return SUCCESS;}else{this.error = "用户名或者密码错误";return ERROR;}}}
这个类中,如果用户输入的用户名和密码都正确的话,就把用户信息存储到session中并返回success,否则的话返回error。
GirlAction:
package com.test.action;import com.opensymphony.xwork2.ActionSupport;public class GirlAction extends ActionSupport{/** * */private static final long serialVersionUID = 1L;@Overridepublic String execute() throws Exception {System.out.println("请求GirlAction成功");return SUCCESS;}}
5.新建一个拦截器loginInteceptor:
package com.test.interceptor;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;public class LoginInterceptor implements Interceptor{@Overridepublic void destroy() {// 拦截器销毁时调用System.out.println("LoginInterceptor销毁");}@Overridepublic void init() {// 拦截器初始化时调用System.out.println("LoginInterceptor初始化");}@Overridepublic String intercept(ActionInvocation invocation) throws Exception {// 拦截器处理逻辑System.out.println("在action执行之前");ActionContext actionContext = invocation.getInvocationContext();Map<String, Object> session = actionContext.getSession();Object currentUser = session.get("currentUser");String result = null;if(currentUser != null){result = invocation.invoke();//执行action中的响应函数}else{HttpServletRequest request = (HttpServletRequest)invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);request.setAttribute("error", "请先登录!");result = "error";}System.out.println("result="+result);System.out.println("在action执行之后");return result;}}
这个拦截器中首先判断session中是否存储了用户信息,如果没有代表用户还没有登录,把错误信息存储在request中并返回error。如果用户信息已经存在,则继续执行action中的响应函数。
6.配置struts.xml:
<struts> <package name="manage" namespace="/" extends="struts-default"> <interceptors> <interceptor name="loginInterceptor" class="com.test.interceptor.LoginInterceptor"></interceptor> </interceptors> <action name="user" class="com.test.action.UserAction"> <result name="success">success.jsp</result> <result name="error">error.jsp</result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <action name="girl" class="com.test.action.GirlAction"> <result name="success">success.jsp</result> <result name="error">error.jsp</result> <interceptor-ref name="loginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package></struts>
运行程序发现只有登录了之后才能够请求girl这个请求,否则都会跳转到error.jsp页面。
7.struts.xml配置文件的优化,这个才是写这篇博客的重点。
1.上面每个action中只要返回error,就会跳转到error.jsp页面。这里可以把跳转到error.jsp这个页面的result写成一个全局result;
<global-results> <result name="error">error.jsp</result> </global-results>
2.上面在请求girl的时候会被自定义的拦截器以及默认拦截器拦截,判断当前用户是否登录,只有用户登录后才能请求。如果有上百个请求的话,要引入上百个自定义拦截器以及默认拦截器,这样的话太麻烦。这里可以定义一个拦截器栈,把用到的拦截器都放在拦截器栈中:
<interceptors> <interceptor name="loginInterceptor" class="com.test.interceptor.LoginInterceptor"></interceptor> <interceptor-stack name="myStack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors>这里定义了一个拦截器栈myStack,并在拦截器中引入了自定义拦截器和默认拦截器栈。
3.自定义了拦截器栈还不行,还要在package中使用这个拦截器栈:
<default-interceptor-ref name="myStack"></default-interceptor-ref>
这样的话,package下面所有的action如果没有指定拦截器的话,就会默认使用这个自定义的拦截器栈了。
经过修改后,struts.xml文件为:
<struts> <package name="manage" namespace="/" extends="struts-default"> <interceptors> <interceptor name="loginInterceptor" class="com.test.interceptor.LoginInterceptor"></interceptor> <interceptor-stack name="myStack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"></default-interceptor-ref> <global-results> <result name="error">error.jsp</result> </global-results> <action name="user" class="com.test.action.UserAction"> <result name="success">success.jsp</result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <action name="girl" class="com.test.action.GirlAction"> <result name="success">success.jsp</result> </action> </package></struts>
注意:上面的user请求中指定了使用默认的拦截器,这样的话请求user时就只会使用指定的拦截器而不会使用package中指定的拦截器了。如果不指定的话,请求user时会被自定义的拦截器拦截,判断用户是否登录成功,刚开始当然没有登录,从而会一直停留在登录和error.jsp页面,这样的话就会永远登录不了了。
0 0
- J2EE系列之Struts2学习笔记(十三)--自定义拦截器示例之登录功能实现
- J2EE系列之Struts2学习笔记(十二)--自定义拦截器
- J2EE系列之Struts2学习笔记(二十三)--Struts2防重复请求
- J2EE系列之Spring4学习笔记(十三)--Spring4整合Struts2和Hibernate4
- Struts2学习笔记之自定义拦截器
- Struts2学习笔记之自定义拦截器
- J2EE系列之Hibernate4学习笔记(十三)-- -一对一映射
- J2EE系列之Struts2学习笔记(二十)--Struts2验证框架(自定义验证)
- J2EE系列之Struts2学习笔记(十八)--Struts2国际化
- J2EE系列之Struts2学习笔记(十一)--result配置
- Struts2基础之十三:Struts2拦截器
- Struts2学习(九)—拦截器之登录权限
- JAVA-Struts2学习之自定义拦截器
- J2EE系列之MyBatis学习笔记(十三)-- SSM框架搭建
- 黑马程序员---struts2学习笔记之六(自定义拦截器)
- Spring Boot 学习系列之拦截器,实现用户登录拦截
- J2EE系列之Struts2学习笔记(十九)--Struts2验证框架(内置验证)
- J2EE系列之Struts2学习笔记(一)--Struts2安装与配置
- mysql查询结果导出文件 excel 或者csv
- 新路程------windows虚拟机用cutecom注意事项
- Java线程池使用说明
- 【Android Studio】制作启动画面Splash Screen
- 启用SAP GUI FOR HTML
- J2EE系列之Struts2学习笔记(十三)--自定义拦截器示例之登录功能实现
- Spring整合JUnit【了解】【操作
- android开发问题1
- [炉石]2017杭州第五周实力赛记录
- Hibernate的命名查询(NamedQuery)
- mysql5.7 本地计算机上的mysql 服务启动后停止 的问题解决
- What Kind of Friends Are You?(字符串匹配)
- java的正则表达式
- JS中创建一个新的对象的方法