IT人生
专注于java相关技术.
posts - 53,comments - 87,trackbacks - 0

项目中一般需要做验证用户是否登陆,没登陆就不能进入ACTION执行后台代码等的需要。
这里根据以前经验我用两种方法做过验证,特记下供大家参考,有更好方法请留言。
第一种
为所有ACTION做一个BaseAction(此类 extends Action)
此类重载execute方法 ,部分实例代码 ,根据个人需要去定
   /**
     * override method.
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception
    {
        super.execute(mapping, form, request, response);

        //用户如果未登录或session过期,则转向登录动作。
        if (!isLogin(request))
            return mapping.findForward("login");

        try
        {
            ActionForward forward = doExecute(mapping, form, request, response);
           
            //重新生成token
            //super.saveToken(request);
            return forward;
        } catch (Exception e)
        {
            logger.error(e);
            e.printStackTrace();
           
            return mapping.findForward("systemError");
        }
    }

/**
     * 判断用户是否已经登录。
     *
     * @param request
     * @return
     */
    protected boolean isLogin(HttpServletRequest request)
    {
        return request.getSession().getAttribute(Session_User) != null;
    }

这样写后,以后所有ACTION都继承此类,然后重写doExecute方法即可
GradeAction extends BaseAction
在doExecute方法 写操作代码

第二种
也是做个BaseAction继承DispatchAction,然后所有ACTION继承此BaseAction
BaseAction主要代码片段
/**
     * override method.
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception
    { //用户如果未登录或session过期,则转向登录动作。
      if (!isLogin(request))
            return mapping.findForward("sessionEnd");
try
        {
           // ActionForward forward = new ActionForward();

            //重新生成token
            //super.saveToken(request);
       
            return super.execute(mapping, form, request, response);
        } catch (Exception e)
        {
           // logger.error(e);
            e.printStackTrace();
           
            return mapping.findForward("systemError");
        }
}
以后所有类继承此基类
LinkAction extends ActionX
由于DispatchAction特点,所有继承BaseAction的类都可以正常写单独方法完成。

至此两种验证见效。

转自:http://hi.baidu.com/nieweiguo/blog/item/9fee19d53cd761c751da4bb3.html
减肥瘦身品总汇     值得信赖*脉脉美妆*正品现货谢绝讲价     〓深港商盟〓名品欧衣坊(美国休闲品牌AF系列)     QQ三国游戏币及道具专卖店     小脸红红的瘦身旗舰店减肥瘦身品总汇     值得信赖*脉脉美妆*正品现货谢绝讲价     〓深港商盟〓名品欧衣坊(美国休闲品牌AF系列)     QQ三国游戏币及道具专卖店     小脸红红的瘦身旗舰店



减肥瘦身品总汇     值得信赖*脉脉美妆*正品现货谢绝讲价     〓深港商盟〓名品欧衣坊(美国休闲品牌AF系列)     QQ三国游戏币及道具专卖店     小脸红红的瘦身旗舰店
posted on 2009-05-26 08:53 龙华城 阅读(2707) 评论(7)  编辑  收藏

FeedBack:
# re: Struts1.2 验证用户是否登陆 两种方法(转)
2009-05-29 13:34 | zhong
加个filter如何?这样做可以避免把要过滤的action硬编码于类中,而且无需继承BaseAction。不知这个方法如何?  回复  更多评论
  
# re: Struts1.2 验证用户是否登陆 两种方法(转)
2011-05-05 14:59 | liangwu
嗯 用filter是一个好办法  回复  更多评论
  
# re: Struts1.2 验证用户是否登陆 两种方法(转)
2011-05-05 16:08 | liangwu
package com.gpPlatform.utils;
/* 检验管理员是否已经登录的过滤器*/
import java.util.List;
import java.util.ArrayList;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginCheckFilter implements Filter{

private static List<String> notFilterURL;

@SuppressWarnings("static-access")
public void init(FilterConfig filterconfig) throws ServletException{
this.notFilterURL= new ArrayList<String>();
notFilterURL.add("/gpplatform/adminLog.jsp");
notFilterURL.add("/gpplatform/errorPage.jsp");
notFilterURL.add("/gpplatform/testJDBC.jsp");
notFilterURL.add("/gpplatform/yzm.jsp");
notFilterURL.add("/gpplatform/script/trim.js");
}

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain)throws IOException, ServletException{
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponse response= (HttpServletResponse) res;
HttpSession session= request.getSession();

boolean flag= true;
String str= "/gpplatform"+request.getServletPath();

for(String url:notFilterURL){
if(str.equals(url)){
flag= false;
break;
}
}

System.out.println(str+" "+flag);

if(flag&&session.getAttribute("curr_admin")==null){
//对不在notFilterURL集合路径中的url进行过滤
System.out.println("<=====You haven't logged in!=====>");
response.sendRedirect("/gpplatform/adminLog.jsp");
}
else{
chain.doFilter(req, res);
return;
}
}

public void destroy(){}
}  回复  更多评论
  
# re: Struts1.2 验证用户是否登陆 两种方法(转)
2011-05-05 16:16 | liangwu
小弟初学java web开发,正在研究filter和listener。

以上是自己一个web工程的filter。通过设置一个不被过滤的url集合notFilterURL,实现在struts1中没有的interceptor所完成的功能。


  回复  更多评论
  
# re: Struts1.2 验证用户是否登陆 两种方法(转)
2011-06-02 17:25 | liangwu
/*增强版:利用spring容器初始化dao的bean,再用init方法获取系统context得到该dao从而实现RBAC模型下对动作权限的管理 */
package com.gpPlatform.utils;
/* 检验管理员是否已经登录及是否拥有权限的过滤器*/
import java.util.List;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;
import java.util.Date;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import com.gpPlatform.IConstants;
import com.gpPlatform.services.ResourceDao;
import com.gpPlatform.forms.AdminForm;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class SecurityCheckFilter implements Filter{

private List<String> notFilterURL;

private ResourceDao resourcedao= null;

private Map<String,String> permits;

private String getPermitId(String action_url){ //根据Map获取动作资源id
this.permits= resourcedao.getResourceList();
String rid_visited="NO_MATCH";
Set<String> key = permits.keySet(); //获取权限集map键集合
for(Iterator<String> it=key.iterator();it.hasNext();){
String k= it.next();
if(k.equals(action_url)){
rid_visited=permits.get(k);
break;
}
}
return rid_visited;
}

private boolean isPIdExist(AdminForm aform,String rid,boolean init){
boolean flag=!init;
if(!flag){
String[] pArray= aform.getPermitList();
for(String pid:pArray){
System.out.println(pid);
if(pid.equals(rid))
return true;
}
}

return flag;
}

public void init(FilterConfig filterconfig) throws ServletException{ //获取系统context以传递属性
String configpath= "F:/tomcat 5.5.2/Tomcat 5.5/webapps/gpplatform/WEB-INF/appContext.xml";
ApplicationContext context= new FileSystemXmlApplicationContext(configpath);
IConstants iconstant=(IConstants)context.getBean("constants");
resourcedao= (ResourceDao)context.getBean("resourcedao"); //不可setter直接注入,filter servlet容器先于spring生成
notFilterURL = iconstant.getNotFilterURL();

System.out.println("There are "+notFilterURL.size()+" urls free of filtering");
}

public void doFilter(ServletRequest req, ServletResponse res, //改写doFilter方法检验
FilterChain chain)throws IOException, ServletException{

HttpServletRequest request= (HttpServletRequest) req;
HttpSession session= request.getSession();
AdminForm aform= (AdminForm)session.getAttribute(IConstants.CURR_ADMIN_KEY);

boolean flag1= true;
boolean flag2= true;

String str= request.getServletPath();

if(str.indexOf(".jsp")!=-1||str.indexOf(".do")!=-1){
for(String url:notFilterURL){
if(str.equals(url)){
flag1= false;
break;
}
}
}
else
flag1= false;

if(str.indexOf(".do")!=-1&&request.getParameter("method")!=null&&!request.getParameter("method").equals("readInfo"))
str += "?method="+request.getParameter("method"); //获取一般的动作参数
else
flag2= false;

System.out.println("action str is "+str+" "+flag1+" "+flag2);
if(flag1){
if(aform==null){ //对不在免除过滤路径集合中的url进行过滤
System.out.println("<=======You haven't Logged in yet!=======>"+(new Date()).toString());
request.setAttribute(IConstants.LOGIN_ERROR_KEY, "抱歉,您还没有登陆本系统%>_<%");
request.getRequestDispatcher("/adminLog.jsp").forward(req, res);
}
else{
if(!this.isPIdExist(aform, this.getPermitId(str), flag2)){
System.out.println("<======You don't hava such permit!======>"+(new Date()).toString());
request.setAttribute(IConstants.PERMIT_ERROR_KEY,"抱歉,您不具备当前功能的权限⊙﹏⊙ ");
request.getRequestDispatcher("/errorPage.jsp").forward(req, res);
}
else{
chain.doFilter(req, res);
return;
}
}
}
else{
chain.doFilter(req, res);
return;
}
}

public void destroy(){}
}  回复  更多评论
  
# re: Struts1.2 验证用户是否登陆 两种方法(转)
2012-02-03 16:46 | v和vj
顶顶顶顶顶顶顶顶顶  回复  更多评论
  
# re: Struts1.2 验证用户是否登陆 两种方法(转)
2015-04-13 15:31 | asd
asd  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: