项目中有两个文件夹
admin文件夹
student文件夹
实现权限管理
项目用Struts2+hibernate完成
我想要实现的是 前台有个登陆页面 可以选择 管理员登录 还是学生登录
管理员登录后 执行管理员的验证,并且只能访问admin文件夹下的jsp页面
 学生登录后执行学生的验证,只能访问学生的页面,访问其他也页面的话则提示没权限,或者错误,如果没有登录 直接访问文件的话 提示要登录,并且跳转到登陆页面。有的说用拦截器实现,有的说用过滤器实现,
有没个完整的例子呢?
网上找了些个例子 都不太适合
这个是我写的用于登陆的actionpackage com.yaxing.admin.action;import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.yaxing.domain.StudentInfo;
import com.yaxing.service.AdminServer;
import com.yaxing.service.AdminServerImpl;public class LoginAction {
private String userName;
private String userPassword;
private List<StudentInfo> listStudent;
private AdminServer adm = new AdminServerImpl();
private StudentInfo studentInfo;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public StudentInfo getStudentInfo() {
return studentInfo;
}
public void setStudentInfo(StudentInfo studentInfo) {
this.studentInfo = studentInfo;
}
@SuppressWarnings("unchecked")
public String studentLogin() throws Exception {
listStudent = adm.findByUser(getUserName(), getUserPassword());
if(listStudent.size()!=0){
           Map session = ActionContext.getContext().getSession();
   session.put("user",getUserName());
  
   return "studentLogin";
}
else 
return "input";
}
public String adminLogin() throws Exception {

return "adminLogin";
}
}这个是拦截器package com.yaxing.utils;import java.util.Map;import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class AuthInterceptor extends AbstractInterceptor {
@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception {
Map session = invocation.getInvocationContext().getSession();// jsp登录页面将用户登录的信息存在一个session中
// 这里是用拦截器的方法取得这个session
// LoginAction log = (LoginAction) invocation.getAction();//
// 获得被拦截的Action的引用,获得Action的控制权限
// System.out.println("拦截器信息:启动拦截器,拦截Action时间:" + new Date());
String result = invocation.invoke();// 执行Action或者下一个拦截器
// System.out.println("拦截器信息:Action执行完毕时间:!" + new Date());
String username = (String) session.get("user"); if (session.get("user") == null) // 判断session中有没有用户登录的信息,没有就返回login
{
ActionContext ac = invocation.getInvocationContext();// 获取ActionContext对象
ac.put("popedom", "您还没有登录,请登录!");
System.out.println("未登录用户!");
return Action.LOGIN; } else {
System.out.println("登录成功!!");
// return invocation.invoke(); // 若有登录信息就继续执行其他拦截器的代码
return result;
}

}
}
这个的就只是实现了登陆,
依然可以通过文件名来访问 也就是说 登陆和没登陆是一样的。

解决方案 »

  1.   

    在后台判断下权限。
    还有可以用security来实现
      

  2.   

    具体怎么实现呢?
    我下载了SpringSecurity 想快速的找个例子 在我这个项目中使用起来呢?
    谢谢。
      

  3.   

    我有个笨方法,就是新建一个auth.jsp,
    我登陆后的页面是一个framest 我把这个页面放在footer里引用的。
    登陆后这个auth.jsp只能放在一个footer页面中页面而且要禁止 登陆后的所有页面的刷新功能,这样auth.jsp里面就产生一个int变量值1.
    然后是这个auth.jsp里可以产生一个int的变量初始为零,保存这个值,在filter或interceptor里获取这个变量值。如果登陆成功后在filter或interceptor里让这个值就变成1,如果用户在用路径访问,在filter或interceptor判断这个值是否等于0,不等于回首页,等于也是首页
    哈哈,搞定。
    切记你的filter或interceptor必须拦截admin和student这个两个文件夹
    if(){
        获取int值判断
         这里在对这个值经行加加运算,如果登陆成功后用户在用路径访问这个值就不等于1了
         那么就让其回首页吧!
    }else{
       回首页
    }
      

  4.   

    struts2的拦截器只对action有效,没有登录直接访问jsp文件是可以直接访问的,可以通过加入过滤器来处理jsp访问
    package com.anxin.utils;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 com.anxin.domain.User;public class LoginFilter implements Filter {
    public void destroy() {
    System.out.println("-=-=-=-=***登录检查过滤器已经关闭***-=-=-=-=-=!");
    } public void doFilter(ServletRequest req, ServletResponse res,
    FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpReq = (HttpServletRequest) req;
    HttpServletResponse resp = ((HttpServletResponse) res);
    resp.setHeader("Pragma", "No-cache");
    resp.setHeader("Cache-Control", "no-cache");
    resp.setHeader("Cache-Control", "no-store");
    resp.setDateHeader("Expires", 0);
    System.out.println("-=-=-=-=***企业过滤权限***-=-=-=-=-=!");
    Object o = httpReq.getSession().getAttribute("user");
    if (null != o&&(((User) o).getUserLevel() == 16)) {
    System.out.println("userLevel="+((User) o).getUserLevel() );
    }else httpReq.getRequestDispatcher("/index.jsp").forward(req, res);
    chain.doFilter(req, res);



    }

    public void init(FilterConfig arg0) throws ServletException {
    System.out.println("-=-=-=-=***登录检查过滤器已经启用***-=-=-=-=-=!");
    }
    }然后在web.xml配置一下 <filter> <!-- 定义核心Filter的名字 --> <filter-name>LoginFilter</filter-name> <!-- 定义核心Filter的实现类 --> <filter-class> filter.LoginFilter </filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
      

  5.   

    这个确实可以实现。但是跳转到的那个login.jsp页面后显示不正常
    直接访问http://localhost:8080/StuMis/login.jsp 页面显示正常就是直接输入任意jsp页面后跳转到login.jsp页面 这个页面显示不正常。CSS JS 图片都没显示出来呢。~
    咋解决啊~
      

  6.   

     把你的jsp文件放在 web-inf目录中,这样就该jsp就不能通过路径访问到了,用一个filter 做登录过滤,在action中做页面转发控制
      

  7.   

    这样貌似不行的吧 
    web-inf 文件中放的都是些配置文件啊?
      

  8.   

    这几天试了 SpringSecurity 和 salasafe
    就是和我的项目集成的时候就是不成功 
    搞的好麻烦。
      

  9.   

     LoginAction log = (LoginAction) invocation.getAction();
      if(log.getUser()!=null){
      ActionContext ac = invocation.getInvocationContext();// 获取ActionContext对象
                ac.put("popedom", "您还没有登录,请登录!");
                System.out.println("未登录用户!");
                return Action.LOGIN;        } else {
                System.out.println("登录成功!!");
                return  invocation.invoke(); 
            }
      

  10.   

    http://blog.csdn.net/k10509806/archive/2011/04/28/6369131.aspx
    Spring Security3.1例子