目录:

Ⅰ 条件

Ⅱ 目的

Ⅲ 分析

Ⅳ 实现

Ⅴ 具体代码实现

--------------------------------------------------------------------------------------

一、条件
  1. 假设有个项目的目录如图一所示。(图一)
  2. 其中login.jsp和index.jsp是放在/WebRoot目录下的。其余的放在相应的文件夹里。
  3. 现在要求用户在未登录的情况下,只能进入login.jsp页面,如果登录了,就可以进入index.jsp和其它页面。
  4. 如果用户直接在地址栏上输入URI进行非法请求,既绕过登录验证直接访问其它内容页的话,将重定向页面到login.jsp页面。
(图一)
二、目的
  1. 防止用户直接输入URL绕过登录进行访问;

三、分析
  1. URL的形式有两种,一种是通过Struts2的*.action,另一种是jsp的*.jsp,都要对其进行控制。
  2. *.action形式的访问使用struts2的拦截器进行验证。
  3. *.jsp形式的访问使用Filter过滤器进行验证。
四、实现
  1. Filter的实现:
    ①. 获取请求的URI;并把该URI截取到访问的相对路径,可以通过这个来进行相应的权限控制。把最后的地址保存为uri;

       如:/ElectiveSystem/login.jsp ---截取---> /login.jsp
    ②. 判断uri是否为"login.jsp",如果是,直接放行;如果不是,那么就通过request.getSession()获取session,在通过session

       获取用户登录信息,如果登录信息为空,则重定向到login.jsp页面;如果不为空,那么就直接放行。

  2. Interceptor的实现(Struts2 的拦截器):
   ①. 通过invocation获取ActionContext对象。 (ActionContext context = invocation.getInvocationContext())
   ②. 再通过ActionContext对象获取HttpServletRequest对象。

(HttpServletRequest request  = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST))

   ③. 获取请求的URI;并把该URI截取到访问的相对路径,可以通过这个来进行相应的权限控制。把最后的地址保存为uri;

      如: /ElectiveSystem/admin/admin_login.action -->/admin/admin_login.action
   
④. 判断uri。
五、具体代码实现:

PowerFilter:

    @Override

public
void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

//取得根目录的绝对路径
        String currentURL = request.getRequestURI();
//        System.out.println("当前请求的路径: " + currentURL);
        //截取到访问的相对路径,可以通过这个来进行相应的权限控制
        currentURL =currentURL.substring(currentURL.indexOf("/", 1), currentURL.length());
//        System.out.println("当前请求的路径: " + currentURL);

if("/login.jsp".equals(currentURL)||"/login.jsp"==currentURL) {

//所有人都能请求到的URI,放行
            chain.doFilter(request, response);
        } else {    //下面是判断是否有session,也就是用户是否已登录状态;
            HttpSession session = request.getSession();
            Object obj = session.getAttribute("user");

if(obj == null) {

//System.out.println("URI:" + currentURL + ">>>>访问被拒绝!");
                response.sendRedirect("/ElectiveSystem/login.jsp");
            } else {
                chain.doFilter(request, response);
            }
        }
    }

PowerInterceptor:

    @Override

public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context = invocation.getInvocationContext();

//通过ActionContext来获取httpRequest
        HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST);

//也可以通过ServletActionContext来获取httpRequest
        //HttpServletRequest request = ServletActionContext.getRequest();
        //取得根目录的绝对路径
        String currentURL = request.getRequestURI();

//截取到访问的相对路径,可以通过这个来进行相应的权限控制
//      System.out.println("当前请求的路径: " + currentURL); // 如:  /ElectiveSystem/admin/admin_login.action
        String targetURL = currentURL.substring(currentURL.indexOf("/", 1), currentURL.length());
//      System.out.println("当前请求的路径: " + currentURL); //如:  /admin/admin_login.action

if("/admin/admin_login.action".equals(targetURL)||"/stu/stu_login.action".equals(targetURL)||"/th/th_login.action".equals(targetURL)){

//执行方法,获取返回值
            String result = invocation.invoke();

//System.out.println(result);

return result;
        }else{

//通过ActionContext获取session的信息。
            Object obj = context.getSession().get("user");

//获取容器里面的user值,如果存在说明该用户已经登录,让他执行操作,如果未登录让他进行登录

if(obj!=null){

return invocation.invoke();
            }
        }

return "input";
    }

Struts2实现登录权限访问控制的更多相关文章

  1. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  2. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  3. JavaWeb -- Struts 自定义拦截器, 登录权限拦截

    1. 自定义拦截器, 登录权限拦截 login.jsp 登录JSP <%@ page language="java" contentType="text/html; ...

  4. RBAC基于角色的权限访问控制

      RBAC是什么,能解决什么难题?ThinkPHP中RBAC实现体系安全拦截器认证管理器访问决策管理运行身份管理器ThinkPHP中RBAC认证流程权限管理的具体实现过程RBAC相关的数据库介绍Th ...

  5. MySQL 用户登录密码和远程登录权限问题

    1.mysql数据库,忘记root用户登录密码. 解决如下: a.重置密码 #/etc/init.d/mysqld stop #mysqld_safe --user=mysql --skip-gran ...

  6. MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库

    Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...

  7. [转]MYSQL远程登录权限设置

    Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录:   1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED B ...

  8. MYSQL远程登录权限设置(转)

    Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...

  9. MYSQL远程登录权限设置

    Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...

随机推荐

  1. 【GXZ的原创】平衡树性能测试

    本文作者为 GXZlegend ,转载请注明 出处 ,谢谢! 〇.序言 前些日子闲的蛋疼做了个平衡树性能测试... 主要是因为学会的平衡树越来越多,做题时却不知道写哪个... 本想结合效率和代码复杂度 ...

  2. android中常见的Drawable资源有哪些?

    Drawable资源是安卓应用中最常见的一种资源,比如图片等,因此,对于初学者而言,必须掌握drawable资源相关应用. 今天在网上刚好看到了一篇介绍android Drawable资源的文章,分享 ...

  3. hdu 1551 Cable master (二分法)

    Cable master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  4. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  5. 公路建设 (highway.c/cpp/pas)

    2.公路建设 (highway.c/cpp/pas) 在滨海市一共有 n 个城市,编号依次为 1 到 n,它们之间计划修建 m 条双向道路,其中 修建第 i 条道路的费用为 ci. 海霸王作为滨海市公 ...

  6. bzoj 2159 - Crash 的 文明世界

    Description 给定一棵\(n\le 10^5\)的树, 和\(k\le 150\) 求每个点\(x\)的\[S(x) = \sum_{y=1}^n dis(x, y) ^ k\] Analy ...

  7. JS 自定义时间格式化

    // 对Date的扩展,将 Date 转化为指定格式的String// 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位 ...

  8. 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---11

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  9. MYSQL的longtext字段能放多少数据?

    生产上遇到问题, 同事说MYSQL里的字段放不下5m大小的数据. 于是,将django model里textfield里的max_length变长了. 依然无效, 于是,更改mysql的设置: set ...

  10. POJ 2184 Cow Exhibition【01背包+负数(经典)】

    POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ...