背景:如果用户登录后,可以访问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