Struts2_08_Struts拦截器(模拟登录验证拦截)

这一篇,主要介绍自定义拦截器,

通过自定义的模拟登录验证拦截器来介绍:

只有当用户登录了,才能发送请求。不登录不能请求。

 首先定义一个User实体。属性:userName  password

定义service层的UserService

	public boolean login(User user) {
		if("12".equals(user.getUserName()) && "1234".equals(user.getPassword())){
			return true;
		}else {
			return false;
		}
	}

再定义UserAction:

public class UserAction extends ActionSupport{	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private User user = new User();
	private UserService userService = new UserService();
	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;
	}
	@Override
	public 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,这里注意获取session的方法

不通过,返回error.

定义拦截器:LoginInterceptor拦截器:

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("执行Action前");
		Map<String, Object> session = ActionContext.getContext().getSession();
		Object currentUser = session.get("currentUser");
		String result = null;
		if(currentUser!=null) {
			result = invocation.invoke();		
		}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;
	}

在执行UserAction前,先进行一下判断,看看session中是否currentUser.有说明已经登录了,没有说明未登录。

已经登录了,继续执行invocation.invoke();    

扫描二维码关注公众号,回复: 2754273 查看本文章

未登录,定义一个error信息,保存到request中,这里注意获取request的方法。

再struts.xml中:

<struts>
	<package name="user" extends="struts-default" >
		<interceptors>
			<interceptor name="loginInterceptor" class="com.java.interceptor.LoginInterceptor"></interceptor>
		</interceptors>
		<action name="user" class="com.java.action.UserAction">
			<result name="success">/success.jsp</result>
			<result name="error">/login.jsp</result>
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>
		<action name="hello" class="com.java.action.HelloAction">
			<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>

当请求不是验证登录时,要拦截。

请求界面:

<form action="user" method="post">
用户名:<input type="text" name="user.userName"/>
密码:<input type="password" name="user.password"/><br/>
<input type="submit" value="登录"/><font color="red">${error }</font>
</form>

现在想,如果很多请求时呢?要每一个请求后面都加两个拦截器吗?

定义一个拦截器栈,并把该栈设为默认的拦截器栈即可。

		<interceptors>
			<interceptor name="loginInterceptor" class="com.java.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>

此时两个action:

<action name="user" class="com.java.action.UserAction">
		<result name="success">/success.jsp</result>
		<result name="error">/login.jsp</result>
		<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="hello" class="com.java.action.HelloAction">
		<result name="success">/success.jsp</result>
		<result name="error">/error.jsp</result>
</action>

因为登录不需要拦截,所以要写拦截器栈。表示不用默认的拦截器栈

测试:

请求login.jsp时:

当输入密码错误时:

当未登录,请求hello时:

登录成功时:

在请求hello:

猜你喜欢

转载自blog.csdn.net/qq_27163329/article/details/81592730