防止未登录用户操作—基于struts2拦截器的简单实现
一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项。我还记得很久以前我的做法:在某个jsp页面中查看session中是否有值(当然,在用户登录逻辑中会将用户名或者用户对象存入session中),如果session中用户信息为空,那么redirect到登录页面。然后在除了登录页面外的其它所有需要验证用户已登录的页面引入这个jsp。
比如,我们将检查用户是否登录的代码放入一个jsp页面中,如checkUser.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%> <% Objectusername=session.getAttribute("username"); if(null==username){ response.sendRedirect("login.jsp"); } %>
登录页面为login.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>登录页面 用户登录
用户名:
密码:
假设登录成功后跳转到菜单页面menu.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%> <%@includefile="checkUser.jsp"%>菜单页 菜单1
菜单2
菜单3
菜单4
在其中引入了checkUser.jsp,这样当用户没有经过登录而试图访问menu.jsp页面时就会被强制转到login.jsp页面。
以上这种方法当然是可行的,可是太过丑陋和麻烦。后来,我学到可以把除了登录页面外的jsp或html页面放到WEB-INF目录下,这样用户就无法直接在浏览器中敲url来访问页面了。可是,如果有人通过某种方式得知我们的action名和方法名了呢?难道我们要在action的每个方法中,检查用户是否登录吗?这样子做光是想一想就觉得很蠢。好在我们有struts2拦截器。
先来看看怎样实现。
我们写一个拦截器类,让它继承MethodFilterInterceptor。
/** *@Title:LoginInterceptoe.java *@Description:拦截非登录用户请求 *@authorThinkPad *@version1.0 *@date2014年8月2日 */ packagecom.exam.interceptor; importcom.exam.utils.Constants; importcom.opensymphony.xwork2.ActionContext; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor; /** *@authorThinkPad * */ publicclassLoginInterceptorextendsMethodFilterInterceptor{ /** * */ privatestaticfinallongserialVersionUID=-4409507846064552966L; /*(non-Javadoc) *@seecom.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation) */ @Override protectedStringdoIntercept(ActionInvocationinvoker)throwsException{ //TODOAuto-generatedmethodstub ObjectloginUserName=ActionContext.getContext().getSession().get(Constants.USERNAME); if(null==loginUserName){ returnConstants.VIEW_LOGIN;//这里返回用户登录页面视图 } returninvoker.invoke(); } }
在struts.xml文件中填入:
goLogin,login
其中,
我在这里稍微总结下:
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类(也就是我们这里示例使用的拦截器类的做法)。你可以指定该拦截器拦截哪些方法(使用
),也可以指定该拦截器不去拦截哪些方法(
以上这篇防止未登录用户操作—基于struts2拦截器的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。