①浏览器地址栏中直接输入url访问action的问题
②过滤不想被拦截的方法
例如对于如下链接:
- http://localhost:8080/absSys/delete.action?id=1
直接在浏览器中提交上述地址,delete操作依然能执行!因此,必须对用户提交的请求进行拦截处理,如果用户没有登录,则跳转至登录页面。
一、浏览器地址栏中直接输入url访问action的问题
Struts2提供了拦截器,我们编写自己的拦截器的时候,只需要继承抽象类AbstractInterceptor,然后override intercept()方法就可以了。
- import java.util.Map;
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class LoginInterceptor extends AbstractInterceptor {
- private static final long serialVersionUID = 1L;
- public void destroy() {
- System.out.println("Destory");
- }
- public void init() {
- System.out.println("Init");
- }
- /**
- * @return result
- * */
- public String intercept(ActionInvocation invocation) throws Exception {
- System.out.println("action执行之前");
- String name = invocation.getInvocationContext().getName();
- System.out.println("请求方法:" + name);
- ActionContext ac = invocation.getInvocationContext();
- Map<String, Object> session = ac.getSession();
- boolean allow = name.equals("infolist") || name.equals("xwgg")
- || name.equals("pxdt") || name.equals("noticethrid")
- || name.equals("gqpx") || name.equals("gp")
- || name.equals("np") || name.equals("sp")
- || name.equals("wypx") || name.equals("zgks")
- || name.equals("shpx") || name.equals("fwxz")
- || name.equals("noticesec") || name.equals("filedown");
- if (name.equals("login") || allow) {
- // 如果用户想登陆,或者执行的是allow方法则不拦截,使之通过
- // invocation.invoke()继续运行拦截器后续的处理
- return invocation.invoke();
- } else {
- if (session.isEmpty() || session == null) {
- // 如果session为空,则让用户登陆
- return "login";
- } else {
- String userId = session.get("userId").toString();
- if (userId == null) {
- // session不为空,但是session中没有用户信息
- // 让用户登陆
- return "login";
- } else {
- // 用户已经登陆,登陆成功
- return invocation.invoke();
- }
- }
- }
- }
- }
二、过滤不想被拦截的方法
在默认的配置中,是拦截所有的方法,对于部分不需要拦截的方法,则需要进行特殊的处理。
LoginInterceptor类中:
- String name = invocation.getInvocationContext().getName();
这个name是获取请求的方法,由于,我们对部分方法可能不需要拦截,因此让其直接继续执行后续的处理操作。这种常见的情况是,我们前台首页的查询action,我们是不需要拦截的。我们可以将不需要拦截的方法定义在allow中,也可以定义在配置文件中。本文为了方便起见,定义了一个boolean的变量allow。
- if (name.equals("login") || allow) {
- return invocation.invoke();
- }
invocation.invoke();是继续执行后续操作。
三、修改Struts.xml配置文件,加入拦截器配置
Struts.xml配置如下:
- <package name="author" namespace="/author" extends="struts-default">
- <interceptors>
- <interceptor name="login" class="com.xxx.util.LoginInterceptor"></interceptor>
- <interceptor-stack name="loginCheck">
- <interceptor-ref name="login"></interceptor-ref>
- <interceptor-ref name="defaultStack"></interceptor-ref>
- </interceptor-stack>
- </interceptors>
- <default-interceptor-ref name="loginCheck"></default-interceptor-ref>
- <global-results>
- <result name="login" type="redirect">/login.jsp</result>
- <result name="illegal" type="redirect">/illegal.jsp</result>
- </global-results>
- </package>
这里需要说明一下的就是,对于这个拦截器的配置,可以加到需要拦截的package里面,也可以当度的放在一个package里面,然后其他的package继承我们的这个author package即可。
- <package name="User" namespace="/user" extends="struts-default,author">
ps: 同样也可以在指定的action中进行配置
- <interceptor-ref name="loginCheck"></interceptor-ref>
这个拦截器,但是这对每一个需要拦截的action都需要加入这个配置,对于大量的配置文件来说是比较繁琐的,因此我们只需定义一个package配置即可。
另外,对于拦截器方法过滤也可以继承 MethodFilterInterceptor这个类来实现.
转载自:http://blog.csdn.net/llhwin2010/article/details/8873034