关于Struts2拦截器的相关问题。避免在地址栏直接执行Action
本帖最后由 Javainging 于 2012-12-29 12:10:13 编辑 之前系统开发的时候,没有考虑到用户不登陆,直接在浏览器输入action地址进行操作的情况。
例如:
对于如下链接:
http://localhost:8080/OrderS/trainInfo/delete.action?id=5
<package name="SSH" namespace="/ssh" extends="struts-default">
<interceptors>
<interceptor name="login" class="com.xing.util.LoginInterceptor"></interceptor>
<interceptor-stack name="myLogin">
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myLogin"></default-interceptor-ref>
<global-results>
<result name="login" type="redirect">/admin/login.jsp</result>
</global-results>
<!--删除 信息 -->
<action name="deleteAction" class="com.xing.action.InstrumentAction"
method="delete">
<result name="success">/admin/instrument/success.jsp</result>
</action>
<!-- 超级管理员 删除 -->
<action name="deleteAction1" class="com.xing.action.NoticeAction"
method="delete">
<result name="success">/admin/notice/success.jsp</result>
</action>
<!-- 普通管理员 删除 -->
<action name="deleteAction2" class="com.xing.action.NoticeAction"
method="delete">
<result name="success">/manager/notice/success.jsp</result>
</action>
</package>
<interceptors>
<interceptor name="login" class="com.xing.util.LoginInterceptor"></interceptor>
<interceptor-stack name="myLogin">
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myLogin"></default-interceptor-ref>
<global-results>
<result name="login" type="redirect">/admin/login.jsp</result>
</global-results>
struts interceptor action 地址栏
public class LoginInterceptor extends AbstractInterceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String name = invocation.getInvocationContext().getName();
if(name.equals("login"))
{
//如果用户想登陆,则使之通过
return invocation.invoke();
}
else
{
ActionContext ac = invocation.getInvocationContext();
Map session = (Map)ac.get(ServletActionContext.SESSION);
if(session==null)
{
//如果session为空,则让用户登陆
return "login";
}
else
{
String adminname = (String)session.get("adminname");
if(adminname==null)
{
//session不为空,但是session中没有用户信息
//让用户登陆
return "login";
}
else
{
//用户已经登陆,登陆成功
return invocation.invoke();
}
}
}
}
}
/**
* 用户员工action
* @version 1.0
*/
@ActionBean(name = "/user", interceptor = "myInterceptor")
public class UserAction extends BaseAction {
private static final Logger log = LoggerFactory.getLogger(UserAction.class);
private static final String LIST = "/jsp/user/list.jsp";
private static final String ADD = "/jsp/user/add.jsp";
private static final String EDIT = "/jsp/user/edit.jsp";
private static final String PROMPT = "/prompt.jsp";
/**
* 员工列表
* @return String
*/
public String list() {
log.info("员工列表");
return LIST;
}
/**
* 添加员工
* @return String
*/
public String add() {
if ("save".equals(paramString(METHOD_NAME))) {
try {bean.setNamePY(UtilTool.getBean().getFirstPinyin(bean.getRealName()));
bean = mng.add(bean);
resetPage(OPERATE_RIGHT, "parent.getUsers();", "添加员工【" + bean.getRealName() + "】成功!");
} catch (Exception e) {
resetPage(OPERATE_ERROR, "", OPERATE_ERROR_MESSAGE);
}
return PROMPT;
}
setRequestAttr("company", companyMng.get(id));
return ADD;
}
/**
* 编辑员工
* @return String
*/
public String edit() {
if ("update".equals(paramString(METHOD_NAME))) {
try {
bean.setNamePY(UtilTool.getBean().getFirstPinyin(bean.getRealName()));
bean = mng.edit(bean);
resetPage(OPERATE_RIGHT, "parent.getUsers();", "编辑员工【" + bean.getRealName() + "】成功!");
} catch (Exception e) {
resetPage(OPERATE_ERROR, "", OPERATE_ERROR_MESSAGE);
}
return PROMPT;
}
bean = mng.get(id);
return EDIT;
}
/**
* 删除员工
* @return String
*/
public String del() {
try {
bean = mng.del(id);
resetPage(OPERATE_RIGHT, "parent.getUsers();", "删除员工【" + bean.getRealName() + "】成功!");
} catch (Exception e) {
resetPage(OPERATE_ERROR, "", OPERATE_ERROR_MESSAGE);
}
return PROMPT;
}
@MatchingBean
public UserMng mng;
private User bean;
public User getBean() {
return bean;
}
public void setBean(User bean) {
this.bean = bean;
}
}
/**
* 项目中的action拦截器
* @version 1.0
*/
@InterceptorBean(name = "myInterceptor")
public class MyInterceptor implements Interceptor {
private static final Logger log = LoggerFactory.getLogger(MyInterceptor.class);
public String advance(HttpServletRequest request, HttpServletResponse response) throws FrameworkException {
log.info("访问地址:" + request.getRequestURI());
System.out.println("你想怎样拦截,就把代码写在这儿吧");
return null;
}
}