返回

JavaWeb之利用Filter实现权限拦截小实战【过滤器】

发布时间:2022-12-14 23:35:32 305
# java# java# 服务器# 服务器

一.Filter实现权限拦截

1.1 重定向拦截

1.新建类servletLogin,继承类Httpservlet,重写方法doGet和doPost。

2.在web文件夹下新建文件jsp->login.jsp,作为权限测试登录页面。

配置form表单

<form action="/Filter_war_exploded/login" method="post">

    <input type="text" name="username">

    <input type="submit">

</form>

注意路径问题:要记得带项目目录前缀。方式选择Post方法。

3.在xml文件里注册路径,映射路径,代码如下:


<servlet>
    <servlet-name>servllogin</servlet-name>
    <servlet-class>main.java.servletlogin</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servllogin</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

4.在web目录下新建sys文件,里新建error和success文件,分别对应登录成功,和登录失败的提示语句。

5.在servletlogin里的重写doGet方法(注意:记得把doPost直接指向doGet)

获取到username的值:

String username = req.getParameter("username");

判断username的值,进行处理,重定向到不同的页面。

if(username.equals("admin")){
req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
    resp.sendRedirect("/Filter_war_exploded/sys/success.jsp");
}else{
    resp.sendRedirect("/Filter_war_exploded/sys/error.jsp");
}

2.1 注销拦截(回退)

1.在登录成功的页面下,新增加一个注销的按钮,指向logout目录:

<p><a rel="nofollow" href="/Filter_war_exploded/logout">注销</a></p>


2.写注销方法,新建类servletlogout,继承类HttpServlet,重写doGet方法“

Object user_session = req.getSession().getAttribute("USER_SESSION");

获取之前存储的Session的USER_SESSION的值赋值个对象中。

如果该对象值不为空说明,已经进行过登录操作了,我们将其值删除,并且将其重定向到登录页面:

if(user_session!=null){
    req.getSession().removeAttribute("USER_SESSION");
    resp.sendRedirect("/Filter_war_exploded/login.jsp");
}

2.2 登录成功页面BUG发现

我们发现项目启动后访问/Filter_war_exploded/login.jsp页面执行登录操作,如果我们输入为admin,会跳转到登录成功的页面如下:

image-20220903235644162

上图的页面路径为:

8080/Filter_war_exploded/sys/success.jsp

我们点击注销:会正常的返回到登录页面,没有问题。

image-20220903235728884

那么我们现在应该是处在未登录的状态,那么我们应该是进入不了登录成功页面的,但是我们直接在游览器里访问该路径:8080/Filter_war_exploded/sys/success.jsp会出现正常访问BUG。

image-20220903235912163

2.3 登录成功页面权限拦截(BUG解决)

1.在servlerlogiut中加入当值为空的重定向,避免页面卡死:

else{
    resp.sendRedirect("/Filter_war_exploded/login.jsp");
}

2.3.1 JSP解决方案

有一种解决方案是,直接在JSP文件里嵌入JAVA代码,在访问前检测一下对象的值是否为空,空的话执行重定向:

<%
    Object user_session = request.getSession().getAttribute("USER_SESSION");
    if(user_session==null){
        pageContext.forward("../login.jsp");
    }
%>

上面这段代码可以解决此BUG!

2.3.2 利用过滤器解决

1.新建类demoFilter,继承类Filter:implements Filter

2.重写其三个方法:创建和销毁不看,看中间的doFilter方法。

现将Request和Response强转为Httpservlet对象如下:

HttpServletRequest servletRequest1 = (HttpServletRequest) servletRequest;
HttpServletResponse servletResponse1 = (HttpServletResponse) servletResponse;

然后在获取到USER_SESSION的值:

Object user_session = servletRequest1.getSession().getAttribute("USER_SESSION");

如果在访问Filter过滤器的时候,发现其为空直接进行重定向:

if(user_session==null){
servletResponse1.sendRedirect("/Filter_war_exploded/login.jsp");
}

3.配置filter,如下因为我们的success在Sys文件夹下,所以我们直接过滤到:

/sys/*


    sysFilter
    main.java.demoFilter


    sysFilter
    /sys/*

4.记得在过滤器里配置链,否则会被卡住。

 filterChain.doFilter(servletRequest, servletResponse);

5.启动服务器,重新访问2.2发现的BUG,发现BUG被解决!

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
自定义RBAC(4) 2022-12-14 23:23:34