我们在一般论坛点击页面的时候,如果没有登录,就会跳转到其他页面,
这是怎么实现的?
可以用Struts1的action实现吗?

解决方案 »

  1.   

    在web.xml中进行如下设置<filter>
       <filter-name>access</filter-name>
       <filter-class>net.resume.web.AccessFilter</filter-class>
       <init-param>
       <param-name>access.config</param-name>
       <param-value>WEB-INF/access-config.properties</param-value>
       </init-param>
      </filter>
      <filter-mapping>
       <filter-name>access</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
    AccessFilter 类继承了 javax.servlet.Filter,下面是具体实现。。
    关键是doFilter类,其他的可根据个人习惯及想法实现。import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Properties;
    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 net.resume.Contants;
    import net.resume.model.User;
    import net.resume.service.ServiceException;
    import net.resume.service.ServiceFactory;
    import net.resume.service.ServicesConfigException;
    import net.resume.service.ServicesInstanceExcepption;
    import net.resume.service.UserServices;public class AccessFilter implements Filter {

    private Properties config ; public AccessFilter() {
    super();
    // TODO 自动生成构造函数存根
    } public void init(FilterConfig cfg) throws ServletException {
    config = new Properties();
    String filename = cfg.getInitParameter("access.config");
    filename = cfg.getServletContext().getRealPath(filename);

    try {
    config.load(new FileInputStream(filename));
    } catch (Exception e) {
    e.printStackTrace();
    throw new ServletException(e);
    } } public void doFilter(ServletRequest req, ServletResponse res,
    FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response  = (HttpServletResponse)res;

    String page = parse(request);

    String roleName = config.getProperty(page);

    //忽略没有登记授权的页面
    if(roleName==null){
    chain.doFilter(request, response);
    return;
    }

    //检查是否登陆用户
    if(!isLogin(request)){
    response.sendRedirect(config.getProperty("login.page"));
    return;
    }

    User user = getLoninUser(request);

    //验证是否有权限
    if(!hasRole(user, roleName)){
    response.sendRedirect(config.getProperty("access.error.page"));
    return;
    }

    chain.doFilter(request, response);
    }

    private boolean hasRole(User user, String roleKeys){

    boolean rv = false;
    try {
    ServiceFactory factory = ServiceFactory.getInstance();
    UserServices services = factory.getUserService();

    String[] roles = roleKeys.trim().split(",");

    for (int i = 0; i < roles.length; i++) {
    String roleKey = roles<i>;
    boolean hasRight = services.checkRole(user,roleKey);

    if(hasRight){
    rv = hasRight;
    break;
    }
    } } catch (ServicesConfigException e) {
    e.printStackTrace();
    } catch (ServicesInstanceExcepption e) {
    e.printStackTrace();
    } catch (ServiceException e) {
    e.printStackTrace();
    }

    return rv;
    } private User getLoninUser(HttpServletRequest request){
     
    return (User) request.getSession().getAttribute(Contants.LOGIN_USER);
    }

    private boolean isLogin(HttpServletRequest request) {
     
    User user = (User) request.getSession().getAttribute(Contants.LOGIN_USER);

    return user!=null;
    } private String parse(HttpServletRequest request) {

     
    StringBuffer url = request.getRequestURL();

    //String page = url.substring(url.indexOf())

    StringBuffer page = new StringBuffer();

    int count = 0;

    for(int i = 0; i<url.length(); i++){
    char c = url.charAt(i);

    if(c=='/')
    count++;

    if(count>=4)
    page.append(c);
    }

    page.deleteCharAt(0);

    return page.toString();
    } public void destroy() {
    // TODO 自动生成方法存根 }}楼主可以参考下 一上代码
      

  2.   

    楼上说的过滤器也可以 也可以用判断 
    在页面的最上面或者 <head> 标签内调用函数 或获得session 
    session 为空 和不为来判断 .. 
    <%
    if(session.getAttribute() == null){
        //跳转页面的代码
    }
    %>
    不过判断的方法我用的是脚本 不怎么好呢.. 
      

  3.   

    谢谢3楼的兄弟,Struts1里有类似的插件吗?
      

  4.   

    WEB-INF/access-config.properties
    这里面的内容可以贴出来看看吗?
      

  5.   

    用这个 上面那个麻烦了
    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 AuthFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
    FilterChain filterChain) throws IOException, ServletException {
    /** 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括
    *    表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过
    *    滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
    */HttpServletRequest request = (HttpServletRequest)servletRequest;
    /** 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中
    *    无法得到的方法,就要把此request对象构造成HttpServletRequest
    */
    HttpServletResponse response = (HttpServletResponse)servletResponse;String currentURL = request.getRequestURI(); //取得根目录所对应的绝对路径:String targetURL = currentURL.substring(currentURL.indexOf("/", 1),
    currentURL.length()); //截取到当前文件名用于比较HttpSession session = request.getSession(false);if (!"/login.jsp".equals(targetURL)) {
    //判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
    if (session == null || session.getAttribute("user") == null) {
    //*用户登录以后需手动添加session
    System.out.println("request.getContextPath()=" + request.getContextPath());
    response.sendRedirect(request.getContextPath() + "/login.jsp");
    //如果session为空表示用户没有登录就重定向到login.jsp页面
    return;
    }
    }
    //加入filter链继续向下执行
    filterChain.doFilter(request, response);
    /**   调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作
    *     为它 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另
    *     一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
    */
    }public void init(FilterConfig filterConfig) throws ServletException {}
    } <filter>
    <filter-name>AuthFilter</filter-name>
    <filter- class>com.drp.util.filter.AuthFilter</filter-class>
    </filter>
    <filter- mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>*.jsp</url- pattern>//表示对所有jsp文件有效
    </filter-mapping>
      

  6.   

    跟Struts无关,那个类可以直接用,你在web.xml里配置一下就好了。