struts2 自定义拦截器

背景:如果用户登录后,可以访问action中的所有方法。

         user.jsp {

         //设置用户为登录状态

         }

         如果用户没有登录,不允许访问action中的所有方法,并提示“您还没有登录,不能进行访问”

         quit.jsp{

         //设置用户退出登录

          }

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

    user.jsp   设置用户为登录状态

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.getSession().setAttribute("user","siln"); %>
<!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>
用户已经登录
</body>
</html>

    quit.jsp  设置用户退出登录

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.getSession().removeAttribute("user"); %>
<!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>
用户已经退出
</body>
</html>

    User.java

package cn.itcast.action;

public class User {
	
	private String message;

	public String AddUI() {
		
		this.message = "AddUI";
		return "success";
	}
	
	public String execute() {
		
		this.message = "execute";
		return "success";
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}

  

   拦截器类

package cn.itcast.interceptor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

@SuppressWarnings("serial")
public class PermissionInterceptor implements Interceptor {

	@Override
	public void destroy() {

	}

	@Override
	public void init() {

	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Object user = ActionContext.getContext().getSession().get("user");
		if(user != null) {
			return  invocation.invoke();	
		}
		ActionContext.getContext().put("message", "您还没有登录,不能进行访问");
		return "success";
	}

}

  invocation.invoke()作用:
  1.如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。

  2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<constant name="struts.action.extension" value="action,do"></constant>
	<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
	<constant name="struts.multipart.maxSize" value="10701096"></constant>
	<package name="base" extends="struts-default">
		<global-results>
			<result name="success">/WEB-INF/page/message.jsp</result>
		</global-results>
                </package>

		<package name="siln" namespace="/siln" extends="base">
		<interceptors>
			<interceptor name="permission"
				class="cn.itcast.interceptor.PermissionInterceptor" />
			<!-- 不要直接将自定义的拦截器给action使用,这样会失去struts2的核心功能,要使用拦截器栈,defaultStack放在前面先执行-->
			<interceptor-stack name="permissionStack">
				<interceptor-ref name="defaultStack" />
				<interceptor-ref name="permission"/>
			</interceptor-stack>
		</interceptors>
		<!-- 默认拦截器,该包内的所有action都会使用默认拦截器 -->
		<default-interceptor-ref name="permissionStack"/>
		<action name="user_*" class="cn.itcast.action.User" method="{1}">
		<!-- 若在此处显示调用拦截器,那么默认拦截器就不起作用了,
		若想默认拦截器起作用,自己的拦截器也起作用,那么就两个都引用在这里,将默认的放在前面 -->
                                		
		</action>
	</package>
</struts>    

   这样,拦截器就起作用了,若直接通过action调用,会提示用户“您还没有登录,不能进行访问”,只有先通过user.jsp给sessin设置了值之后,才能进行访问action


 

猜你喜欢

转载自slnddd.iteye.com/blog/1768157