自定义拦截器实现对用户登陆的拦截,当用户没有登陆时跳转到登陆页面提示用户登陆,如果用户输入登陆信息错误提示用户登陆信息不匹配,如果成功跳转到首页。
代码实现:
jsp文件:
login.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>用户登录</title>
</head>
<body>
<s:fielderror></s:fielderror>
<form action="${pageContext.request.contextPath}/userAction_login" method="post">
用户名: <input type="text" name="username" /> <br/>
密码: <input type="password" name="password" /> <br/>
<input type="submit" value="登录" />
</form>
</body>
</html>
success.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>Insert title here</title>
</head>
<body>
${loginUser.username},欢迎登录
</body>
</html>
action类
package com.my.action;
import com.my.bean.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public String login(){
return "login";
}
public String index(){
return SUCCESS;
}
public User getModel() {
return this.user;
}
public void validateLogin() {
if("jack".equals(user.getUsername()) && "1234".equals(user.getPassword())){
//登录--session
ActionContext.getContext().getSession().put("loginUser", user);
} else {
//信息有误
this.addFieldError("username", "用户名与密码不匹配");
}
}
}
拦截器类,实现Interceptor接口,覆写intercept方法。
public class LoginInterceptor implements Interceptor {
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//如果session有数据则放行,没有数需要登录
Object userLogin = ActionContext.getContext().getSession().get("loginUser");
if(userLogin == null){
//需要登录
Object action = invocation.getAction();
if(action instanceof ActionSupport){
ActionSupport actionSupport = (ActionSupport) action;
actionSupport.addFieldError("username", "请登录");
}
return "input";
}
// 放行
return invocation.invoke();
}
@Override
public void destroy() {
}
}
在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="login" namespace="/" extends="struts-default">
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="loginInterceptor" class="com.my.interceptor.LoginInterceptor"></interceptor>
<!-- 编写自定义拦截器栈 -->
<interceptor-stack name="loginStack">
<!-- 先引用 父类的默认拦截器栈 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 将自己添加到 默认拦截器栈之后 -->
<interceptor-ref name="loginInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="userAction_*" class="com.my.action.UserAction" method="{1}">
<result name="login" type="redirectAction">
<param name="namespace">/</param>
<param name="actionName">userAction_index</param>
</result>
<result name="success">/success.jsp</result>
<result name="input">/login.jsp</result>
<interceptor-ref name="loginStack"></interceptor-ref>
</action>
</package>
</struts>
因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“permissionStack”/>把拦截器定义为默认拦截器。每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。
运行结果:
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/12073.html