首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

关于Struts2拦截器的相关有关问题。避免在地址栏直接执行Action

2013-01-11 
关于Struts2拦截器的相关问题。避免在地址栏直接执行Action本帖最后由 Javainging 于 2012-12-29 12:10:13

关于Struts2拦截器的相关问题。避免在地址栏直接执行Action
本帖最后由 Javainging 于 2012-12-29 12:10:13 编辑 之前系统开发的时候,没有考虑到用户不登陆,直接在浏览器输入action地址进行操作的情况。
例如:

对于如下链接:


http://localhost:8080/OrderS/trainInfo/delete.action?id=5


这样就直接删除了id为5的那个培训信息。后来用了拦截器,请问下,拦截器是不是每个package都要引入啊?
想问的是,如果他直接输入地址,我应该给他个警告信息,这个改咋判断呢。

<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>


是不是我以后的每个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>





LoginInterceptor 如下:

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();
}
}
}
}
}


struts interceptor action 地址栏
[解决办法]
在web.xml里面配置就行了。
[解决办法]
引用:
在web.xml里面配置就行了。

在web.xml里面配置一个自定义的Filter,在Filter中检查用户登录信息,没有就跳到登录页面
[解决办法]
用拦截器基本就是每个action都要配,提示很简单,比如没有登录让他跳到一个jsp,那个jsp里写个脚本提示后在跳到login.jsp
[解决办法]
引用:
引用:
用拦截器基本就是每个action都要配,提示很简单,比如没有登录让他跳到一个jsp,那个jsp里写个脚本提示后在跳到login.jsp我可以新建一个package,这个package放的都是一些拦截器。
 然后其他package继承这个package嘛,这应该就不需要每个package都写拦截器了吧??

写一个就够了,让默认的拦截器栈引用它,所有的action都引用这个拦截器栈,我也记不清了,这些都是前任写好的
[解决办法]
引用:
引用:
引用:引用:
用拦截器基本就是每个action都要配,提示很简单,比如没有登录让他跳到一个jsp,那个jsp里写个脚本提示后在跳到login.jsp我可以新建一个package,这个package放的都是一些拦截器。
 然后其他package继承这个package……

估计是前后台吧?只能让后台的继承package吧,前台不用了吧,只要你能明白原理,功能实现了,没有什么方法是不可以的。
[解决办法]
如果一个包中的大部分方法需要拦截,可以继承某个配有拦截器的包,里面的一小部分再另外进行单独声明
[解决办法]
引用:
引用:
在web.xml里面配置就行了。
在web.xml里面配置一个自定义的Filter,在Filter中检查用户登录信息,没有就跳到登录页面

赞同!
[解决办法]
有拦截器 还要filter 干啥 
如果是一个packet下面不是所有的action都需要进行拦截 那么 你这个登录拦截不能配置成全局的拦截器 

这样子的话,你需要进行登录拦截的action需要配置 一下登录拦截器
[解决办法]
当然 你可以把不需要登录的action放到一个单独的packet下面
[解决办法]
我们都直接写在action的类里:
/**
 * 用户员工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;
}

}


xml配置是多余的,访问action的每个方法,都必须通过这个拦截器

热点排行
Bad Request.