日期:2014-05-17  浏览次数:20644 次

【求教】java web开发中拦截器的使用问题
我是大三的学生,刚入手的菜鸟,望高手勿喷,谢谢!


我写了一个自定义拦截器代码如下:
<interceptors>
<interceptor name="userInterceptor" class="com.unis.interceptor.UserInterceptor"></interceptor>
<interceptor-stack name="userInterceptorStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="userInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>

在操作的action里面都引用了userInterceptorStack,比如:
<action name="login" class="com.unis.action.LoginAction" method="login">
  <interceptor-ref name="userInterceptorStack"></interceptor-ref>
  <result name="success">/welcome.jsp</result>
  <result name="error">/login.jsp</result>
</action>

其中userInterceptor的代码如下:

public class UserInterceptor implements Interceptor{
public void destroy() {
// TODO Auto-generated method stub

}
public void init() {
// TODO Auto-generated method stub

}
public String intercept(ActionInvocation ai) throws Exception {
// TODO Auto-generated method stub
Object user=ActionContext.getContext().getSession().get("login");
if(user!=null)
{
return ai.invoke();
}
ActionContext.getContext().put("errorMessage", "请先登录");
return "index";
}
}


login是我JSP页面中传过来的一个session对象。

登陆页面login.jsp有一个:<%session.removeAttribute("login"); %>
登陆成功welcome.jsp有一个:
<jsp:useBean id="sessionName" scope="session" class="java.lang.String"></jsp:useBean>
<% 
if(sessionName.equals(""))
{
session.removeAttribute("login");
}
else
{
session.setAttribute("login","");
}
%>

sessionName是我后台传过来的放在session对象中登陆用户名

我现在的操作是:从浏览器的地址栏里直接进入welcome.jsp。这样肯定是操作不了的,要先登录。可问题是我有十多个JSP页面啊!我在welcome.jsp页面中有3个按钮,通向3个JSP页面。从地址栏里直接进入这些JSP页面,仍然可以操作,请问这问题该怎么解决?难道真的要在每个JSP页面用if else语句判断吗?有没有简单点的方法啊?
而且我不同的操作我写在不同的XML文件中的。麻烦帮我看看,谢谢了!







------解决方案--------------------
在配置文件中定义默认拦截器<default-interceptor-ref name="userInterceptorStack" />
这个默认拦截器放在拦截器栈和action配置的中间.
然后未登录时跳转页面配置为global-result : 
<global-results>
<result name="index">/login.jsp</result>
</global-results>
这个可以放在配置文件最前方.
这样子所有配置在这个配置文件下的action都会执行这个拦截器, 并且当未在session中找到用户时会跳转到/login.jsp页面上.
但是记得登陆action要将默认拦截器改掉, 不然登陆action也会跳转至这个登陆页面, 换句话说没法登陆了.
或者在拦截器类中修改代码判断ActionInvocation所访问的方法名是否登陆. 是的话直接执行invoke方法.