一.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,会跳转到登录成功的页面如下:
上图的页面路径为:
8080/Filter_war_exploded/sys/success.jsp
我们点击注销:会正常的返回到登录页面,没有问题。
那么我们现在应该是处在未登录的状态,那么我们应该是进入不了登录成功页面的,但是我们直接在游览器里访问该路径:8080/Filter_war_exploded/sys/success.jsp
会出现正常访问BUG。
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被解决!