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

时间:2022-12-12 11:16:26

一.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,会跳转到登录成功的页面如下:

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

上图的页面路径为:

8080/Filter_war_exploded/sys/success.jsp

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

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

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

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

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/*

<filter>
    <filter-name>sysFilter</filter-name>
    <filter-class>main.java.demoFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sysFilter</filter-name>
    <url-pattern>/sys/*</url-pattern>

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

 filterChain.doFilter(servletRequest, servletResponse);

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