防止未登录用户操作—基于struts2拦截器的简单实现

网友投稿 291 2023-03-27


防止未登录用户操作—基于struts2拦截器的简单实现

一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项。我还记得很久以前我的做法:在某个jsp页面中查看session中是否有值(当然,在用户登录逻辑中会将用户名或者用户对象存入session中),如果session中用户信息为空,那么redirect 到登录页面。然后在除了登录页面外的其它所有需要验证用户已登录的页面引入这个jsp 。

比如,我们将检查用户是否登录的代码放入一个jsp页面中,如 checkUser.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%

Object username = session.getAttribute("username");

if(null == username){

response.sendRedirect("login.jsp");

}

%>

登录页面为 login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

用户名:

密码:

假设登录成功后跳转到菜单页面 menu.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ include file="checkUser.jsp" %>

在其中引入了 checkUser.jsp ,这样当用户没有经过登录而试图访问menu.jsp 页面时就会被强制转到 login.jsp 页面。

以上这种方法当然是可行的,可是太过丑陋和麻烦。后来,我学到可以把除了登录页面外的 jsp 或html 页面放到 WEB-INF 目录下, 这样用户就无法直接在浏览器中敲url 来访问页面了。可是,如果有人通过某种方式得知我们的action 名和方法名了呢?难道我们要在action的每个方法中,检查用户是否登录吗?这样子做光是想一想就觉得很蠢。好在我们有struts2 拦截器。

先来看看怎样实现。

我们写一个拦截器类,让它继承 MethodFilterInterceptor。

/**

* @Title: LoginInterceptoe.java

* @Description: 拦截非登录用户请求

* @author ThinkPad

* @version 1.0

* @date 2014年8月2日

*/

package com.exam.interceptor;

import com.exam.utils.Constants;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**

* @author ThinkPad

*

*/

public class LoginInterceptor extends MethodFilterInterceptor{

/**

*

*/

private static final long serialVersionUID = -4409507846064552966L;

/* (non-Javadoc)

* @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation)

*/

@Override

protected String doIntercept(ActionInvocation invoker) throws Exception {

// TODO Auto-generated method stub

Object loginUserName = ActionContext.getContext().getSession().get(Constants.USERNAME);

if(null == loginUserName){

return Constants.VIEW_LOGIN; // 这里返回用户登录页面视图

}

return invoker.invoke();

}

}

在struts.xml 文件中 填入:

goLogin,login

其中,goLogin,login 配置的过滤方法,意思是拦截器对其中的方法不起作用。在我这里, goLogin 是跳转到登录页面的方法。login 是验证用户名和密码的方法,在其中会将通过验证的用户名放入session中。没错,这就是我们需要做的全部事情了,是不是很方便呢?

我在这里稍微总结下:

1、在struts2 中,所有的拦截器都会继承 Interceptor 这个接口。

2、拦截器写好之后要在 struts.xml 文件中配置,如果该拦截器是用来拦截某个action的,那么,就在该action 的result 后面放入该拦截器。

   

     

           

             

               world 

            

         

   

         

          /register.jsp  

          /success.jsp   

            

        

       

 

3、如果我们没有添加拦截器,struts2 会为我们添加默认拦截器。而如果我们指定了拦截器,我们自己的拦截器就会取代默认的拦截器,那么我们就不能享受默认拦截器提供的一些功能。所以,一般我会把默认拦截器也加上。例如,在以上配置项中,action 里面再加上

4、Interceptor 接口有三个方法:init 、 destroy、intercept 。但一般我们不关心 init 和 destroy 方法。所以struts2 为我们提供了一个简化的拦截器类:AbstractInterceptor ,它实现了init 和 destroy 方法,我们只需实现 intercept 方法。

5、关于拦截器栈。可以把拦截器栈看成是一个“大”拦截器,里面由若干个拦截器组成。把它当成一个拦截器一样的引用。

6、方法过滤拦截器,需要继承 MethodFilterInterceptor 类(也就是我们这里示例使用的拦截器类的做法)。你可以指定该拦截器拦截哪些方法(使用method1,method2

),也可以指定该拦截器不去拦截哪些方法(method1,method2)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue中配置mint
下一篇:Java中类的加载顺序执行结果
相关文章

 发表评论

暂时没有评论,来抢沙发吧~